这也是用固件框架实现的一个程序,与其它几个块传输的例子相似。这个程序可以用控制面板来调试,也可以用Bulk.exe来调试。
第一,先看一下固件程序,在初始化函数TD_Init(void) 中先对程序用到的大端点初始化,接着准备两个OUT端点,最后对IN端点进行数据初始化(第一个数据为0x02,第二个数据为0x03,依次加1,共计512个数据),程序片断如下,
SYNCDELAY; // see TRM section 15.14
EP2CFG = 0xA2;
SYNCDELAY; //
EP4CFG = 0xA0;
SYNCDELAY; //
EP6CFG = 0xE2;
SYNCDELAY; //
EP8CFG = 0xE0;
// out endpoints do not come up armed
// since the defaults are double buffered we must write dummy byte counts twice
SYNCDELAY; //
EP2BCL = 0x80; // arm EP2OUT by writing byte count w/skip.
SYNCDELAY; //
EP4BCL = 0x80;
SYNCDELAY; //
EP2BCL = 0x80; // arm EP4OUT by writing byte count w/skip.
SYNCDELAY; //
EP4BCL = 0x80;
// fill up both IN endpoints
for (i=0;i<512;i++)
EP6FIFOBUF = i+2;
SYNCDELAY; //
EP6BCH = 0x02;
SYNCDELAY; //
EP6BCL = 0x00;
for (i=0;i<512;i++)
EP6FIFOBUF = i+2;
SYNCDELAY; //
EP6BCH = 0x02;
SYNCDELAY; //
EP6BCL = 0x00;
myBufferCount = 0;
// enable dual autopointer(s)
AUTOPTRSETUP |= 0x01;
}
第二,在程序实现函数TD_Poll(void) 中,主要有以下几个功能,
// if there is some data in EP2 OUT, re-arm it
if(!(EP2468STAT & bmEP2EMPTY))
{
SYNCDELAY; //
EP2BCL = 0x80;
}
如上的程序片断,端点2随时可以接受上位机发来的数据。
// if EP6 IN is available, re-arm it
if(!(EP2468STAT & bmEP6FULL))
{
SYNCDELAY; //
EP6BCH = 0x02;
SYNCDELAY; //
EP6BCL = 0x00;
}
如上的程序片断,端点6随时都有512 个数据准备向上位机发送。
// if there is new data in EP4FIFOBUF, then copy it to a temporary buffer
if(!(EP2468STAT & bmEP4EMPTY))
{
APTR1H = MSB( &EP4FIFOBUF );
APTR1L = LSB( &EP4FIFOBUF );
AUTOPTRH2 = MSB( &myBuffer );
AUTOPTRL2 = LSB( &myBuffer );
myBufferCount = (EP4BCH << 8) + EP4BCL;
for( i = 0x0000; i < myBufferCount; i++ )
{
EXTAUTODAT2 = EXTAUTODAT1;
}
SYNCDELAY; //
EP4BCL = 0x80; // re(arm) EP4OUT
}
如上的程序片断,主要是对端点4进行操作,如果端点4有上位机发来的数据,将数据暂时保存在数组myBuffer 中,myBuffer 是一个512字节的数组。
// if there is room in EP8IN, then copy the contents of the temporarty buffer to it
if(!(EP2468STAT & bmEP8FULL) && myBufferCount)
{
APTR1H = MSB( &myBuffer );
APTR1L = LSB( &myBuffer );
AUTOPTRH2 = MSB( &EP8FIFOBUF );
AUTOPTRL2 = LSB( &EP8FIFOBUF );
for( i = 0x0000; i < myBufferCount; i++ )
{
// setup to transfer EP4OUT buffer to EP8IN buffer using AUTOPOINTER(s) in SFR space
EXTAUTODAT2 = EXTAUTODAT1;
}
SYNCDELAY; //
EP8BCH = MSB(myBufferCount);
SYNCDELAY; //
EP8BCL = LSB(myBufferCount); // arm EP8IN
}
如上的程序片断,是对端点8进行操作。如果端点8为空,则将暂存在数组myBuffer中数据拷贝到端点8中。
程序还是比较简单的。
更多文章请访问:
我的博客1:http://bbs.ednchina.com/BLOG_liangziusb_440752.HTM
我的博客2: http://www.eefocus.com/liangziusb/blog/
EDN小组http://group.ednchina.com/GROUP_GRO_14600_3466.HTM
LZ3684 USB2.0开发板(CY7C68013A), 请访问我的淘宝http://shop64171919.taobao.com
LZ3014 USB3.0开发板(CYUSB3014),请访问我的淘宝http://shop64171919.taobao.com
实体店铺:北京新中发电子市场2557号
良子.2011年
沈阳市东陵区白塔街龙盛家园
欢迎交流:liangziusb@163.com
QQ:392425239
文章评论(0条评论)
登录后参与讨论