裸机 · 2024年 3月 23日 0

USB

USB简介

1.1,USB是什么?

USB,英文全称:Universal Serial Bus,即通用串行总线

USB提供适合各种应用的传输协议,而且协议标准向下兼容

image-20240315114404469

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拓扑结构图

img

USB2.0协议中规定最多扩展6层总线上最多可连接127个设备每个USB设置具有一个7bit的地址每层Hub最大运行串联5个设备线缆长度最长5米。

1.3,USB2.0电气特性

img
image-20240315141329340

在USB OTG中,比标准的USB多了一根身份 识别(ID)线,用来表明是主机还是从机

USB2.0支持3种传输速度:低速模式(1.5Mb/s)、全速模式(12Mb/s)、高速模式(480Mb/s)

USB实际的数据速率比上述的低一些, 因为有很多协议开销,例如: 同步、令牌、校验、位填过充

SUB的插入检测机制

img

在USB主机的D-和D+均接了1.5KΩ的下拉电阻,所以在没有设备接入时,D+、D-均位低电平

在USB从设备中,均接了一个1.5KΩ的上拉电阻到VCC:

  1. 全速/高速设备,接在D+上
  2. 低速设备,接在D-上

1.4,USB学习资料

STM32 USB学习资料
要驱动STM32的USB,就得编写USB驱动,USB驱动的编写非常复杂,所以我们直接用ST给我们提供的USB驱动库来开发,后面的课程将带大家来==移植ST官方开发板的USB例程==

STM32的USB介绍

2.1,STM32的USB特性

image-20240315145905976

==STM32的USB的详细特性请参考对应系列的参考手册==

2.2,STM32 USB框图

(F1)

image-20240315153116582

==48MHz的USB时钟由锁相环经过1.5分频得到==

(F4/F7)

image-20240315153410743

==通过AHB总线访问(AHB总线频率必须大于14.2MHz)==

==48MHz的USB时钟来自于PLL48CLK==

(H7)

image-20240315153649033

==通过AHB总线访问(AHB总线频率必须大于30MHz)==

==48MHz的USB时钟来自于HSI48==

2.3,开发板硬件连接

(战舰V4)

image-20240315161247852

(精英V2)

image-20240315165135328

(MINI V4)

image-20240315165626795

(探索者V3)

image-20240315165821611
image-20240315165738544

2.4,STM32 USB驱动库简介

image-20240315170347201

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列程

image-20240318101738962

步骤2:拷贝工程所需文件

image-20240318113838229

步骤3:MDK工程设置

image-20240318113828282

步骤4:修改usbd_storage.c

关键修改如下:

  1. 添加g_usb_state_reg变量,记录磁盘操作状态
  2. 修改STORAGE_Inquirydata数组,并新增一个磁盘的描述
  3. 修改存储设别初始化函数STORAGE_Init
  4. 修改获取存储设别的容量和块大小函数STORAGE_GetCapacity
  5. 修改查看存储设别身份就绪函数STORAGE_IsReady
  6. 修改从存储设备读取数据函数STORAGE_Read
  7. 修改向存储设备写数据函数STORAGE_Write
  8. 修改获取支持的最大逻辑单元个数函数STORAGE_GetMaxLun

步骤5:修改usbd_conf.c/h

.h关键修改如下:

  1. 修改#define MSC_MEDIA_PACKET的值为32 * 1024,值越大,速度越快
  2. 修改#define STORAGE_LUN_NBR的值为2,支持2个磁盘
  3. 修改下面两个宏,具体如下:
   #define USBD_malloc(x)   mymalloc(SRAMIN,x)
   #define USBD_free(x)     myfree(SRAMIN,x)

.c关键修改如下:

  1. 添加g_device_state变量,记录USB连接状态
  2. 修改HAL_PCD_MspInit函数和重定义OTG_FS_IRQHandler中断服务函数
  3. 修改相关USBD LL PCD驱动的回调函数,方便指示USB的连接情况

步骤6:修改usbd_msc.h

  1. 关键修改如下:
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变量改成数组

涉及的修改如下:

  1. usbd_scsi.c文件的SCSI_ReadCapacity10()、SCSI_ReadCapacity16()、SCSI_CheckAddressRange()三个函数
  2. 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例程

image-20240318162858735

步骤2:拷贝工程所需文件

image-20240318163043285

步骤3:MDK工程设置

image-20240318163328160

步骤4:修改usbd_audio.c

关键修改如下:

  1. 添加g_usbd_audio_dataout_en变量,记录USB数据输出状态
  2. 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关键修改如下:

  1. 添加g_device_state变量,记录USB连接状态
  2. 修改HAL_PCD_MspInit函数和重定义OTG_FS_IRQHandler中断服务函数
  3. 修改相关USBD LL PCD驱动的回调函数,方便指示USB的连接情况

步骤6:修改usbd_audio_if.c/.h

.h关键修改如下:

  1. 添加BSP_AUDIO_OUT_TransferComplete_CallBack()函数声明

.c关键修改如下:

  1. #include "stm324xg_eval_audio.h"修改成:#include "stm32f407_audio.h"
  2. BSP_AUDIO_OUT_Init(OUTPUT_DEVICE_AUTO,Volume,AudioFreq);修改成:BSP_AUDIO_OUT_Init(0,Volume,AudioFreq);
  3. BSP_AUDIO_OUT_Stop(CODEC_PDWN_SW);修改成:BSP_AUDIO_OUT_Stop(0);

步骤7:修改stm32f407_audio.c/.h

涉及的修改如下:

  1. 添加g_volume变量,记录当前音量
  2. 添加I2S DMA传输回调函数bsp_audio_i2s_dma_callback
  3. 修改配置音频接口函数BSP_AUDIO_OUT_Init
  4. 修改开始播放音频数据函数BSP_AUDIO_OUT_play
  5. 修改切换音频数据流buffer,每次DMA中断完成会调用该函数BSP_AUDIO_OUT_ChangeBuffer
  6. 修改停止播放函数BSP_AUDIO_OUT_PauseBSP_AUDIO_OUT_Stop
  7. 修改音量设置函数BSP_AUDIO_OUT_SetVolume
  8. 修改静音设置函数BSP_AUDIO_OUT_SetMute

步骤8:修改main.c

经过前面的处理,最后直接使用USB声卡(Slave)实验的main.c源码即可。

USB虚拟串口(Slave)实验

USB U盘(Host)实验

USB 鼠标键盘(Host)实验

课堂总结