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使用的主要内容,如果未能解决你的问题,请参考以下文章

webstorm代码片段的创建

VIM 代码片段插件 ultisnips 使用教程

Android课程---Android Studio使用小技巧:提取方法代码片段

使用 Git 来管理 Xcode 中的代码片段

如何在 Javadoc 中使用 @ 和 符号格式化代码片段?

使用 Pygments 检测代码片段的编程语言