5 我的基于STM32的USB学习笔记
更新时间:2024-06-19 03:40:01 阅读量: 综合文库 文档下载
- 58同城推荐度:
- 相关推荐
对USB的初步了解:
1、USB的优点:
可以热插拔,即插上后可以自动识别;
系统总线供电,USB共有四根线,一根电源线,一根地线,一根D+线,一根D-线,D+和D-线是差分输入线;
可以支持多种设备,且扩展容易,通过HUB可以再一个主机上连接多个设备 传输数据的速度快,最快可达480Mbit/s
方便的设备互联:在没有主机的情况下,实现点到点的通信(还可以实现主从互换)(USB OTG)
2、USB的基本规范:
USB1.0/1.1 低速情况下1.5Mbit/s:键盘、鼠标等 全速情况下12Mbit/s:U盘、CD-ROM USB2.0 高速达到480Mbit/s:音频设备、显示器等 USB OTG 设备到设备的传输 3、USB设备类规范:
大容量存储设备类(Mass Storage Device)U盘、CD-ROM等
人机交互设备类(Human Interface Device)键盘、鼠标、游戏手柄 语音设备类(Audio Device)麦克风、音响等
通信设备类(Communication Device)电话、调制解调器等 打印机设备类(Printer Device)打印机
监视设备类(Monitor Device)显示器、摄像头等
4、USB逻辑上分为3:信号层,协议层,数据传输层 协议层:
包是USB系统中信息传输的基本单位,所有的数据都是经过打包后在总线上传输的。 包由6部分组成:同步字段(SYNC);包标识符(PID);地址字段(ADDR);数据字段(DATA);检验字段(CRC);包结束(EOP) 包标识符(PID):令牌包(Token)(输出,输入,帧起始,建立),数据包(DATA)(数据,数据1),握手包(Handsnake)(确认,不确认,停止),专用包(Special)(前同步) 5、USB协议提供4种数据传输方式:
控制传输:突发,非周期性,由主机发起,用于命令和状态的传输
同步传输:周期性,持续性的传输,用于传输与时效相关的信息,并且在数据中保存时间戳的信息
中断传输:周期性,低频率,允许有限延迟的通信 大容量的数据传输:非周期性,大容量突发数据的通信 6、USB描述符:
1)设备描述符:描述设备的类型、厂商信息、USB的协议类型、端点的报数据的最大长度等,每个USB设备只有一个Device Descriptor
2)配置描述符:每个配置描述符提供了设备特定的配置,描述了设备的接口和端点的性质、供电模式、设备的耗电
3)接口描述符:描述了设备的不同接口的特性,例如,一个设备U盘的功能,又有键盘的功能,用两个接口描述符分别描述两个功能
4)字符串描述符:描述了设备制造商、设备名称、何序列号等信息
基于STM32制作USB的过程 STM32的USB模块特性: 遵循USB2.0全速设备标准
支持双向8个端点,8个IN端点和8个OUT端点(每个端点最大可使用512字节)
[ 每个端点都有一个缓冲区描述块,描述该端点使用的缓冲区地址、大小和需要传输的字节数]
硬件实现CRC自动生成/校验,NRZI编码/解码和bit-stuffing(位插入,位填充) 支持控制传输、中断传输、大容量传输和同步传输四种传输方式 支持USB的挂起和/唤醒 ***USB设备的实现过程*** 一、系统初始化
1、 初始化系统时钟,设置USB时钟
2、 配置USB中断,选择通道,设置优先级,使能中断 3、 配置GPIO
4、 USB的初始化,对描述符、设备的端点接口等的初始化 5、 FLASH的初始化 二、USB的枚举
枚举过程就相当于主机和设备建立连接的过程(接头),Host向Device询问一些东西,Device将自身的设备类型,如何进行通信报告给Host,这样,Host就知道怎么对Device进行操作。
在枚举过程中就是如何处理好SETUP事件,如果STM32 USB接收到正确的SETUP事
件,将响应函数CTR_SETUP0(),此事件是特殊的OUT事件,数据方向Host->Device,SETUP事件数据长度固定为8。
1、 在USB插入主机时,主机首先需要先对USB设备进行供电 2、 接着USB总线复位:
设置分组缓冲区描述表起始地址;
初始化端点0,设置发送和接收状态。默认所有的设备地址和端口地址都会初始化为0. 3、 USB主机往端点0的0地址位置发送获取设备描述符的请求。
/*发送请求属于控制传输的建立过程,控制传输包括建立过程,可选数据过程及状态过程,首先是主机发送一个令牌,其次是发送的数据,最后设备回应一个应答(握手包)*/
4、获取设备描述符信息
设备在接收到请求以后,首先需要对主机发送来的命令进行解析,并将要发送给主机的描述符信息填入USB缓冲区中,等待USB主机发送IN命令,主机在接收到设备发送来的ACK回应以后,发送IN令牌包,从而进入到数据过程,之前存储在USB缓冲区中的描述符信息发给主机,并等待主机的应答。主机在正确接收到设备描述符的信息时会返回一个确认信息。
5、主机给设备分配一个新的地址
该阶段是一个没有数据过程的控制传输。首先,在建立过程中主机往设备的端点0发送一个设备地址的请求,新地址在建立过程的数据包中。在建立过程之后直接进入到状态过程,在状态过程中,设备等待主机发送一个IN令牌包,收到IN令牌包后,设备就会返回一个数据包,如果主机确认该数据包正确接收,就会回应设备一个ACK,设备收到ACK之后启用新的设备地址 6、 主机重新获取设备描述符,配置描述符和字符串描述符(如果是HID还要获取报告描述
符等)
至此USB的枚举过程完成,主机可以根据枚举的过程了解到的设备信息对USB安装驱动程序,并对USB进行操作。
三、对程序的分析
1、 在Set_System()中首先配置了RCC时钟,在设置并开启USB的时钟
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
2、 对USB的引脚的设置,主要设置上拉电阻,对于此STM32板子而言是设置PC13为开
漏输出(GPIO_Mode_Out_OD)
3、 USB中断的设置,设置了USB_LP_CAN_RX0_IRQChannel中断,因为在USB传输的
过程中使用的是控制传输过程
4、 最后对USB的初始化,初始化USB的控制状态为IN_DATA状态,对一些需要使用的
指针的初始化,包括设备信息,设备标准请求,设备的支持等的初始化,供枚举过程的使用
至此,对于USB设备的初始化过程已经完成,接下来进行USB的主要程序部分,也就是枚举过程。
插上USB之后首先会进入中断过程,执行USB_Istr()函数中的操作,逐步进入枚举过程,接下来从中断操作开始分析
1、 进入中断执行USB_Istr()函数后,首先获得中断的状态,因为在初始化阶段,首先先
对USB进行了复位操作,所以直接可以进入Device_Property.Reset()函数进行复位操作。
得到USB的各类描述符值,设置报表地址为0x00,端点地址为0x00,又对USB的端点0和端点1的进行了初始化设置/*在usb_prop.c文件中*/
2、因为在USB枚举的阶段是通过控制传输的传输过程来实现的,所以数据的发送接收,通过CTR_LP()中断进入的
在这个函数中等待中断状态设置好,并且数据发送正确。然后检查是不是端点0的收发数据,因为在一开始枚举阶段首先是通过端点0来接收主机发来的数据,所以直接进入端点0的函数中if (EPindex == 0)。等地啊主机的IN命令if ((wIstr & ISTR_DIR) == 0),接着进入In0_Process();函数往主机中发送数据。进入In0_Process()函数以后首先要判断控制状态是IN_DATA、LAST_IN_DATA 、WAIT_STATUS_IN中的哪一个或者都不是。
等待数据的发送,假设是IN_DATA或LAST_IN_DATA,则进入数据发送阶段DataStageIn()函数,主要是发送开始存入缓存区中的数据,以描述符为主,发送给主机。 3、在主机接收到USB发送来的数据之后,主机会重新给USB分配新地址,这是进入中断在轮询时会检测到((wEPVal & EP_CTR_RX) != 0)进入到USB的接收状态,接着会执行Out0_Process();的主机输出,USB接收状态。此数据输出主机的过程与上面数据输入主机的过程相类似。也会初始化数据包长,并根据数据长度来进行数据的接收状态。
数据从主机SB和数据从USB写入主机主要由UserToPMABufferCopy()MAToUserBufferCopy()两个函数来完成
4、接下来主机会以分配给USB的新地址来与USB进行数据通信。通信过程与之前相类似,只是不再使用端点0,而是使用新地址,非0端点的处理。
接下来说一下USB不同的c文件的功能:
Usb_core.c枚举过程重要的函数在此列出,包括数据输出主机的函数DataStageOut()数据输入主机的函数DataStageIn(),非0数据包的建立Data_Setup0(),0数据包的建立NoData_Setup0(),还有主机发送的IN进程In0_Process(),主机发送的Out进程Out0_Process()。还有一些标准的配置函数,接口设置函数等等。
Usb_init.c这个c文件中只包含一个主要的函数USB_Init(),这里主要是对在usb_core.c中使用的重要指针的初始化,包括pinformation,pProperty和pUser_Standard_Requests这三个指针,另外就是在初始化状态时已经将usb的控制状态设置为IN_DATA状态。并将USB初始化为初始配置,上电,开始设备的状态为未连接状态等
Usb_int.c包含两个主要函数CTR_HP()和CTR_LP(),CTR_HP()用于处理高优先级中断,用于同步传输模式和批量模式(双缓冲区),CTR_LP()用于处理低优先级中断,用于控制传输,中断传输和批量传输(单缓冲区)。 Usb_mem.c包含两个函数PMAToUserBufferCopy()和UserToPMABufferCopy(),是将PMA缓冲区的数据传给用户,和将用户缓冲区数据传给PMA缓冲区的主要数据传输过程。 Usb_regs.c主要是调用宏,实现寄存器的操作,但是上层函数很少调用这些函数直接就是用宏。
Usb_pwr.c主要是包括对一些电源的配置,包括USB上电PowerOn(),USB断电PowerOff(),挂起函数Suspend(),处理唤醒恢复操作Resume_Init(),状态机处理和恢复函数Resume()
Usb_desc.c主要是对描述符的定义,有CustomHID_DeviceDescriptor[18],CustomHID_ConfigDescriptor[],CustomHID_ReportDescriptor[],CustomHID_StringLangID[],CustomHID_StringVendor[],CustomHID_StringProduct[],CustomHID_StringSerial[]。
Usb_prop.c是对一些获得描述符的设置,还有复位和初始化的设置,主要的函数是CustomHID_init()和CustomHID_Reset()两个函数
正在阅读:
5 我的基于STM32的USB学习笔记06-19
船用柴油机氮氧化物排放控制技术研究05-03
宪法宣传教育主题班会08-01
外研版高二英语说课稿105-13
语文作文六大写作要素(6)点题04-26
初中数学几何概念教学的实践探究 - 图文12-27
高效阅读复述感悟教学设计11-19
xxx局党组关于学习贯彻落实中国共产党党内监督条例和中国共产党问责条例情况的报告01-06
护基题库护理学基础05-09
水稻颖壳和浆片异常突变体ahl的基因定位05-16
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 基于
- 笔记
- 学习
- STM32
- USB
- 2005年全美中学数学分级能力测验--AMC8分析报告
- 《分类与整理》评课稿
- ADS计算差分线的混合S参数
- 冀教版八年级英语上Unit1-Unit3词组
- 第6讲 土地利用数据的准备
- (现代文阅读题解析汇编)2012年普通高等学校招生全国统一考试语
- 动物防疫检疫站的工作总结
- 河南中招语文试题解析版2015.7.13
- 水工运行规程
- 聚氨酯硬泡生产工艺
- 师德修养(答案版)
- 走进闽院第八届社团巡礼节
- 六年级-_找分数单位1的方法、练习
- 安徽省《住宅工程质量通病防治技术规程》(DB34-
- 六年级语文知识结构图(学生专用)
- 坚持依靠方针 实行以人为本
- u10 导学案
- PMP模拟试题(二)
- 2016年秋期广隆小学中队辅导员培训方案
- 湖南电网继电保护贯彻“六统一”新实施细则