CH573/CH573 USB IN端点发送数据给PC,怎么知道数据已经发送完成?

CH573/CH573 USB IN端点发送数据给PC,怎么知道数据已经发送完成?

由于项目中UART都使用了,于是USB CDC例程通过USB打印log,发现有些log打印不出来,判断问题出在端点发送上,代码没有实现发送完成判断,每次调用usb发送都是简单机械的往端点2里面填充

void?USBSendData(uint8_t?*SendBuf,uint8_t?l)
{
????usb_sent_flag=0;
????memcpy(pEP2_IN_DataBuf,SendBuf,l);
????DevEP2_IN_Deal(l);
}

我想再每次填充、写完发送长度后等待主机把缓冲区的数据取走后再跳出发送函数,查看USB中断处理代码,发现在中断处理代码中会将端点2的发送状态写成NAK:


case?UIS_TOKEN_IN?|?2:
????R8_UEP2_CTRL?=?(?R8_UEP2_CTRL?&?~MASK_UEP_T_RES?)?|?UEP_T_RES_NAK;
break;


于是我想可不可以判断这个值呢,有了以下代码:

void?USBSendData(uint8_t?*SendBuf,?uint8_t?l)
{
????usb_sent_flag?=?0;
????memcpy(pEP2_IN_DataBuf,SendBuf,l);
????DevEP2_IN_Deal(l);

????//等待发送完成
????while((R8_UEP2_CTRL&MASK_UEP_T_RES)?==?UEP_T_RES_ACK)
????{
????????WWDG_SetCounter(0x0);
????}
}

但是发现不行,会一直等在这里,我这野路子估计不行,希望官方能给支个招,提前祝你国庆假期玩的开心!!!!

编辑原因,修改代码样式

编辑了好几次,发现论坛会自动把空格转成 "?",大家将就看下哈,感谢!!!!


各位大佬帮帮看一下,我刚才找了USB的例程,关于USB的资料好少


可以参考:/bbs/thread-91615-1.html

image.png


①端点2支持且支持:下传上传下传上传下传上传下传上传

这个手册中有说明吗?这样的特性是不是意味着设备不能连续2次进行IN操作,进行一次IN操作后要主机触发一次OUT操作,才能进行下一下IN操作? 我看cdc例程就是用的端点2,也就是设备端不能连续给PC发送报文是吧?

怎么改善呢,CDC例程中使用其他端点可行吗? 我用的芯片是CH571/573,感谢答复!!!!



我按照您推荐的帖子,在IN操作前增加了Endp2Busy判断,只有在Endp2Busy为0的时候才会进行新的IN操作,但是还是不行,表现是while(Endp2Busy);死等到看门狗复位

void USBSendData( uint8_t *SendBuf, uint8_t l)

{

   uint8_t retry_times = 0;

   while(Endp2Busy);

   Endp2Busy = 1;

   memcpy(pEP2_IN_DataBuf,SendBuf,l);

   DevEP2_IN_Deal( l );

   mDelaymS(100);

}

中断是这样的

 case UIS_TOKEN_IN | 2 :

           //R8_UEP2_CTRL ^= RB_UEP_T_TOG;

          R8_UEP2_CTRL = ( R8_UEP2_CTRL & ~MASK_UEP_T_RES ) | UEP_T_RES_NAK;

           //usb_sent_flag = 1;

          Endp2Busy = 0;

          GPIOA_InverseBits(GPIO_Pin_12);

          break;

我需要的要求很简单,就是UART用完了,需要用USB打印log


首先需要确保的是,实现的USB设备类型,主机解析后会向EP2发起IN事务,这个是大前提。

其次要确认,是因为USB传输有些问题导致的看门狗超时,还是因为看门狗超时导致的USB无法处理,先后顺序需要理清楚。

仅看这部分代码,应该是没什么问题的。


还有这个busy标志别真的死等(这不可取),主循环中轮询,需要发送的数据做队列。


首先需要确保的是,实现的USB设备类型,主机解析后会向EP2发起IN事务,这个是大前提

答:我用的是CDC类,可以实现部分数据上传,现象是有的USBSendData不成功,有的可以成功。

其次要确认,是因为USB传输有些问题导致的看门狗超时,还是因为看门狗超时导致的USB无法处理,先后顺序需要理清楚。

答: 确认是usb死等导致的WDT超时,因为我在死等while循环里加上喂狗函数后就不重启了。

?还有这个busy标志别真的死等(这不可取),主循环中轮询,需要发送的数据做队列。

答:嗯嗯,是,我是想先这样尽量简单,跟官方一致,定位好问题之后再改轮询队列形式

这个表述我还没理解,可以回答下下面的疑问吗?

①端点2支持且仅支持:下传上传下传上传下传上传下传上传

这个手册中有说明吗?这样的特性是不是意味着设备不能连续2次进行IN操作,进行一次IN操作后要主机触发一次OUT操作,才能进行下一下IN操作? 我看cdc例程就是用的端点2,也就是设备端不能连续给PC发送报文是吧?

怎么改善呢,CDC例程中使用其他端点可行吗? 我用的芯片是CH571/573,感谢答复!!!!




代码期望实现效果,并非芯片硬件特性

芯片的每个端点都具备双向、随时收发的能力。


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