产品概述

单片机usb编程 单片机外围模块漫谈之五,USB开发,别犯这个错误

小编 2024-10-06 产品概述 23 0

单片机外围模块漫谈之五,USB开发,别犯这个错误

1.

概述

我们已经对USB硬件和数据的四种传输类型有了一个基本的了解。

控制传输(Control Transfers)

批量传输(Bulk Data Transfers)

中断传输(Interrupt Data Transfers)

同步传输(Isochronous Data Transfers):

下面我们通过一个例子看一下USB的具体工作过程。在此我们用一个比较实用的例子,就是把我们的板子用USB连接至PC,然后在PC端出现一个模拟串口,通过串口助手打开这个串口,然后实现数据的双向传输。最后我们聊一下很多工程师都会忽视的USB认证问题。

2.

例程

我们打开ST的Cube库中的CDC例程:

STM32Cube_FW_F1_V1.8.0\Projects\STM3210C_EVAL\Applications\USB_Device\CDC_Standalone\MDK-ARM\Project.uvprojx

这个例程用到USB的同时还会用到USART,USB从PC端收到数据后会转发到USART,从USART接收到消息会上传至PC。我们可以把USART的TX和RX短接,这样从PC端下发的数据会原样回传给PC端。

这个例程使用的硬件是STM3210C-EVAL,原理图可以在stmcu.org.cn找到。如果我们使用的是其它板子,就需要在这个工程基础上做一些改动。比如现在我们使用STM32F105RBT6,8M晶振,串口用PTA2,PTA3,那么我们的要做如下修改:

首先,修改使用的MCU:

然后修改时钟初始化部分。下图为STM32F105时钟模块示意图。USB工作需要48MHz的时钟。

(STM32F105xx Datasheet)

如果板子的晶振是8M,那么参数需要做如下配置:

(OSC IN = 8M)

PREDIV1SRC = 0b0, HSE oscillator clock selected as PREDIV1 clock entry

PREDIV1 = 0b0, PREDIV1 input clock not divided

PLLSRC = 0b1, Clock from PREDIV1 selected as PLL input clock

PLLMUL = 0b0111, PLL input clock x 9

(PLLCLK = 72M)

SW = 0b10, PLL selected as system clock

PLLVCO = 2*PLLCLK = 144M

USBPRE = 0, PLL clock is divided by 1.5 (or PLLVCO/3)

USB Clock = = PLLCLK/1.5 = 72M/1.5 = 48M

例程中的对应代码修改:

最后修改使用的串口引脚:

stm32f1xx_hal_msp.c

//AFIOCOMx_REMAP(0); // Remap USART2 to PTD5/6

usbd_cdc_interface.h

/* Definition for USARTx Pins */

//#define USARTx_TX_PIN GPIO_PIN_5

//#define USARTx_TX_GPIO_PORT GPIOD

//#define USARTx_RX_PIN GPIO_PIN_6

//#define USARTx_RX_GPIO_PORT GPIOD

#define USARTx_TX_PIN GPIO_PIN_2

#define USARTx_TX_GPIO_PORT GPIOA

#define USARTx_RX_PIN GPIO_PIN_3

#define USARTx_RX_GPIO_PORT GPIOA

终于可以编译运行了,用USB线把板子连到PC的USB口,记得把板子的PTA2和PTA3引脚短接起来。在设备管理器我们看到多出来一个串口,看它的属性会看到它的VID,PID跟我们程序中设置的一致。

用串口助手打开此串口,发送字符串,会看到返回同样的字符串。

下面我们来看一下具体的工作过程。

3. USB枚举(Enumeration)

当我们给设备上电,程序控制芯片内集成的上拉电阻连接至USBDP时,USB主机(PC端)会检测到这一变化并向设备供电。此时设备处于Powered状态。

主机等待100ms设备稳定后复位并使能此端口,此时设备可以从Vbus获取不超过 100mA 的电流,其默认地址是0,处于Default状态。

主机通过0地址向该设备发送Get_Descriptor标准请求,获取设备的描述符。主机再次复位该PORT,并发送标准请求Set_Address给设备分配一个地址,之后的通信都是用此地址,设备进入Address状态。

主机通过新地址向设备再次发送Get_Descriptor标准请求,获取设备描述符。发送Get_Configuration请求,获取配置描述符。一个设备可以有多个配置,主机选择合适配置,通过 Set_Configuration请求对设备而进行配置,设备进入Configured状态。

USB的枚举过程是标准的,所以库里也有对应的标准处理代码。我们可以不用关心。好了,现在可以开始数据的双向传输了。

4. 数据传输

我们已经了解所有USB传输都是由USB主机(Host)发起的,作为USB设备只能是被动的等待。当Host下发请求时会在设备中产生各种中断,设备完成各种中断的处理就行了。其中需要特别关注的有两个:

OEPINT(Output Endpoint Int),表明主机下发了数据。

IEPINT(Output Endpoint Int)。表明主机请求设备上传数据。

那么用户在代码里如何收发USB数据的呢?

我们在usbd_cdc_interface.c里关注下面这些就够了:

uint8_t UserRxBuffer[APP_RX_DATA_SIZE]; //USB下发数据缓冲区

uint8_t UserTxBuffer[APP_TX_DATA_SIZE]; //需要发给USB上位机的数据缓冲区

下面这个函数是用户用来处理接收缓冲区数据的,在初始化时需要传递给USB驱动,然后驱动收到USB下发的数据后会回调此函数。在例程中此函数把接收数据转发给了USART2。当然你也可以什么都不做。

static int8_t CDC_Itf_Receive(uint8_t * Buf, uint32_t * Len);

那么如果有数据需要发给上位机呢?我们可以用下面这个函数:

USBD_CDC_TransmitPacket(&USBD_Device);

注意此数据是先放入IN端点,然后等待IEPINT中断发生时才被取走发送。

5. 一个重要又容易被忽视的问题

至此好像万事大吉了。

等等,如果产品这样发出去,你可能给公司惹麻烦了!

还有一个很重要的问题我们千万不要忽视,就是VID和PID,即厂商识别符(Vendor ID)和产品识别符(Product ID)。我们例程中使用的是VID 0x0483, PID 0x5740。这个VID是专门分配给ST的,虽然我们用这个号程序也能运行,但是不符合规范的。我们的可以在 usb.org/developers 网站查到当前为所有USB厂商分配的VID。如果我们要开发USB设备,还要向USB组织申请自己的VID,之后还要做微软徽标认证,就可以畅行无阻了。

参考资料:

UM1734 STM32Cube USB device library

USB Specification 2.0

Universal Serial Bus Class Definitions for Communications Devices 1.2

STM32F105xx Datasheet

STM32F105xx RM

单片机编程新方式:通过手机蓝牙

micro:bit单片机开发板买来很久了,都是通过电脑连接USB数据线的方式来给bit编程。

刚才看到苹果APP商店无意发现这个板子还有一个专门适配的应用mirbit:bit。

所以立马就下载了,用这个APP体验一下用手机给单片机编程,而且是通过无线的方式。

主界面

很简洁的主界面,连接蓝牙、编写代码与FLASH都有了。

编程界面有两种,分别是图形化和文本编程

图形化编程界面

先用图形化编程来让bit的LED矩阵显示一个十字架的图案,直接在屏幕上点击要显示的LED灯就可以了,然后点击下载按钮,用不了几秒钟程序就会被烧录到板子上。

接下来看一下实验结果

出现了我们预先设计的十字架图案。

这个LED灯矩阵对bit来说简直是小菜一碟,还有很多高级功能我们没有用到,比如语音、通讯这些个。

因为没有足够多的外设,暂且先演示LED矩阵这个功能吧,后边买一些适配这个板子的小模块,做一些更好玩的功能!

相关问答

单片机 usb 怎么连接?

单片机与电脑连接一般有以下几种:1、RS232串口连接,这是最普遍的连接方式。2、RS232-usb,这种方式越来越受欢迎。3、JTAG--JLINK--USB(RS232),主要用于...

usb 接口怎么下载到 单片机 里面?

您好:看你使用什么样的单片机,如果是STC系列的,可以直接用串口线下载,也可以用USB下载线下载(USB下载线网上有得买),下载软件是这个:STC_ISP_V480.exe;...通...

怎么用 usb 单片机 供电-ZOL问答

USB口的1脚为+5V,4脚为GND,在你设计版时可以直接引用这个电源为单片机供电,如板上需要3.3V则再加个1117模块稳压输出3.3V使用时要注意:1、不要知路及反接2...

怎么写设备的 USB 驱动? 我用PC电脑做上位机,下位机是个 单片机 ...

如果你是开发上位机,就需要相关的IC来支持的,IC的作用是协议转换,将上位机的USB相关的协议格式转换为下位机的协议,下位机协议通常有SPI,IIC,UART等等。我目前...

51 单片机usb 驱动器怎么连接?

要连接51单片机与USB驱动器,您可以按照以下步骤进行:1.准备硬件:您需要准备一个51单片机开发板或自己设计的电路板,以及一个USB驱动器(如USB闪存驱动器)...

通过 USB 单片机 数据?

单片机串口是TTL电平输出,所以必须通过TTL-rs232转换,一般用max232芯片,很简单。本来可以直接接电脑的COM口9RS232电平)。但要求接USB口,所以,还必须要...

51 单片机 怎么连接 USB 接口进行数据传输?

1不支持USB,只有用串口,51用串口传输数据,像CH340这种芯片和51连一起就可以用USB通信了。还有就是232和485了。1不支持USB,只有用串口,51用串口传输数据,像CH...

如何用 单片机 实现 USB 与备用电源的切换供电?

想让USB与备用电源之间实现切换供电,最简单的方法添加一个二极管即可实现,没必要那么复杂使用单片机。▲备用电源自动切换电路。电路如上图所示。二极管VD在...

如何用 USB 为51 单片机 供电?

USB口的1脚为+5V,4脚为GND,在你设计版时可以直接引用这个电源为单片机供电,如板上需要3.3V则再加个1117模块稳压输出3.3V使用时要注意:1、不要知路及反接2...

stm8 单片机 通过 usb 接口与电脑进行通信,用什么转换芯片好?

单片机与电脑间的通信的方式一般是通过串口通信进行传输,因为单片机的电平协议和电脑USB端的协议不同,因此通常需要一款USB转换串口的芯片,这种芯片的种类非常...

猜你喜欢