硬件程序烧录

1)因为本产品要求将二进制代码和硬件PID/VID烧录在EEPROM,而不是使用CYPRESS推荐的在线下载方式,所以外部采用了8K的EEPROM。上电后68013A会将EEPROM中的数据和程序加载到RAM中运行。

2)HEX文件只是68013A上8051的程序代码,还要加上PID/VID等信息才能正确运行,CYPRESS在开发包中提供了HEX2BIN.EXE这个工具,可以根据HEX生成完备的IIC文件,将此文件烧录到EEPROM上即可。

3)HEX2BIN.EXE的使用方法如下:

将XXX.HEX文件拷贝到HEX2BIN.EXE所在目录,打开CMD,按如下格式输入:

hex2bix -i -o xxx.iic xxx.hex -f 0xC2( -v 0x1234 -p 0x1234 )这个地方的PID VID 不用加,没有用,生成的IIC文件的pid vid 码是与hex文件相关,即有程序文件中设备描述符设定。

-i      表示输出文件,也就是IIC文件

-o       表示输入文件,也就是HEX文件

-f      表示68013A发送PID/VID的方式,这里为C0,即从EEPROM上读取。

-v   表示VID的BCD码,开发阶段使用1234

-p   表示PID的BCD码,开发阶段使用1234

4)将生成的IIC文件用烧写器烧录到EEPROM上,本项目使用的是深圳思泰佳电子公司的NSP通用烧写器,此烧写器不支持IIC类型,选择BIN类型可替代

固件调试完毕后,可以将其转化为IIC文件烧写到EEPROM中,采用C2方式启动,这样68013就会从EEPROM中获取程序和VID、PID,不需要每次上电都下载固件了。

首先需要将KEIL编译好的hex文件转化为iic文件,可以使用cypress提供的hex2bix,格式如下:

Hex2bix -i -f 0xC2 -o usb_sfifo.iic usb_sfifo.hex

-i表示要生成iic文件,-f表示烧写后采用C2方式启动(程序、VID、PID都从EEPROM读取),后面依次是要生成IIC文件的文件名和源文件的文件名,关于其他参数的用法可以参见hex2bix的帮助。

通过USB连接到计算机后,通过Cypress USB Console即可烧写。打开EZ-USB Interface,点击Lg EEPROM,然后选择刚才生成好的IIC文件可以。

需要注意的是在硬件上不同容量的EEPROM接法是不一样的,否则烧写之后也无法启动。如下图所示,大容量EEPROM的A0管腿需要上拉。


另外需要注意的是SCL SDA需要上拉,否则也会出现读取问题。

1.先把68013与EEPROM连接的I2C的SDA断开。 
       2.插上USB线连接电脑 
      3.启动软件 
      4.把68013与EEPROM连接的I2C的SDA连上 
      5.在USB CONSOLE上点lg eeprom就可以下载了  
      相当于开始的时候68013没有EEPROM设备,EEPROM用片内存储的描述符数据进行枚举。 
主机就通过这个自动的描述符同68013进行通信。接着连上把68013与EEPROM连接的I2C的SDA连上,

4.3    驱动的识别

1)将EEPROM连到 68013A 上后,接上USB线,上电。计算机提示找到新硬件,要求安装驱动。

2)CYPRESS针对 68013A 提供了全新的驱动程序CYUSB.SYS。这个驱动使用了新的API,所以上位机的编写上和旧的方式完全不同。底层的IOCTL控制字的定义也完全不同,详见CYAPI.PDF和CYUSB.PDF。

3)安装驱动之前,必须先根据VID/PID正确编辑CYUSB.INF文件,在文件中添加自己的PID/VID代码和设备描述,连接设备时,将根据硬件上的PID/VID查找INF文件中对应的驱动,如果找不到,在设备管理器中将显示“68013 EEPROM MISSING”的字样。

4)详细的INF配置方法参考CYUSB.PDF PART1/PART2/PART3。这里不在赘述。

5)安装驱动时候找到修改好的CYUSB.INF文件,驱动将被正确安装,此时设备可以正常使用。

4.4    测试过程

1)被正确识别的设备可以在CYPRESS CONSOLE上看到设备信息。如图:

2)CYPRESS CONSOLE的具体使用方法请参考CyConsole.chm。

3)要注意的是,除EP0/EP1外,当其他端点Max Pkt Size大小为64字节时,表示工作在USB 1.1模式,有可能是软件的原因,也有可能是外围上拉电阻的问题。开发中要特别注意。

5.   推荐开发流程

5.1 看本介绍USB 2.0协议的书,对USB 2.0协议有所了解。推荐《USB 2.0原理与工程开发》

5.2 看CYUSB.PDF文档。了解驱动安装方法。

5.3 看KEIL C51的书籍,熟悉C51的编程方法,熟悉KEIL C编程环境。

5.4 看CYPRESS提供的例程,了解 68013A 编程框架。推荐《EZ-USB 2100系列单片机原理、编程及应用》(基本框架类似,部分寄存器定义不同)。

5.5 对照USB 2.0协议,编写dscr.a51文件,配置各种描述符。

5.6 结合FX2 TechRefManual.pdf,研读FW.C、PERIPH.C、FX2REGS.H、FX2.H,了解寄存器的定义。

5.7 根据系统需求编写响应代码,有开发板时,根据开发版上的LED来测试程序正确与否。

5.8 根据CYAPI.PDF CYUSB.PDF编写上位机通讯程序。

同步读取数据方法      XferData();

异步读取数据方法                 BeginDataXfer()/WaitForXfer()/FinishDataXfer();

5.9 调试程序。

5.10               编写其他8051上的程序,并继续调试。

6.   发布时应提供的文件

1)CYUSB.SYS

2)CYUSB.INF

3)XXX.IIC

7.   重点讲解

7.1    如何理解CYPRESS 68013A 程序框架

CYPRESS提供了非常好的程序框架,免去了用户自己编写一些通用性比较强、模式化的程序(如果不提供,很少有人能写出如此高效,结构紧凑的程序,实际上此框架和 68013A 内部结构关系密切,一般人也没有足够的内部资料也不可能写出来)。在框架的基础上,用户只需在相应的地方写相应的代码即可完成USB工作。

一般来说框架可以分成3个部分。

1)              描述符文件。例如dscr.a51文件,里面定义了枚举设备的时候要用的各种描述符信息,这部分用户需要根据实际的情况自己编写。我写的时候发现一个最大的问题就是各种书籍协议版本不同,翻译质量不同,同一字段的意义表述不同,容易让人产生困惑。例如USB 1.1/2.0/2.13对设备类型的子类定义都不完全相同,所以写的时候最好几种文档对比起来写。由于USB官方网站的文档中字段解释过于专业化,所以对USB不是很熟悉的人比较难以理解其真正含义。所以要多参考不同的书籍,某种程度上降低了开发速度,但对第一次做USB开发的人来说,这也是值得的。

2)              固件文件,例如FW.C文件,这是硬件程序的函数入口。主要有以下这些方法:

void SetupCommand(void);     //握手命令处理

void TD_Init(void);   //初始化,完成配置,启动时调用一次

void TD_Poll(void);   //用户处理程序,循环调用

void IO_Init(void);   //8051 IO初始化

void REG_Init(void); //8051寄存器初始化

BOOL TD_Suspend(void);    //挂起处理

BOOL TD_Resume(void);     //唤醒处理

//以下为各种描述符的获取和设置函数,重枚举时自动调用

BOOL DR_GetDescriptor(void);

BOOL DR_SetConfiguration(void);

BOOL DR_GetConfiguration(void);

BOOL DR_SetInterface(void);

BOOL DR_GetInterface(void);

BOOL DR_GetStatus(void);

BOOL DR_ClearFeature(void);

BOOL DR_SetFeature(void);

BOOL DR_VendorCmnd(void);

3)              功能文件,处理各种中断。例如PERIPH.C文件。8051一般默认只有四个中断,这显然不够USB使用,所以CYPRESS引入了自动向量的概念,相当于软中断,大大扩展了现有的中断数量。主要的中断有:

void ISR_Sudav(void) interrupt 0 //收到setup包

void ISR_Sutok(void) interrupt 0 //收到SETUP令牌

void ISR_Sof(void) interrupt 0 //收到起始帧

void ISR_Ures(void) interrupt 0 //收到RESET

void ISR_Susp(void) interrupt 0 //收到挂起信息

void ISR_Highspeed(void) interrupt 0 //高速模式

void ISR_Ep0ack(void) interrupt 0   //正常响应ACK

void ISR_Stub(void) interrupt 0

void ISR_Ep 0in (void) interrupt 0

void ISR_Ep0out(void) interrupt 0

void ISR_Ep 1in (void) interrupt 0

void ISR_Ep1out(void) interrupt 0 //EP1输入中断

void ISR_Ep2inout(void) interrupt 0     //EP2中断

void ISR_Ep4inout(void) interrupt 0

void ISR_Ep6inout(void) interrupt 0

void ISR_Ep8inout(void) interrupt 0

void ISR_Ibn(void) interrupt 0

void ISR_Ep0pingnak(void) interrupt 0

void ISR_Ep1pingnak(void) interrupt 0

void ISR_Ep2pingnak(void) interrupt 0

void ISR_Ep4pingnak(void) interrupt 0

void ISR_Ep6pingnak(void) interrupt 0

void ISR_Ep8pingnak(void) interrupt 0

void ISR_Errorlimit(void) interrupt 0

void ISR_Ep2piderror(void) interrupt 0

void ISR_Ep4piderror(void) interrupt 0

void ISR_Ep6piderror(void) interrupt 0

void ISR_Ep8piderror(void) interrupt 0

void ISR_Ep2pflag(void) interrupt 0

void ISR_Ep4pflag(void) interrupt 0

void ISR_Ep6pflag(void) interrupt 0

void ISR_Ep8pflag(void) interrupt 0

void ISR_Ep2eflag(void) interrupt 0

void ISR_Ep4eflag(void) interrupt 0

void ISR_Ep6eflag(void) interrupt 0

void ISR_Ep8eflag(void) interrupt 0

void ISR_Ep2fflag(void) interrupt 0

void ISR_Ep4fflag(void) interrupt 0

void ISR_Ep6fflag(void) interrupt 0

void ISR_Ep8fflag(void) interrupt 0

void ISR_GpifComplete(void) interrupt 0

void ISR_GpifWaveform(void) interrupt 0

特别是对于接受数据,一般都在中断中完成相应处理,“中断中适合进行少量简短的操作,不适合进行复杂操作”,这句话在此依然有效。如果要进行复杂的操作可以在TD_POLL()中进行(多数操作都是在这个函数中完成的)。

另外非常重要的一点是,中断程序的结尾应该让中断复位,允许下一次中断,有些端点的计数器也要清零并允许接受新的中断请求。例如:

EP1OUTBC = 0; //清空计数

EZUSB_IRQ_CLEAR(); //USB中断复位

EPIRQ = 0x08;     //允许EP1中断请求

7.2     68013A 端点寄存器介绍

68013A 内部的寄存器约有300个上下,一次都记住是不可能的,而且每个寄存器都有8个位,也就是说一共有2000多个可以配置的位,一次都理解掌握这些位的含义也是不可能的,所幸地是开发中并不会用到所有的寄存器,但是依然强烈建议把FX2REGS.H和FX2.H走读一边,这就像读书一样,没有学会识字,再看都是天书。结合FX2 TechRefManual.pdf走读这些寄存器大约需要一到两天时间,这点时间投入还是值得的。

在通讯过程中,打交道最多的是各种端点寄存器,掌握好这些寄存器地使用对提升开发效率是很有帮助。值得特别关注的寄存器和配置位如下:

Rwuen、REVCTL、EP1OUTCFG、EP1INCFG、EP2CFG、EP4CFG、EP6CFG、EP8CFG、EP2FIFOCFG、EP4FIFOCFG、EP6FIFOCFG、EP8FIFOCFG、FIFORESET、EPIRQ、EPIE、EP1OUTBC、APTR1H、APTR 1L 、EXTAUTODAT1、AUTOPTRH2、AUTOPTRL2、EXTAUTODAT2、EP2BCH、EP2BCL

其中有些寄存器的设置需要连续设置多次,看似重复了,其实不然,这和设置的缓冲区数量有关。有些寄存器中间必须用SYNCDELAY来延时。这类寄存器FX2 TechRefManual.pdf上有说明。

对于EP0,用于系统握手,相关的寄存器操作基本上都由 68013A 的内核(SIE)来完成了。

对于EP1,分为OUT/IN两组配置和寄存器。

对于EP2~EP8,不分OUT/IN输入输出,主要有EP2CFG/ EP2FIFOCFG/ EP2BCH/EP2BCL寄存器。

7.3    什么是自动指针

自动指针是CYPRESS提供的一个非常有用的特性。在数据交互的过程中,很多时候都涉及到数据的搬迁,比如从EP2OUT收到的数据需要转发到EP 6IN 上(一些转换类设备);再比如从RAM中拷贝数据到EP 4IN 上,传统的做法是申明两个指针,指向源和目的地址,然后用循环一个个字节拷贝,同时还要考虑增加指针地址,对于连续的空间这到不是问题,关键是如果数据需要拷贝到多个缓冲时,指针地址是循环的。这时候如果手工完成操作很容易出错。

因此CYPRESS提供了两组自动指针,用的时候一组指向源,一组指向目的地址。然后循环拷贝数据就行了,自动指针会自动指向下一个源或目的空间,不论是否是循环地址方式。这样减少了程序出错的几率。

下面的程序将EP2OUT接受到的数据拷贝到EP 6IN 发送出去:

if(!(EP2468STAT & bmEP6FULL))

{ // check EP6 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is full

APTR1H = MSB( &EP2FIFOBUF );

APTR 1L = LSB( &EP2FIFOBUF );

AUTOPTRH2 = MSB( &EP6FIFOBUF );

AUTOPTRL2 = LSB( &EP6FIFOBUF );

count = (EP2BCH << 8) + EP2BCL;

// loop EP2OUT buffer data to EP 6IN

for( i = 0x0000; i < count; i++ )

{

// setup to transfer EP2OUT buffer to EP 6IN buffer using AUTOPOINTER(s)

EXTAUTODAT2 = EXTAUTODAT1;

}

EP6BCH = EP2BCH;

SYNCDELAY;

EP6BCL = EP2BCL;        // arm EP 6IN

SYNCDELAY;

EP2BCL = 0x80;          // re(arm) EP2OUT

}

}

APTR1H/APTR1H通过MSB和LSB获取EP2FIFOBUF的高位地址和地位地址。

EXTAUTODAT1表示APTR1H/APTR1H指向的数据。

AUTOPTRH2/AUTOPTRL2通过MSB和LSB获取EP6FIFOBUF的高位地址和地位地址。

EXTAUTODAT2表示AUTOPTRH2/AUTOPTRL2指向的数据。

7.4    CYUSB和CYAPI的关系

以前68013上位机程序的编写过程中,应用程序端通过调用DeviceIoControl() API或CREATEPIPE() API与驱动进行交互,继而读写控制硬件设备,在新的 68013A 的驱动中采用了两种新的调用方法:

第一种是继续使用DeviceIoControl()函数读写,不同的是,IOCTL控制字和老驱动完全不同,具体定义参考CYUSB.PDF。用户可以通过这些底层API完成操作。

第二种是使用CYPRESS提供的面对对象的类,一共有9个类,调用这些类的方法就可以和硬件打交道。这些类是对第一种方法的封装,使用起来非常简便。

用户可以根据需要选择这两种方法或混合使用,使用时需要加上头文件CyAPI.h和cyioctl.h,另外在项目中还要引用CyAPI.lib。

7.5    同步和异步读写的比较

CYAPI提供了同步和异步读写方式。同步方式的时候调用线程阻塞在哪里,直到读写到数据或超时;异步方式的时候调用线程立即返回。具体实例参考CYAPI.PDF。

7.6    如何用C++ BUILDER写上位机程序

1)            首先确定使用7.4中的第几种方法,添加相应的头文件和库文件。

2)            连接USB设备,确保驱动已经被正确加载。

3)            编写收发数据线程。通过开发板上的LED或CYPRESS CONSOLE或BUS HOUND分析收发正确与否。

7.7    U盘如何正确加载驱动

在WINDOWS 2000/XP上U盘使用的PID/VID应该直接能加载操作系统默认的海量存储器的驱动程序。为了使用正确的PID/VID,可以通过以下途径:

1)            找一个现有品牌的U盘,看看他的PID/VID是何值。

2)            在注册表中查找海量存储器信息。

8.   其他问题

1)            编写上位机的时候要注意添加异常处理。

2)            调试上位机的时候,USB外设应正确连接。

3)            8051其他模块的编写请参考相应书籍

26.68013 烧录方式 及iic生成的更多相关文章

  1. atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29

    atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29 1. 三 绑定方式的介绍1 2. To接口,链式绑定,用的最多的1 3. toC ...

  2. 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置

    1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...

  3. 单片机ISP、IAP和ICP几种烧录方式的区别

    单片机ISP.IAP和ICP几种烧录方式的区别 玩单片机的都应该听说过这几个词.一直搞不太清楚他们之间的区别.今天查了资料后总结整理如下. ISP:In System Programing,在系统编程 ...

  4. 两种方式实现java生成Excel

    Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...

  5. django模板传入参数的处理方式与反向生成url

    前端模板传入参数的处理方式 1.传入单个参数: 前端使用href="/sel-{{ row.0 }}.html, url使用url(r'sel-(.+).html',home.index), ...

  6. Centos7.5 mysql5.7.26二进制安装方式

    1    yum安装所需相关依赖包. yum -y install gcc-c++ yum -y install zlib zlib-devel pcre pcre-devel yum -y inst ...

  7. hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)

    绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...

  8. Linux 命令行生成密码的 10 种方式

    内容来自: 10 Ways to Generate a Random Password from the Linux Command Line Linux 好玩的事儿是达成一件事情可以用上百种方式. ...

  9. CobalStrike 4.0 生成后门几种方式 及 主机上线后基础操作

    出品|MS08067实验室(www.ms08067.com) 本文作者:BlackCat(Ms08067内网安全小组成员) CobalStrike 4.0 生成后门几种方式 步骤:Attacks-〉P ...

随机推荐

  1. python 标准库获取网络信息

    c语言ioctl定义的常量 /usr/include/x86_64-linux-gnu/bits/ioctls.h /* Copyright (C) 1996-2015 Free Software F ...

  2. angular $apply()以及$digest()讲解1

    一些知名的批评和缺陷.他们都涉及到$digest loop(更新周期)中一个很常见的问题:如何在Angular之外更新$scope? 在哪调用 $apply? 更佳的做法是确保你是在$digest l ...

  3. PHP超时处理全面总结(转)

    [ 概述 ] 在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 2. 为了保证Web服务器不会因为当个页面 ...

  4. .NET验证码控件(美观 易用)

    新建一般处理程序:veify.ashx <%@ WebHandler Language="C#" Class="verify" %> using S ...

  5. JQuery.tmpl()的用法

    动态请求数据来更新页面是现在非常常用的方法,现在通过Ajax请求返回的数据更多的是json对象, 为了解决js动态拼接数据这方面的问题,JavaScript 也可以利用模版来解决这些问题,比如基于 j ...

  6. Winform菜单之ContextMenuStrip

    ContextMenuStrip实际就是上下文菜单,就是右键单击某个窗体或者控件后出来的菜单. 从工具栏里拖一个出来放在窗口上就行 然后进行一系列的设置,设置方法跟前面的MenuStrip基本是一样的 ...

  7. 配置Nginx服务

    一,安装之前准备1.nginx依赖: gcc openssl-devel pcre-devel zlib-devel    安装依赖:yum install gcc openssl-devel pcr ...

  8. jQuery在HTML文档加载完毕后自动执行某个事件;

    原来onchange=“fucntionname(parms)”: <select name="country" id="selCountries_{$sn}&qu ...

  9. Lua 多维表的遍历中的赋值

    说到Lua的遍历将要使用到循环:先说遍历再说循环: 遇到这样类似结构的一个table Data={ []={p1=,pa={,,}}, []={p1=,pa={,,}}, []={p1=,pa={,, ...

  10. PHP生成二维码库phpqrcode

    Description PHP QR Code is open source (LGPL) library for generating QR Code, 2-dimensional barcode. ...