USB学习(上)
1.USB是universal serial Bus 通用串行总线
USB 3.2 Gen1是USB3.0, USB 3.2 Gen2 是USB3.1
2.USB优缺点
优点:
1.支持热插拔:用户无需关闭系统或断电即可插入或拔出 USB 设备的能力,这种功能大大增强了用户操作的便捷性和灵活性,使得外设的连接和断开变得非常简单和安全。
2.USB信号使用差分信号传输,所以抗干扰能力强
3,USB2.0总线可提供5V/500ma电源
4,传输速率快
5,易于扩展,可通过Hub(集线器)连接多个设备
6,应用场景:鼠标键盘,游戏手柄,打印机,移动硬盘
缺点:
1.供电能力较差 USB2.0供电是5V/500mA 所以在开发板中有USB接口,当开发板接上了屏幕或其他模块后,光靠USB5V/500mA会照成供电能力不足,所以添加了一个12V/100mA的外接电源
2,传输距离较短 只有几米
3,协议比较复杂 协议比较复杂
3.USB2.0拓扑结构
USB只能在主从之间传输,且只能由主机主动发起,数据交换只能发生在主从设备之间
USB主机具有一个或多个USB主控制器(Host controller)和根集线器(root Hub)
USB集线器:用于对原有USB接口数量进行扩展,但不能扩展更多的带宽,无论集线器上连接多少个USB线,它们都是共享3.0(举例)的带宽
USB 的OTG(ON-THE-GO)作为USB协议的补充版本,允许同一设备,在不同场合,在主机和从机之间进行切换 这点非常重要
USB拓扑结构图 Hub集线器 Func:功能设备
每个USB设备具有一个7bit地址,1~127地址可以,0不可用,被其他占用了
USB2.0协议中规定最多可扩展6层,加上底层总共7层,每层Hub最大允许串联5个设备,线缆长度最长5m,所以最大长度就是30m,距离越长干扰因素越多
4.USB2.0电气特性
标准USB总线
VBus: 5V的电源线
D+: 差分数据线正 D-:差分数据线负 地线:(GND) 做成双绕线提高抗干扰能力
USB_OTG多了一根OTG线
USB2.0支持3种传输速度:低速模式(1.5Mb/s),全速模式(1.2Mb/s),高速模式(480Mb\s)
USB实际速率会比上述低一些,因为协议有很多开销,例如:同步,令牌,校验
实际熟虑会低一点的原因是要启动+发生器件ID+寄存器地址+最后才发生数据,和IIC类似,
插入了这么多设备,具体要和哪个设备通信,所以有设备开销
5.USB的插入检测机制
在USB的D-和D+均接了15K欧姆的下拉电阻,所以在没有设备接入时候,D+和D-均为低电平
在USB从设备中,均接了一个1.5K欧姆的上拉电阻到VCC 在全速设备中,会把上拉3.3v电阻接到D+, 在低速设备中,会把上拉电阻3.3v接到D-
作用:在高速设备中,当主设备有设备接入,主机与从机相连D+接口获得(15/16)*3.3V的电压
在低速中,则是主机设备的D-接口获得(15/16)*3.3V电压
主机识别到D+,D-为10就是高速,识别到01就是低速
6.USB学习资料 难点(协议)
USB驱动编写非常复杂,移植ST的官方驱动
可参考正点原子相关ppt学习
7.STM32的USB特性
1.
F1系列没有USB_OTG,不支持主从模式切换,其他系列如F4,F7,H7支持主从模式切换,
F1的USB和CAN共享同一个512字节的SRAM,所以不能同时使用,STM32F4-F7系列芯片内部内置了D+,D-内置1.5k上拉电阻。可以配置,支持软件断开功能,但F1系列Stm32系列里面没有
2.USB框图
F1系列 将锁相环(PLL)时钟72M分配1.5分配得到USBCLK 得到48Mhz给USB端口
主控访问USB外设通过APB1总线来访问 PCLK1是控制时钟,通过主控来控制USB
STM32 F4/F7 USB框图
H7框图 在外部可添加PHY芯,因为有高速传输 没有焊接这个芯片 用下面这个串行接口
DP代表D+,DM代表D-
开发板硬件连接
从机D+口上拉VCC,就是高速设备检测用的
用跳线帽连接,加了两个10R的电阻用处是抗干扰
10欧姆的电阻加在D+合并两端和D-合并两端,作用是抗干扰 USB_Typec
探索者V3可以作为主机,也可以作为主机
USB主机:通过PA15 USB-PWR控制三极管从而控制MOS关是否让USB-HOST给连接USB-HOST的从机供电
,PA15置1供电,置0不供电
USB从机接口和USB主机接口,USB_HOST和USB_SLAVE公用D+和D-,故不可同时连接
8.USB驱动库介绍
分为主机库和从机库,库里面有类
驱动硬件,要用到USB设备内核,配合驱动进行编写
USB相关实验
USB虚拟串口实验
用到例程里面的文件
步骤1:
步骤2
步骤3:在自己的工程里面设置工程名以及分组名 然后在分组添加对应的.c文件
USB_CORE:核心
USB_CLASS:类
USB_APP:用户代码
步骤4:魔术棒设置,要添加USB_USB_FS这个宏
步骤5,修改usbd_conf.c/.h
步骤6
步骤7
函数分析
0x8000 = 1000 0000 0000 0000二进制 ,第15位置1表示接收完成标志
位14 回车的ASCII码值0x0d表示回车 换行的ASCII码值为0x0a 10
/**
* @brief 处理从 USB 虚拟串口接收到的数据
* @param buf : 接收数据缓冲区
* @param len : 接收到的数据长度
* @retval 无
*/
void cdc_vcp_data_rx (uint8_t *buf, uint32_t Len)
{
uint8_t i;
uint8_t res;
for (i = 0; i < Len; i++)
{
res = buf[i];
if ((g_usb_usart_rx_sta & 0x8000) == 0) /* 接收未完成 */
{
if (g_usb_usart_rx_sta & 0x4000) /* 接收到了0x0d */
{
if (res != 0x0a)
{
g_usb_usart_rx_sta = 0; /* 接收错误,重新开始 */
}
else
{
g_usb_usart_rx_sta |= 0x8000; /* 接收完成了 */
}
}
else /* 还没收到0X0D */
{
if (res == 0x0d)
{
g_usb_usart_rx_sta |= 0x4000; /* 标记接收到了0X0D */
}
else
{
g_usb_usart_rx_buffer[g_usb_usart_rx_sta & 0X3FFF] = res;
g_usb_usart_rx_sta++;
if (g_usb_usart_rx_sta > (USB_USART_REC_LEN - 1))
{
g_usb_usart_rx_sta = 0; /* 接收数据溢出 重新开始接收 */
}
}
}
}
}
}
步骤8,修改main.c文件
最后一步USB虚拟串口实验(校验)
哈哈哈哈哈哈哈哈哈哈