请选择 进入手机版 | 继续访问电脑版
搜索
查看: 313|回复: 4

[原创] 【板卡活动】+PIC32MZEF+USB设备实现CDC虚拟串口

[复制链接]
发表于 2017-9-25 16:58:53 | 显示全部楼层 |阅读模式
1,硬件连接
图片1.png
图片2.png
2,使用MHC配置USB服务
图片3.png
图片4.png
增加一个USB处理服务
图片5.png
3,使用USB的实现,就是USB枚举的实现过程。
简单描述一下枚举过程:
A,设备连接,USB设备接入USB总线,主机USB根集线器的两个信号线(D+D-)上都有一个15K的下拉电阻,一个设备在D+上有一个1.5K的上拉电阻,连接设备时,信号线上为高电平,这样主机检测到设备的接入。
B,设备上电,可以由USB总线供电,也可以外部电源。
C,主机检测到设备后,发出复位;
D,设备默认状态,需要从总线上接收到一个复位信号后才可以对总线操作做出响应;
E,主机以默认地址0x00和端口0读取设备描述符,以确认有设备接入;
F,设备向主机发送设备描述符;
G,主机确认有设备介入后,向设备分配新地址;
H,设备进行地址设置,以后只对该地址进行响应。
i,主机通过新地址向设备发出获取设备描述符的请求,确定USB设备熟悉;
J,设备向主机发送设备描述符;
K,主机请求获取配置描述符;
L,设备返回配置描述符;
M,主机对设备进行配置;
N,主机读取设备状态及端口状态;
O,挂起,为了省电。
4,不管是实现什么样的USB功能,都是一个枚举过程。枚举过程中最主要的就是USB描述符。USB描述符包括标准描述符、HID描述符、HUB描述符等,最主要的标准描述符包括:设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符、设备限定描述符、其他速率配置描述符。
我这里主要说标准描述符。
这七种描述符具有类似的格式,比如说它们的第一个字段都是 bLength, 第二个字段都是 bDescriptorType 。 七种描述符在使用时以 bDescriptorType 字段来区分。 描述符类型与对应的 bDescriptorType 字段值对应关系为
图片6.png
A,设备描述符
备描述符描述的是设备的整体信息, 与设备本身一一对应, 一个设备只能有一个设备描述符。 在主机对 USB 设备枚举的过程中, 首先要做的就是获取设备描述符, 以对设备有一个整体的了解。设备描述符由14个字段组成,总长度是18个字节。
图片7.png
通过MHC配置后,在firmware\src\system_config\code下的system_init.c中已经完成描述符的配置。
图片8.png
图片9.png
B,配置描述符
一个 USB 设备可以有多种配置, 不同的配置使设备工作在不同的状态下, 每个配置必须有一个配置描述符。其格式包括 8 个字段, 共 9 字节。
图片10.png
图片11.png
C,字符串描述符
USB 协议中字符串描述符是可选的。字符串描述符用于保存一些供应商名称、 产品序列号等文本信息它的长度是不固定的, 随字符串的数量和信息的长度变化而变化
图片12.png
图片13.png
D,接口描述符
接口是端点的集合, 负责完成 USB 的特定功能, 例如数据的输入输出。 接口描述符用于描述一个接口, 包含了接口的特性,如端点个数,所属设备类和子类等。它有 9 个字段, 共 9 字节
图片14.png
E,端点描述符
端点描述符用于指出 USB 端点的特性,包括其所支持的传输类型、 传输方向等信息。 USB 中规定,端点 0 没有端点描述符,其余端点必须包含端点描述符。 端点描述符由 6 个字段组成,共 7 个字节 。
图片15.png
图片16.png
F,设备限定描述符
设备限定描述符用于指定另一传输速率下该设备的总体信息, 如果高速 USB 设备既需要采用高速传输又需要全速传输, 则它必须支持设备限定描述符 (Device_Qualifier) 。 设备限定描述符包含 9 个字段, 长度固定为 10 个字节。
图片17.png
图片18.png
G,其他速率配置描述符
其他速率配置描述符用于指定另一传输速率下该设备的配置信息, 如果高速 USB 设备既需要采用高速传输又需要全速传输, 则它必须支持其他速率配置描述符。 其他速率配置描述符包含 8 个字段, 长度固定为 9 个字节
图片19.png
图片20.png
一把除了设备描述符外,其他全部描述符初始化在一个结构中,我们这里也不例外。
图片21.png
图片22.png
描述符定义好之后就是开始实现枚举过程了。
5,源码分析
USB任务处理
图片23.png
任务也是安装状态机来实现,初始化状态机为USB_STATE_INIT。
图片24.png
图片25.png
在初始化状态机USB_STATE_INIT下,开启USB设备:USB_DEVICE_Open,开启成功后,注册USB端口0的事件回调函数:APP_USBDeviceEventHandler,在回调函数中在注册回调函数APP_USBDeviceCDCEventHandler,处理枚举过程的回调函数。
然后进入等待配置状态
图片26.png
配置成功后,就可以通过USB传输数据了。
我这里实现的CDC虚拟串口功能。实现接收到什么数据就发送什么数据出去。
图片27.png
接收的数据放到usbData.readBuffer缓存下。
然后把接收的数据发送出去
图片28.png
这样就实现了USB虚拟串口的收发数据。编译下载程序。
5,体验
这时候需要连接两根USB线
图片29.png
上电后提示安装驱动
图片30.png
驱动安装成功后就可以使用了
图片31.png
使用串口工具证实了数据正确性。
图片32.png
更详细的内容需要自己去琢磨,这里只是说明了大概的思路过程。有了思路,一定能成功。

回复

使用道具 举报

发表于 2017-9-25 17:03:41 | 显示全部楼层
666
回复

使用道具 举报

发表于 2017-9-26 15:40:59 | 显示全部楼层
不错了,楼主玩的很溜啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-26 18:00:26 | 显示全部楼层
ersha4877 发表于 2017-9-26 15:40
不错了,楼主玩的很溜啊

一起加油
回复 支持 反对

使用道具 举报

发表于 2017-10-19 19:18:28 | 显示全部楼层
超级棒啊 向大佬学习
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /4 下一条

facebook google plus twitter linkedin youku weibo rss
©2018 Microchip Corporation

小黑屋|手机版|Archiver|Microchip技术社区

GMT+8, 2018-1-19 15:16 , Processed in 0.304272 second(s), 8 queries , MemCache On.

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