当前位置: 首页 > article >正文

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虚拟串口实验(校验)

哈哈哈哈哈哈哈哈哈哈


http://www.kler.cn/a/388185.html

相关文章:

  • DAY6 线程
  • CLion配置QT开发环境
  • yolov7论文翻译
  • vue elementui el-dropdown-item设置@click无效的解决方案
  • 力扣.15 三数之和 three-sum
  • 灵活就业,真的等同于失业吗?“三无人员”如何齐短板获贷款
  • 「Mac玩转仓颉内测版1」入门篇1 - Cangjie环境的搭建
  • NLP之ASR之moonshine:moonshine的简介、安装和使用方法、案例应用之详细攻略
  • 如何设置定时关闭或启动整个docker而不是某个容器
  • GPIO 唤醒深度睡眠的esp32-c3
  • 如何找到养生生活视频素材?推荐几个优秀网站
  • 每日一题之成绩排序(进阶版)
  • springboot静态资源映射不生效问题
  • Node.js——fs模块-相对路径的bug与解决
  • 机器学习—多类
  • C++使用开源ConcurrentQueue库处理自定义业务数据类
  • MySQL的其他函数
  • Oracle简介、环境搭建和基础DML语句
  • 网络安全从入门到精通(特别篇IIl):应急响应之病毒蠕虫处置流程
  • 深度学习-张量相关
  • 解决 IntelliJ IDEA Maven 项目 JDK 版本自动变为 1.5 的问题
  • 硬件设备网络安全问题与潜在漏洞分析及渗透测试应用
  • 开源竞争-利用kimi编程助手搭建小程序(11)
  • 解决编译 fast-lio-lc 算法时遇到的error方法
  • uniapp uni-calendar日历实现考勤统计功能
  • 大数据机器学习算法与计算机视觉应用04:多项式