USB简介
1.1,USB是什么?
USB,英文全称:Universal Serial Bus,即通用串行总线
USB提供适合各种应用的传输协议,而且协议标准向下兼容
USB的优缺点
USB的优点 | USB的缺点 |
---|---|
1,支持热插拔 2,差分信号传输,抗干扰能力较强 3,USB2.0总线可提供5V/500mA的电源 4,传输速率快 5,易于扩展:可通过Hub连接多个设备 6,应用广泛:鼠标键盘、游戏手柄、打印机、移动硬盘、数码相机、U盘、USB声卡、USB扫描仪、USB摄像头、USB网卡、USB口的仪表仪器…… | 1,供电能力较差 2,传输距离较短 3,协议比较复杂 |
1.2,USB2.0拓扑结构
USB是一种==主从结构==的系统,数据交换只能发生在主从设备之间,且只能由主机主动发起。
==USB主机==具有一个或者多个==USB主控制器==(Host controller)和==根集线器==(Root Hub)
==USB主控制器==:主要负责数据处理
==根集线器==:提供一个连接主控制器与设备之间的接口和通路
==USB从机==可以是各种USB设备也可以是==USB集线器==
==USB集线器==(USB Hub):用于对原有的USB接口数据进行扩展,但不能扩展更多的带宽
USB OTG作为USB协议的补充版,允许同一设备,在不同场合下,在主机和从机之间切换。
USB2.0拓扑结构图
USB2.0协议中规定最多扩展6层总线上最多可连接127个设备每个USB设置具有一个7bit的地址每层Hub最大运行串联5个设备线缆长度最长5米。
1.3,USB2.0电气特性
在USB OTG中,比标准的USB多了一根身份 识别(ID)线,用来表明是主机还是从机
USB2.0支持3种传输速度:低速模式(1.5Mb/s)、全速模式(12Mb/s)、高速模式(480Mb/s)
USB实际的数据速率比上述的低一些, 因为有很多协议开销,例如: 同步、令牌、校验、位填过充
SUB的插入检测机制
在USB主机的D-和D+均接了1.5KΩ的下拉电阻,所以在没有设备接入时,D+、D-均位低电平
在USB从设备中,均接了一个1.5KΩ的上拉电阻到VCC:
- 全速/高速设备,接在D+上
- 低速设备,接在D-上
1.4,USB学习资料
STM32 USB学习资料
要驱动STM32的USB,就得编写USB驱动,USB驱动的编写非常复杂,所以我们直接用ST给我们提供的USB驱动库来开发,后面的课程将带大家来==移植ST官方开发板的USB例程==
STM32的USB介绍
2.1,STM32的USB特性
==STM32的USB的详细特性请参考对应系列的参考手册==
2.2,STM32 USB框图
(F1)
==48MHz的USB时钟由锁相环经过1.5分频得到==
(F4/F7)
==通过AHB总线访问(AHB总线频率必须大于14.2MHz)==
==48MHz的USB时钟来自于PLL48CLK==
(H7)
==通过AHB总线访问(AHB总线频率必须大于30MHz)==
==48MHz的USB时钟来自于HSI48==
2.3,开发板硬件连接
(战舰V4)
(精英V2)
(MINI V4)
(探索者V3)
2.4,STM32 USB驱动库简介
2.5,USB相关实验(探索者V3)
探索者V3 相关实验 | 移植的STM324xG_EVAL开发板相关实验 |
---|---|
实验51 USB读卡器(Slave)实验 | USB_Device\MSC_Standalone |
实验52 USB声卡(Slave)实验 | USB_Device\AUDIO_Standalone |
实验53 USB虚拟串口(Slave)实验 | USB_Device\CDC_Standalone |
实验54 USB U盘(Host)实验 | USB_Host\MSC_Standalone |
实验55 USB 鼠标键盘(Host)实验 | USB_Host\HID_Standalone |
USB读卡器(Slave)实验
(探索者V3为例)
移植的基础工程:A盘\4,程序源码\==2,标准例程-HAL库版本\实验38 SD卡实验==
实验功能:移植ST官方的USB_Device\MSC_Standalone例程到SD卡实验 ,变成USB读卡器实验,该实验支持两个磁盘,可以通到电脑进行读写操作。两个磁盘对应的硬件分别是TF卡和SPI FLASH。
步骤1:查看ST官方的MSC列程
步骤2:拷贝工程所需文件
步骤3:MDK工程设置
步骤4:修改usbd_storage.c
关键修改如下:
- 添加
g_usb_state_reg
变量,记录磁盘操作状态 - 修改
STORAGE_Inquirydata
数组,并新增一个磁盘的描述 - 修改存储设别初始化函数
STORAGE_Init
- 修改获取存储设别的容量和块大小函数
STORAGE_GetCapacity
- 修改查看存储设别身份就绪函数
STORAGE_IsReady
- 修改从存储设备读取数据函数
STORAGE_Read
- 修改向存储设备写数据函数
STORAGE_Write
- 修改获取支持的最大逻辑单元个数函数
STORAGE_GetMaxLun
步骤5:修改usbd_conf.c/h
.h
关键修改如下:
- 修改
#define MSC_MEDIA_PACKET
的值为32 * 1024,值越大,速度越快 - 修改
#define STORAGE_LUN_NBR
的值为2,支持2个磁盘 - 修改下面两个宏,具体如下:
#define USBD_malloc(x) mymalloc(SRAMIN,x)
#define USBD_free(x) myfree(SRAMIN,x)
.c
关键修改如下:
- 添加
g_device_state
变量,记录USB连接状态 - 修改
HAL_PCD_MspInit
函数和重定义OTG_FS_IRQHandler
中断服务函数 - 修改相关
USBD LL PCD
驱动的回调函数,方便指示USB的连接情况
步骤6:修改usbd_msc.h
- 关键修改如下:
uint32_t scsi_blk_addr;
修改成:uint64_t scsi_blk_addr;
以支持大于4G的IF卡。
uint32_t scsi_blk_nbr;
修改成:
uint32_t scsi_blk_nbr[STORAGE_LUN_NBR];
将scsi_blk_nbr改为数组形式,否则无法支持多个磁盘!
步骤7:其他文件的scsi_blk_nbr
变量改成数组
涉及的修改如下:
usbd_scsi.c
文件的SCSI_ReadCapacity10()、SCSI_ReadCapacity16()、SCSI_CheckAddressRange()
三个函数usbd_msc_bot.c
文件的MSC_BOT_CBW_Decode()
函数
步骤8:修改main.c
文件
经过前面的处理,最后直接使用USB读卡器(Slave)实验的main.c
源码即可。
USB声卡(Slave)实验
移植的基础工程:A盘\4,程序源码\`2,程序例程-HAL库版本\实验51 USB读卡器(Slave)实验`
实验功能:移植ST官方USB_Device\AUDIO_Standalone例程到USB读卡器(Slave)实验,变成USB声卡(Slave)实验。移植成功后,电脑会把探索者开发板的USB_SLAVE接口识别为USB声卡设备,此时,电脑的所有声音都可以通过探索者开发板的哪吧或者耳机输出。
步骤1:查看ST官方的AUDIO例程
步骤2:拷贝工程所需文件
步骤3:MDK工程设置
步骤4:修改usbd_audio.c
关键修改如下:
- 添加
g_usbd_audio_dataout_en
变量,记录USB数据输出状态 - 在
USBD_AUDIO_DataOut
函数设置g_usbd_audio_dataout_en=1
步骤5:修改usbd_conf.c/.h
.h
关键修改如下:
1、修改下面两个宏,具体如下:
#define USBD_malloc(x) mymalloc(SRAMIN,x)
#define USBD_free(x) myfree(SRAMIN,x)
.c
关键修改如下:
- 添加
g_device_state
变量,记录USB连接状态 - 修改
HAL_PCD_MspInit
函数和重定义OTG_FS_IRQHandler
中断服务函数 - 修改相关
USBD LL PCD
驱动的回调函数,方便指示USB的连接情况
步骤6:修改usbd_audio_if.c/.h
.h
关键修改如下:
- 添加
BSP_AUDIO_OUT_TransferComplete_CallBack()
函数声明
.c
关键修改如下:
#include "stm324xg_eval_audio.h"
修改成:#include "stm32f407_audio.h"
BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_AUTO,Volume,AudioFreq);
修改成:BSP_AUDIO_OUT_Init(0,Volume,AudioFreq);
BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW);
修改成:BSP_AUDIO_OUT_Stop(0);
步骤7:修改stm32f407_audio.c/.h
涉及的修改如下:
- 添加
g_volume
变量,记录当前音量 - 添加
I2S DMA
传输回调函数bsp_audio_i2s_dma_callback
- 修改配置音频接口函数
BSP_AUDIO_OUT_Init
- 修改开始播放音频数据函数
BSP_AUDIO_OUT_play
- 修改切换音频数据流
buffer
,每次DMA中断完成会调用该函数BSP_AUDIO_OUT_ChangeBuffer
- 修改停止播放函数
BSP_AUDIO_OUT_Pause
和BSP_AUDIO_OUT_Stop
- 修改音量设置函数
BSP_AUDIO_OUT_SetVolume
- 修改静音设置函数
BSP_AUDIO_OUT_SetMute
步骤8:修改main.c
经过前面的处理,最后直接使用USB声卡(Slave)实验的main.c
源码即可。