历史上的今天
今天是:2025年03月07日(星期五)
2018年03月07日 | 基于keil C mdk开发环境的stm32的USB接口单片机程序设计
2018-03-07 来源:eefocus
首先,我们来看看usb的工作过程。
当usb设备接入到主机时,主机开始枚举usb设备,并向usb设备发出指令要求获取usb设备的相关描述信息,其中包括设备描述(devICe descriptor)、配置描述(configuration descriptor)、接口描述(interface descriptor)、端点描述(endpoint descriptor)等。这些信息是通过端点0(endpoint 0)传送到主机的。获取各种描述信息后,操作系统会为其配置相应的资源。这样主机就可以与设备之间进行通信了。
usb通讯有四种通讯方式控制(control)、中断(interrupt)、批量(bulk)和同步( synchronous)。usb通讯是通过管道(pipe)实现的。管道是一个抽象的概念,指的是主机与设备之间通讯的虚拟链路。不如说一个usb通讯 主机A和设备B,其中有bulk in(批量输入)、bulk out(批量输出)、control out(控制输出)三种通讯方式,那么A与B之间的通讯管道就有三个。(这里明确一个概念,在usb通信中数据流向都是相对设备来说的,in表示设备向主 机传送数据,out表示表示主机箱设备传输数据)。在设备一端,每个管道对应一个端点,端点配置相关的寄存器和缓冲区。在通讯之前需对端点进行相关设置。 在通信中,只需向缓冲写或读数据,并置位相关比特位即可。
下面具体从usb的中断输入输出来讲述基于keil C mdk开发环境的stm32的USB接口单片机程序设计。值得一提的是,st或相关公司给我们提供许多封装函数和相关例子,我们可以根据其中的例子并进行修改即可实现我们自己需要的usb通讯程序。
1.usb描述符配置
从上面的讲述可以看出,usb描述符是usb通讯的前提。主机必须先了解设备后才能与其进行通讯。在st提供的例子中,描述符都在usb_des.c文件进行定义,下面就其中的Joystick例子说明usb描述负的配置。
1.1设备描述符
const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
{
0x12, /*本描述长度*/
USB_DEVICE_DESCRIPTOR_TYPE, /*指明为设备描述符*/
0x00,
0x02,
0x00,
0x00,
0x00,
0x40, /*最大数据包大小为64字节(对于端点0而言)*/
0x84, /*生产商ID*/
0x19,
0x06, /*产品ID*/
0x04,
0x00,
0x02,
1,
2,
3,
0x01 /*配置描述符数目*/
}
设备描述符两个重要参数是生产商ID和产品ID,主机将根据以上两个ID为设备选择相应驱动程序。在我们的应用中,我们一般只需修改例子中的这儿两个参数即可完成设备描述符的设置。
1.2配置描述符
const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
{
0x09,
USB_CONFIGURATION_DESCRIPTOR_TYPE,
JOYSTICK_SIZ_CONFIG_DESC,
0x00,
0x01, /*接口数目*/
0x01, /*Set_Configuration命令所需要的参数值*/
0x00, /*描述该配置的字符串的索引值*/
0xE0, /*供电模式的选择,bus供电、自供电、支持wakeup*/
0x32, /*最大供电电流*/
/************** 接口1配置****************/
0x09,
USB_INTERFACE_DESCRIPTOR_TYPE,
0x00, /*接口编号*/
0x00,
0x02, /*端点数*/
0x00,
0x00,
0x00,
0, /*接口描述符索引值*/
/******************** 端点1输出描述********************/
0x07,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x81, /*端点地址,b.7表示方向(1为in,0为out)b.0-b.3为端点标号*/
0x03, /*端点数据传输方式*/
0x08, /*最大数据包大小*/
0x00,
0x20,
/******************** 端点1输入描述********************/
0x07,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x01, /*端点地址*/
0x03, /*端点数据传输方式*/
0x40, /*最大数据包大小*/
0x00,
0x20,
}
配置描述符中包括了接口、端点的配置。如果设备为HID设备,在配置描述符中还应加入HID描述,具体描述可以参照Joystick例子的配置。
还有一些其他配置可以参可相关资料与例子加以理解。
史海拾趣
|
想求求各位大虾帮帮忙 看看用单片机控制步进电机正反转 调速 怎么弄 步进电机驱动是 用tb6560做的 我买了 步进驱动器--tb6560ahq-v2.0(0.5-3A ,2、8、1 ...… 查看全部问答> |
|
FLASH换成spansion S29GL了,可jtag无法写进去。好像不支持这片子。。用flash烧写器太麻烦。。 我应该怎么办?哪位高人有这片子的jtag烧写软件? 谢谢!· … 查看全部问答> |
|
需要写一个IE浏览器 请问怎么能检测到当前网络状态(应该是IE的状态)是否连上或者断开, 通过检测无线网卡的方式经过实验发现不行,因为无线网卡的驱动好象也不是时时检测这个连接状态的,我把AP断开,无线网卡的信号还很强, 现在想通过判断IE ...… 查看全部问答> |
|
USB 12Mbps的频率误差允许0.25%。而stm32f的HSI允许以40kHz左右的步长调节(改变HSITRIM的值)。40kHz/8MHz=0.5%,可惜呀。如果能以10kHz的步长调节HSI频率,同时保证HSI频率一定的稳定度,就可以用32768单晶振实现USB了!!!希望ST改进 ...… 查看全部问答> |
|
STM32开源开发环境的搭建EclipseSourceryG++ 中间有一段时间没来的及做,现在的进展是我用了3.4的固件库编译之类的都能通过,下载还没弄好,但是郁闷的是同样的程序烧进去却无法运行,哪位做过的给点提示,也欢迎大家讨论。 这两天在尝试着搭建Eclipse+ GNU ARM Eclipse Plug-in+ Sour ...… 查看全部问答> |




