阅读:2089回复:6
请教:68013在从fifo模式下的相关问题
在我的系统中,pc机通过68013同dsp相连,68013采用从fifo模式,dsp主控读写过程。当68013的EP6设为输入端点后,并设成autoin模式,而且端点的最大包长度是512字节,这样当端点fifo中的数据达到512字节后,就会自动将数据传给主机pc。我想问的是,当数据传给pc后,pc机是将这些数据存储在哪里了呢?这个存储区有多大,能存储多少数据,应用程序在执行读取数据的操作的时候,是否能够一次读取较多的数据(目前我的系统是一次读一包数据)。
另外我还有一个问题,当端点fifo中没有数据之后,再进行读操作的时候,就会造成应用程序死掉,如何能够预先知道端点fifo中是否为空,来通知应用程序停止读取数据? 谢谢! |
|
沙发#
发布于:2004-10-22 14:03
同问。我也在做这个
|
|
|
板凳#
发布于:2004-10-22 15:50
1,你的理解稍微有些偏差,当端点中的数据达到512时,设备并不能把数据发走,而是生效(就是打包好数据,等待传输),当主机的读请求到达时数据随之传向主机(主机会发送in令牌查询),如果主机不发送读请求,数据是不会自动传走的。
2,由于上述原因,你的第二个问题也就不言自明了,因为这个缓存是你自己定义的,你读一个包你就会开辟512字节的缓存,十个包就要开辟10*512字节大小的缓存。 3,如果你想预先知道设备要传输多少个数据,那么你就要先通过控制传输来查询设备想传多少个数据(如果是56脚的片子恐怕比较麻烦,因为不能和外部master联系),如果查询到设备有64k的数据要传输,那么主机就在deviceiocontrol函数的传输长度处填上64k即可(好像ez的driver最大一次只支持64k-1字节) 我说明白了吗? |
|
地板#
发布于:2004-10-22 16:39
哦,你说的我明白了。十分感谢!
可是我现在是要实时接收dsp传给pc的数据,这样的话没有固定的要传输的字节数,岂不很麻烦? 另外,每512字节的数据在SIE中打成包,等待主机的读指令,那么SIE中能放得下多少包呢?还是肯定会有个限制的吧,谢谢指点。我们现在用100脚的芯片,呵呵 |
|
地下室#
发布于:2004-10-22 17:01
呵呵,那很简单啊,主机开个线程不停的收,什么时候想停就停掉就完了,反正设备端的数据是一直有的吗,这样的缺点就是每次传输收到的前两个512输举包都得丢掉,因为这两个包是上次传输没有收回主机的(除非两次之前你复位了设备或者断了电)
如果我没记错的话,68013的端点6最大可以配置成512字节,4缓冲,也就是说你有四个512字节的缓冲区可用,一个缓冲区满了等待主机收走,dsp可以写另外一个缓冲区,这个切换是68013硬件自动完成的,不需要dsp干预,你就照一个地方一直写就完了,如果主机不收了,你设置的是4缓冲,那么端点中写满了4个包的数据2048后就不能再写了,这期间的数据就会丢失,直到你主机重新开始接收数据为止。可是此时端点中有前一次传输剩余的4个包数据,这些数据是无效的,因此必须丢掉。 通常设置双缓冲就够了,如果你dsp产生的是一个正弦波什么的,那丢失一些数据无所谓的,这种方法最简单,否则你就必须加一个控制传输来启动传输,令外加一个控制传输来结束传输,这也不麻烦,用两个io口就能实现。 好了,我下班了,你再有问题的话我只能以后有机会给你回答了,不好意思啊。 |
|
5楼#
发布于:2004-10-22 17:13
好像明白了,再好好琢磨一下,多谢!
给分了:) 以后有机会再请教 |
|
6楼#
发布于:2004-10-22 20:13
在我的一个开发项目中,和你的用法差不多,想交流一下。
我用FX2(CY7C68013-56pin)实现USB接口,DSP芯片作主控,CPLD完成译码等逻辑,FX2工作在异步Slave FIFO模式,总线上还接了Uart,所以,用PA7作为SLFIFO的片选(SLCS),固件中的初始化部分将IFCONFIG 写入 0xcb,PORTACFG 写入 0x40。但是,当DSP程序对同在总线上的UART操作时,总是影响FX2,我搞不明白,按手册中所讲,当SLCS为高电平时FX2不应理会SLRD或SLWR。 |
|