阅读:1413回复:6
68013的固件问题,高手进来讨论一下!我写的固件是把从端点2(OUT)的数据通过自动指针输入到内存地址0x2800中去,代码如下: TD_Poll() { if(!(EP2468STAT & bmEP2EMPTY)) { APTR1H = MSB( &EP2FIFOBUF ); APTR1L = LSB( &EP2FIFOBUF ); AUTOPTRH2 = 0x28;//MSB( &EP6FIFOBUF ); AUTOPTRL2 = 0x00;//LSB( &EP6FIFOBUF ); count = (EP2BCH << 8) + EP2BCL; for( i = 0x0000; i < count; i++ ) { // setup to transfer EP2OUT buffer to EP6IN buffer using AUTOPOINTER(s) EXTAUTODAT2 = EXTAUTODAT1; } EP2BCL = 0x80; } } 由于TD_Poll是循环执行的,当我将1024个字节的数通过控制面板发到端点2(大小为512字节)时,应该先下载前512字节,等端点2重装载之后再下载后512字节 ,也就是这个循环应该是执行了两次才对。第二次循环过程中,我的AUTOPTR地址应该还是0x2800,应该把前面的512字节冲掉了才对。但我用端点6(IN)从内存空间读回时,又发现发的1024个字节的数都是对的,这是怎么回事呢?大家来讨论一下,是否我的理解有误呢? |
|
最新喜欢:![]() |
沙发#
发布于:2003-06-25 20:59
我是这样理解的:看你设置的缓冲是否是ep2 out 2x,如果是的话,那么写进去的数就不会被冲掉,如果你发大于1024的数就可能被冲掉;对于4x缓冲则要发大于2048才会被冲掉,你试试看如何?或者我们可以进行qq交流
|
|
板凳#
发布于:2003-06-25 21:09
楼上说的是对的。
你至少是配置了双缓冲。 |
|
地板#
发布于:2003-06-26 08:55
同意。
|
|
地下室#
发布于:2003-06-26 09:59
各位我这里也有一个问题:如果外设的数据量为4k以上,那么要保证不出错的数据传输,固件里是否应该有什么措施呢?还是应用程序需要做的工作呢?
|
|
5楼#
发布于:2003-06-27 10:28
我觉得你应该设置一个指针,每次开始时增加指针的值,因为端点已满的时候,你可以将数据搬运到内存,重新装载OUT端点。不然的话,可能会发生数据丢失的现象
|
|
6楼#
发布于:2003-06-27 11:17
如果你不是实时传输的话,那数据是不会丢的,如果是实时传输,那就看传输速度的要求了,如果速度又比较高,那就会出现数据丢失问题,解决这个问题的最根本方法是在设备方加上一定量的缓存,缓存的大小和你的数据速率有关系
|
|