完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
在CH554的USB例程库里VendorDefinedDev.c文件截取代码如下:
else { switch (USB_INT_ST & (MASK_UIS_TOKEN | MASK_UIS_ENDP)) { // 分析操作令牌和端点号 case UIS_TOKEN_OUT | 2: // endpoint 2# 批量端点下传 if (U_TOG_OK) { // 不同步的数据包将丢弃 UEP2_CTRL ^= bUEP_R_TOG; // 手动翻转 len = USB_RX_LEN; for (i = 0; i < len; i++) { Ep2Buffer[MAX_PACKET_SIZE + i] = Ep2Buffer[i] ^ 0xFF; // OUT数据取反到IN由计算机验证 } UEP2_T_LEN = len; UEP2_CTRL = UEP2_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_ACK; // 允许上传 } break; case UIS_TOKEN_IN | 2: // endpoint 2# 批量端点上传 UEP2_CTRL ^= bUEP_T_TOG; // 手动翻转 UEP2_CTRL = UEP2_CTRL & ~MASK_UEP_T_RES | UEP_T_RES_NAK; // 暂停上传 break; 这里UIS_TOKEN_OUT | 2选项中做了将从host接收到的数据反转后上传的操作,项目里面不需要这一步,而且在ch573F的Device例程里也没有看到有这种操作,尝试将这一步删了,发现数据传输出错,请问怎么取消这种反转操作。 |
|
相关推荐
1个回答
|
|
一、上传
参考CH554EVT中CompatibilityHID.C 代码功能是Ep2InKey为0就上传固定数据,Ep2InKey为0就是P1.5接地。 为了实现稳定上传,引入了Endp2Busy这一个全局变量(全局标志),该标志必须使用。 原因:USB是有应答的,USB设备作为“被动的”一方,需要等主机把数据取走了之后才能发送下一包数据。所以在调用Enp2BlukIn();的同时置位标志,防止这次的上传还没有结束,下一 次循环又处理了缓冲区数据。 在USB中断函数中的case UIS_TOKEN_IN | 2: 处将标志清除,也就是USB外设产生中断,并且成功进入这个case就表示2号端点的IN事务完成。 且代码131行处,可以看到将端点2的发送(设备-》主机)响应状态改成了NAK,这样可以防止非主动的数据上传。直到数据准备好,我们会在主循环中调用Enp2BulkIn( ),将响应状态改成ACK,然后等着主机将数据取走。 二、下传 1、参考CH554EVT中VendorDefinedDev.C 2、代码功能:主循环判断从串口收一字节数据,对数据处理后通过端点1上传。端点2可以接收USB主机下发的数据,对收到的数据取反然后上传。即: ①端点2支持且仅支持:下传上传下传上传下传上传下传上传 因为USB设备是“被动的”,所以只能等着主机在某个时候下传数据,需要提前准备好。初始化完确保UEP2_CTRL 寄存器对OUT事务的应答状态为“ACK”。只有响应状态为ACK,此时电脑尝试下传数据才能成功。 端点应答状态的寄存器说明见下图。 第一包数据主机下发成功之后,才会进到USB中断函数。 第一包数据下传之后,下一包数据的上传在下图红框处处理: 先是将数据填充到Ep2Buffer[MAX_PACKET_SIZE]处 然后将上传数据包长度填到UEP2_T_LEN寄存器 最后将UEP2_CTRL寄存器的IN事务响应状态改成“ACK” 执行完以上操作,接下来就是等着下一次进USB中断,正常情况下下一次进USB中断函数会进入case UIS_TOKEN_IN | 2: 进入这里表示完成了一次IN事务。 这样的交互流程一定程度上做到了“同步”,也能够保证持续的传输。所以,一发一收的流程绝对不能乱,不然就可能传输卡住。 ②端点1支持且仅支持:上传上传上传上传上传上传上传上传 这个端点1上传功能类似CompatibilityHID.C中的上传,但是这里没有加上全局标志,只要getkey()函数有返回值,就一直会刷新Ep1Buffer。所以这个上传可能会出现上一包还没有被电脑取走,下一包数据就又填到缓冲区里了,导致类似数据出错、错位的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
531 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2907 浏览 2 评论
2402 浏览 1 评论
875浏览 2评论
692浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
423浏览 1评论
535浏览 1评论
请教一下,Mounriver 编译不成功:找不到库文件,怎么整
819浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 12:45 , Processed in 0.946525 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号