关于374做设备时主动上传的问题

我的374是做设备使用的,在处理端点2数据传输时遇到两个问题: 1.在例子程序中,下传成功后,再上传数据,再返回ACK,这个ACK是将端点2控制寄存器 位1,位0置00,异或位7的接收同步标志,可以看作:下传+上传+ACK,那么我想将下传和上传分开,即:下传+ACK1;上传+ACK2,那么ACK1和ACK2怎么写呢?

2.第二个问题可以是PC机端的,如果一次下传成功后,下位机读出数据后,并没有上传握手信号,而此时PC机端又要发送一次下传,这样就出错了,那么在PC机端 有什么命令,可以放弃上次的握手信号吗,而使第二次下传正传执行?

在下传之后,你就可以每次上传数据,你说的ACK2这个实际的在0X0E寄存器里面有详细的介绍,你可以看下。


case USB_INT_EP2_OUT: { // 批量端点下传成功 UINT8 buf[64]; if ( s & BIT_STAT_TOG_MATCH ) { // 仅同步包 l = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_ENDP2_RECV, l, buf ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_RECV_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG );

if(time==0){ //第一次则上传 for ( s = 0; s < 10; s ++ ) buf[s] = s; Write374Block( RAM_ENDP2_TRAN, 10, buf ); // 演示回传 Write374Byte( REG_USB_LENGTH, 10 ); Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); time=time+1; }

// Write374Index( REG_USB_ENDP2 ); // 对于并口连接可以用本行及下面一行代替上一行的程序,减少写一次index的时间,提高效率 // Write374Data( M_SET_EP2_TRAN_ACK( Read374Data0( ) ) ^ BIT_EP2_RECV_TOG ); } break; }

这段程序不会出现你以前所说的,一次上传之后不再上传,但如果上位机去读还能读到第一次上传的数据的情况。


恩,谢谢两位 “这段程序不会出现你以前所说的,一次上传之后不再上传,但如果上位机去读还能读到第一次上传的数据的情况。” 这个问题已经解决了,谢谢! 我现在的问题是:下传成功后,读出数据,我给PC机回了个ACK1(0x0E寄存器的位7异或,即接收标志位取反,位6,位5置00,即接收响应(对OUT事务)应答ACK),我运行了下,这样应该没问题

紧接着,我又向上发送了数据,然后再写ACK2,这个ACK2试了很多方式,都不行,

由于程序需要,我必须将下传和上传的事务分别独立分开,希望知道ACK1和ACK2应该怎么处理,谢谢!


你的ACK2的包是如何组织的?

端点2的上传: 1。向端点2上传缓冲区(RAM_ENDP2_TRAN)写入数据、 2。向长度寄存器(REG_USB_LENGTH)写入数据长度 3。配置端点2的控制寄存器(REG_USB_ENDP2) 完成以上步骤后,等待PC机取走数据


对,我就是这个步骤

关键是: 3。配置端点2的控制寄存器(REG_USB_ENDP2) 我总是配置不好! 我将0x0e的位6发送标志位取反,将位1,位0置位00,即端点2发送响应 00=应答数据长度从reg_usb_length写入 。但是这样不成功 然后,就清除中断标志位,跳到查询低电平处了!


对,我就是这个步骤

关键是: 3。配置端点2的控制寄存器(REG_USB_ENDP2) 我总是配置不好! 我将0x0e的位6发送标志位取反,将位1,位0置位00,即端点2发送响应 00=应答数据长度从reg_usb_length写入 。但是这样不成功 然后,就清除中断标志位,跳到查询低电平处了!


你第一次上传的同步位错了,第一次是DATA0,也就是0x0e的位6是0,等PC取走数据,374产生端点2上传成功中断后,才将该位取反。


也就是需要这一句: Write374Byte( REG_USB_ENDP2, M_SET_EP2_TRAN_ACK( Read374Byte( REG_USB_ENDP2 ) ) ^ BIT_EP2_RECV_TOG ); 其中M_SET_EP2_TRAN_ACK()你可以参考头文件CH374INC.H.


我试试,那么我在下传数据后,没有上传,接着回应0x0e怎么设置呢 我这样设置对吗: 0x0E寄存器的位7异或,即接收标志位取反,位6,位5置00,即接收响应(对OUT事务)应答ACK)


其中,这也不是我第一次上传数据,前面有下传,上传,回应等很多处理了。


正确,但还得把位1,0置为10,即对IN事务应答NAK


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