novoton-USBDevice使用
Posted LLWDream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了novoton-USBDevice使用相关的知识,希望对你有一定的参考价值。
USB Device攻略
(USB Device 不能自己发送数据到USB Host,必须等USB Host问USB Device要数据才能回。)
一个USB物理设备一般可以包含多个USB 设备,这种叫USB复合设备,例如:USB Audio + USB HID设备,这种设备插入USB Host之后,会同时枚举出两个USB 设备。
插入USB Host的USB Device有以下6种状态:(插入、上电、缺省、分配地址、配置、挂起)
设备插入检测
主机通过DP/DM脚上的上拉电阻判断是否有设备接入,并由此判断该设备是全速、高速还是低速设备。
USB设备地址
每个USB设备都有唯一的设备地址,在枚举的时候由主机分配。地址是用来识别USB设备的,总共7bit,最多可以表示127个设备,其中地址0是所有USB设备的默认地址。USB设备一插入主机时,地址就是0,然后主机会尽快给它分配一个地址。
USB端点地址
USB设备中包含多个USB端点(Endpoint),每个端点有端点地址和端点类型。USB IP根据端点地址操作对应的USB端点。
USB支持4种传输类型(端点类型):控制传输、块传输、中断传输、等时传输。
- 控制传输:用来收/发 USB命令。它的端点地址是0,这个是强制规定的。一个设备插入主机,主机就开始枚举过程。枚举就是通过控制端点拿到设备的各种描述符。
- 块传输:一般用于大量数据传输,只要主机有空就会传输该端点的数据
- 中断传输:一般用于鼠标和键盘。它的特点是主机每隔一定的时间来要数据,如果主机比较忙,这个间隔是不保证的
- 等时传输:一般用于传输语音数据。它的特点是主机每隔1ms传输一次数据,主机一定要尽力保证这个间隔。因为语音数据一旦跟不上,就会听到断音,而这个一般不允许。
一个USB设备中,可以有多个端点,每个端点的作用不同,所以需要端点地址来标识端点。端点地址由端点号+方向组成,端点号4-bit,方向1-bit。方向就是指IN 和OUT,代表数据传输的方向。IN代表该端点是负责发送数据到Host的,OUT代表该端点是负责从Host接收数据的。大家注意在USB中方向都是对USB Host而言的,就是说IN是指传输数据到USB Host, OUT是指USB Host传输数据到USB Device。
端点是有方向的,同一个端点地址可以同时支持IN和OUT,也可以只支持IN或者OUT。
USB的描述符
USB Host要识别USB device靠的就是各种USB 描述符:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符。
枚举时,USB Host会先要设备描述符,然后要配置描述符。要配置描述符的时候USB device要把接口描述符和端点描述符一起上传。
结构如下:
1 //初始化USBD 2 void usbd_init(void) 3 { 4 // 使能USBD时钟 5 CLK_EnableModuleClock(USBD_MODULE); 6 // 配置USB时钟源,(48MHZ) 7 CLK_SetModuleClock(USBD_MODULE, 0, CLK_CLKDIV0_USB(3)); 8 9 // 解锁保护寄存器 10 SYS_UnlockReg(); 11 // 使能USBPHY 12 SYS->USBPHY = SYS_USBPHY_LDO33EN_Msk; 13 // 加锁保护寄存器 14 SYS_LockReg(); 15 }
1 //打开USBD设备 2 USBD_Open(&gsInfo, HID_ClassRequest, NULL); 3 //配置端点 4 HID_Init(); 5 USBD_Start(); 6 //开中断 7 NVIC_EnableIRQ(USBD_IRQn);
1 while(1) 2 { 3 HID_UpdateMouseData(); 4 }
以上是关于novoton-USBDevice使用的主要内容,如果未能解决你的问题,请参考以下文章
Android课程---Android Studio使用小技巧:提取方法代码片段