硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4072|回复: 4
收起左侧

基于华大F460例程的USB学习

[复制链接]

5

主题

51

回帖

66

积分

初级会员

积分
66
QQ
发表于 2021-12-17 19:17:13 | 显示全部楼层 |阅读模式
本帖最后由 dacongzi 于 2021-12-17 20:26 编辑

基于华大的F460usb模拟串口例程学习了USB设备,学了快一个月了,因为公司项目的安排,要搁浅一段时间了,在这里做一个总结,也是怕自己忘记。USB是一个复杂的东西,后期还会继续跟进。
阶段一:在刚开始学的时候,是看了硬汉哥的USB相关资料,首先是赛普拉斯的文档“AN57294 USB 101 An Introduction to Universal Serial Bus 2.0 (Chinese).pdf”,里面介绍了基础的一些概念,后面也给出来设备枚举过程的抓包截图,对学习很有用,也好理解。后面看了文档“21ic下载_USB2.0技术规范(中文).pdf”,也描述了USB的大框架,还有坛友“初晴sama”在bilibili录制的教程视频(https://www.bilibili.com/video/BV1Ef4y1t73d)等等,都给我很大的帮助。
             1)设备描述符,接口描述符,端点描述符,字符串描述符等知识
             描述符类别:1=设备描述符,2=配置描述符  3=字符串描述符  4=接口描述符  5=端点描述符  0x0B=接口关联描述符   各个描述符具体含义文档里都有清楚的描述,这里不再赘述                                
             微信图片_20211217190203.png
               2.png
             2)各个状态:
                低速设备: J态:D+低电平   D-高电平
                                 K态:D+高电平   D-低电平
                                 SE0: D+和D-都是低电平、
                高速设备和低速设备的JK状态正好相反。
                空闲状态:低速为K,全速为J,高速为SE0状态
             3)编码格式:NRZI(不归零取反)参考文章:https://www.cnblogs.com/guojun-junguo/p/9510464.html             4)域:同步域(SYNC),标识域(PID),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)
                  标识域内容如下图:
                   3.png
             5)包:包是由域组成的,不同的包由不同的域组成
                       令牌包:SYNC+PID+ADDR+ENDP_CRC5或SYNC+PID+11位FRAM+CRC5(帧起始包);
                       数据包:SYNC+PID+0~1023字节+CRC16
                       握手包:SYNC+PID
                       特殊包:还没有研究
             6)事务:事务由包组成:

                        SETUP事务: 令牌包(PID=SETUP由主机发给设备)+数据包(由主机发给设备,是8个字节构成的DATA0数据包)+握手包(设备发送给主机表示接收到或者别的状态)
                                            数据包8个字节内容如下图:
                                             4.png
                      IN事务:令牌包(PID=IN由主机发给设备)+数据包(由设备发送给主机,DATA0/DATA1)+握手包(主机发送给设备表示接收到或者别的状态)
                      OUT事务:令牌包(PID=OUT由主机发给设备)+ 数据包(由主机发送给设备,DATA0/DATA1)+握手包(设备发送给主机表示接收到或者别的状态)
               7)传输:传输由事务组成
                    中断传输:由OUT事务和IN事务组成(没有研究)
                    批量传输:由OUT事务和IN事务组成
                    同步传输:(没有研究)
                    控制传输:设备枚举或者设备配置参数的时候使用,比较复杂
阶段二:使用华大F460开发板例程学习USB模拟串口
            1)开发板:我使用的是一个在淘宝上买的最小系统的开发板,也比较便宜,绝对不是打广告:https://item.taobao.com/item.htm ... p;abbucket=7#detail
                             如果要使用这个开发板,在USB调试时,需要将R4丝印的地方用O欧姆电阻短接起来
            2)例程:在华大半导体的官网上可以下载:https://www.hdsc.com.cn/Category83-1486
                     5.png
                      这里我先说一个这个例程的BUG,在目录”....\hdsc\HC32F460\hc32f460_ddl_Rev2.2.0\example\ev_hc32f460_lqfp100_v2\usb\usb_dev_cdc\source“文件”cdc_data_process.c“中,将函数comport_config内容修改,如下:
                      6.png
                      华大的代码可以自己研究,我自己也研究的不是很透彻,结合参考手册和代码一起看,设置断点,等方法。个人觉得这个代码可能不好在RTOS使用,因为所有的数据处理都放在了USB中断函数中,按照他们的说法是为了提高处理速率,发挥USB性能,但是总觉得不是很好
阶段三:使用USBlyzer抓包工具分析,其它的工具也有:比如BusHound,wireshark等,在使用wireshark时,安装的时候,有一个”usbcap“的选项一定要勾选,否则找不到USB设备,个人对比后比较喜欢usblyzer
             1)我在之前的帖子上已经发了破解版本,很好用 https://www.armbbs.cn/forum.php? ... &extra=page%3D1
             2)描述符:
                 这部分在华大的例程里可以找到,其中设备描述符这里有个地方需要修改,否则使用usblyzer的时候,会提示warning
                  9.png
                 我框出来的这几个描述符,在usb2.0规范,包括赛普拉斯文档里是没有列出的,这部分描述是在CDC类的文档里给出的,硬汉哥的帖子里可以下载到:https://www.armbbs.cn/forum.php? ... &extra=page%3D1
                   8.png
                10.png
                11.png
                12.png
             13.png
             14.png
             15.png
            16.png
            17.png
            18.png
          19.png
            20.png
               21.png

             3)抓包,在抓包过程中发现usblyzer抓的应该是事务,不知道是否理解错误?以及每个事务执行是否成功的状态。
                 a) 配置包,比如配置了UART的波特率,基本上是先获取设备的uart数据,然后再配置,如此过程持续好多遍,这个根据我的观察,发现不同的串口上位机会有不同的次数,但大体过程就是获取设备参数->配置设备参数->获取设备参数
                  7.png
                b)批量传输:比如发送数据,或者接收数据,都是批量传输
                   22.png
                  对于发送到设备的数据,主机先发送了OUT令牌包+主机发送数据包+设备发送握手包
                  对于设备发送到主机的数据,经过硬汉哥的解答理解了:主机空闲后会定时发IN令牌包,如果设备有数据要发送,那么主机发送IN令牌包+设备发送NACK,如果有数据要发送:主机发送IN令牌包+设备发送数据+主机发送ACK
                  其中,因为我的设备是全速设备,所以主机会1ms发送一个sof令牌包。
微信图片_20211217190203.png

AN57294 USB 101 An Introduction to Universal Serial Bus 2.0 (Chinese).pdf

3.17 MB, 下载次数: 22

21ic下载_USB2.0技术规范(中文).pdf.pdf

2.15 MB, 下载次数: 25

usb_20.pdf

5.71 MB, 下载次数: 19

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-12-17 19:52:43 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

5

主题

51

回帖

66

积分

初级会员

积分
66
QQ
 楼主| 发表于 2021-12-17 20:28:49 | 显示全部楼层

硬汉哥客气了
回复

使用道具 举报

17

主题

101

回帖

152

积分

初级会员

积分
152
发表于 2022-1-1 15:58:13 | 显示全部楼层
帮顶,楼主总结到位
回复

使用道具 举报

5

主题

51

回帖

66

积分

初级会员

积分
66
QQ
 楼主| 发表于 2022-1-6 09:21:02 | 显示全部楼层
初晴sama 发表于 2022-1-1 15:58
帮顶,楼主总结到位

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 15:40 , Processed in 0.200083 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表