WCH沁恒单片机
直播中

张国厚

7年用户 1368经验值
私信 关注
[问答]

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);
????}
}
但是发现不行,会一直等在这里,我这野路子估计不行,希望官方能给支个招,提前祝你国庆假期玩的开心!!!!

编辑原因,修改代码样式

回帖(1)

刘娜

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

其次要确认,是因为USB传输有些问题导致的看门狗超时,还是因为看门狗超时导致的USB无法处理,先后顺序需要理清楚。
仅看这部分代码,应该是没什么问题的。


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

更多回帖

发帖
×
20
完善资料,
赚取积分