完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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个回答
|
|
首先需要确保的是,实现的USB设备类型,主机解析后会向EP2发起IN事务,这个是大前提。
其次要确认,是因为USB传输有些问题导致的看门狗超时,还是因为看门狗超时导致的USB无法处理,先后顺序需要理清楚。 仅看这部分代码,应该是没什么问题的。 还有这个busy标志别真的死等(这不可取),主循环中轮询,需要发送的数据做队列。 |
|
|
|
只有小组成员才能发言,加入小组>>
518 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2901 浏览 2 评论
2397 浏览 1 评论
865浏览 2评论
683浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
415浏览 1评论
518浏览 1评论
请教一下,Mounriver 编译不成功:找不到库文件,怎么整
810浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:21 , Processed in 1.141272 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号