374双缓冲问题

贵公司给我发了个例子,但好像是374做为主机的双缓冲,好像还要支持BulkOnly协议 我现在的374是做为设备的,想使用端点2的双缓冲接收PC机下传的数据,不使用BulkOnly协议,就是下传数据,读出来,可以吗? 我已经将06号寄存器的位3,位2置为01=连续接收缓冲区以连续接收128字节

那么我在单片机端怎么读出数据呢,是这样读吗? 先读取长度,再读出0xc0缓冲区数据 再读出长度,再读出0x80备用缓冲区数据 那么这两个长度都是读长度寄存器吗,怎么对应不同的缓冲区呢?

非常感谢!

01方式发送和接收时:前64字节放在USB设备方式下的端点2发送/接收缓冲区,后64字节放在USB设备方式下的端点2备用缓冲区,DATA0,DATA1都是一样使用. 10方式时: 只有在DATA1的时候从备用缓冲区发送和接收64字节.DATA0的时候从USB设备方式下的端点2发送/接收缓冲区发送和接收64字节. 11方式时:在DATA1的时候从备用缓冲区接收64字节,从USB设备方式下的端点2发送/接收缓冲区的发送缓冲区发送64字节.只有在00方式时,DATA0的时候从USB设备方式下的端点2发送/接收缓冲区发送和接收64字节.需要注意DATA0,DATA1的切换.


这个我看过了,我的问题具体是: 两个缓冲区数据长度怎么获取 那么我在单片机端怎么读出数据呢,是这样读吗? 先读取长度,再读出0xc0缓冲区数据 再读出长度,再读出0x80备用缓冲区数据 那么这两个长度都是读长度寄存器吗,怎么对应不同的缓冲区呢?


实际每次获取的长度都在长度缓冲区里面,你先读取地一个64字节,读取完成之后在读取一下备用缓冲区,这样就应该可以了。


我做了个实验:将06号寄存器的位3,位2置为01=连续接收缓冲区以连续接收128字节

我传了3个字节数据 查询到下传的中断后,我读出长度寄存器为3,然后从接收缓冲区读出3个数据 然后,再读长度寄存器(应该是备用缓冲区长度了吧?),也是3,照说,应该是0才对啊,那么让我怎么处理呢,难道从接收缓冲区不满来判断备用缓冲区为空吗?


你这样试试: 将06号寄存器的位3,位2置为11=连续接收第二缓冲区,同步标志为1 选中 在端点2下传中断中: (1)切换同步标志,取出本次传输的长度 (2)重新配置端点2的配置寄存器:对OUT事务响应ACK (3)清中断标志 (4)从缓冲区中取数据(缓冲区的选择由同步标志决定,此时0选中备用缓冲区,1选中主缓冲区,因为(1)中同步标志已经切换过了) 注:这段流程与DEVICE.C有点不同,即(3)提前做了,应对DEVIC.C中 else if ( s & BIT_IF_TRANSFER ){} 作部分修改: (1)删掉Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中断标志 (2)在每个CASE中添加Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中断标志


文档中这句我就不太明白:11=连续接收第二缓冲区,同步标志为1选中 是说同步标志为1时选中备用缓冲区吗? 第(1)步中读取的长度应该是哪个缓冲区的长度呢? 我比较关注第(4)步中取数据,这步应该是取两个缓冲区的数据吧 通过同步标志选择不同的缓冲区,那么这个同步标志应该是我自己设的吧 我想取主缓冲区,就设接收同步标志为1,想取备用缓冲区,就设同步标志为0


(1)同步标志为1,则表示当前操作的缓冲区应为备用缓冲区 (2)数据长度总是从长度寄存器中取,表示本次传输的数据长度 (3)每次下传成功,只能根据此时的同步标志,从相应的缓冲区中取数据,同步标志不可以自己设定,总是以DATA0为起始,传输成功后再切换。 注:所谓双缓冲传输,我个人理解的原理是这样的,假设主缓冲区编号为A,备用为B 端点2上传: (1)先把数据放入缓冲区A,配置相关寄存器(如长度寄存器,控制寄存器),启动上传,等待PC来取 (2)374此时正在上传,但还未产生上传成功中断: 若不用双缓冲,单片机则只能等到上传成功中断后才能向A中写入新的数据,再次上传,依次类推,直至完毕 若使用双缓冲,单片机则不用等待上传成功中断,紧接向B中写入新的数据,但不配置相关寄存器,等到上传成功中断产生后,切换同步位,配置相关寄存器,启动上传。这一过程利用等待时间向缓冲区B中写入数据 端点2下传: 下传成功后,切换同步位,读取本次传输长度,但是暂不从缓冲区A中取数据,重配置控制寄存器,启动第二次下传,此时第二次下传还未成功,利用这段时间根据同步标志位从相应的缓冲区取数据。

总之一点:使用双缓冲,就是利用传输时间间隙,向缓冲区存取数据,不用等待传输是否完成。建议楼上,再多参考一下HOSTDISK.C例子程序。


只有登录才能回复,可以选择微信账号登录