学习STM32的USB通信需要掌握的内容包括以下几个部分:USB基础知识、STM32 USB库的使用、USB设备工作模式的选择、USB设备描述符的配置、USB传输的实现。接下来将会详细介绍这些内容,并附上相关的示例代码。

一、USB基础知识

  1. USB是一种通用的串行总线标准,用于计算机与外设之间的连接和通信。它提供了高速、可靠、灵活的数据传输方式。
  2. USB的工作模式包括主机模式和设备模式,主机模式指的是计算机作为主控端,控制和管理外设,设备模式指的是外设作为被控端,接收主机的控制和指令。
  3. USB通信的基本单位是端点(Endpoint),每个USB设备都有若干个端点,用于数据的发送和接收。端点分为控制端点、批量传输端点和中断传输端点。

二、STM32 USB库的使用 ST公司提供了丰富的USB库,可在STM32微控制器上实现USB通信功能。使用前需要下载并安装对应的USB库文件。

示例代码:

#include "stm32f4xx.h"
#include "usb_device.h"

int main(void)
{
    // 初始化USB设备
    MX_USB_DEVICE_Init();

    while (1)
    {
        // 主循环
    }
}

三、USB设备工作模式的选择

  1. USB设备有两种工作模式:CDC模式(虚拟串口模式)和HID模式(人机接口设备模式)。选择合适的模式取决于实际需求。
  2. CDC模式适用于需要进行数据的发送和接收的应用,如串口调试、数据采集等。
  3. HID模式适用于需要与计算机进行人机交互的应用,如键盘、鼠标、游戏手柄等。

示例代码(CDC模式):

#include "usbd_cdc_if.h"

int main(void)
{
    // 初始化USB设备
    MX_USB_DEVICE_Init();

    while (1)
    {
        // 接收数据
        uint8_t rxBuffer[64];
        uint8_t rxLength = CDC_Receive_FS(rxBuffer, sizeof(rxBuffer));

        // 处理接收到的数据
        // ...

        // 发送数据
        uint8_t txBuffer[] = "Hello, USB!";
        CDC_Transmit_FS(txBuffer, sizeof(txBuffer));
    }
}

四、USB设备描述符的配置

  1. USB设备描述符是用于描述USB设备的一种数据结构,包含了设备的基本信息和功能描述。
  2. 设备描述符、配置描述符、接口描述符、端点描述符是USB设备描述符的核心部分。
  3. 需要根据实际应用需求,配置USB设备描述符的信息。

示例代码:

// 设备描述符
__ALIGN_BEGIN static uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
{
    0x12,                       // bLength
    USB_DESC_TYPE_DEVICE,       // bDescriptorType
    0x00,                       // bcdUSB
    0x02,
    0x00,                       // bDeviceClass
    0x00,                       // bDeviceSubClass
    0x00,                       // bDeviceProtocol
    USB_MAX_EP0_SIZE,           // bMaxPacketSize
    LOBYTE(USB_VID),            // idVendor
    HIBYTE(USB_VID),            //
    LOBYTE(USB_PID),            // idProduct
    HIBYTE(USB_PID),            //
    0x00,                       // bcdDevice rel. 2.00
    0x02,
    USBD_IDX_MFC_STR,           // Index of manufacturer string
    USBD_IDX_PRODUCT_STR,       // Index of product string
    USBD_IDX_SERIAL_STR,        // Index of serial number string
    USBD_MAX_NUM_CONFIGURATION  // bNumConfigurations
};

// 配置描述符
__ALIGN_BEGIN static uint8_t USBD_CfgDesc[USB_LEN_CFG_DESC] __ALIGN_END =
{
    0x09,                       // bLength: Configuration Descriptor size
    USB_DESC_TYPE_CONFIGURATION, // bDescriptorType: Configuration
    USB_LEN_CFG_DESC,

    0x00,
    0x01,                       // bNumInterfaces: 1 interface
    0x01,                       // bConfigurationValue: Configuration value
    0x00,                       // iConfiguration: Index of string descriptor describing the configuration

    0xC0,                       // bmAttributes: bus powered and Support Remote Wake-up
    0x32,                       // MaxPower 100 mA: this current is used for detecting Vbus

    // 接口描述符
    0x09,                       // bLength: Interface Descriptor size
    USB_DESC_TYPE_INTERFACE,    // bDescriptorType: Interface descriptor type
    0x00,                       // bInterfaceNumber: Number of Interface
    0x00,                       // bAlternateSetting: Alternate setting
    0x02,                       // bNumEndpoints
    0xFF,                       // bInterfaceClass: Vendor specific
    0x00,                       // bInterfaceSubClass: Vendor specific
    0x00,                       // bInterfaceProtocol: Vendor specific
    0x00,                       // iInterface: Index of string descriptor

    // 控制端点描述符
    0x07,                       // bLength: Endpoint Descriptor size
    USB_DESC_TYPE_ENDPOINT,     // bDescriptorType: Endpoint
    0x81,                       // bEndpointAddress: (IN1)
    0x02,                       // bmAttributes: Bulk
    LOBYTE(USB_FS_MAX_PACKET_SIZE), // wMaxPacketSize: 64 Bytes max
    HIBYTE(USB_FS_MAX_PACKET_SIZE),
    0x00,                       // bInterval: ignored for Bulk transfer

    // 数据端点描述符
    0x07,                       // bLength: Endpoint Descriptor size
    USB_DESC_TYPE_ENDPOINT,     // bDescriptorType: Endpoint
    0x01,                       // bEndpointAddress: (OUT1)
    0x02,                       // bmAttributes: Bulk
    LOBYTE(USB_FS_MAX_PACKET_SIZE), // wMaxPacketSize: 64 Bytes max
    HIBYTE(USB_FS_MAX_PACKET_SIZE),
    0x00                        // bInterval: ignored for Bulk transfer
};

// 其他描述符
uint8_t *USBD_FS_StringDesc[] =
{
    USBD_FS_ManufacturerStr,
    USBD_FS_ProductStr,
    USBD_FS_SerialStr,
};

// USB设备配置
USBD_DescriptorsTypeDef USB_Desc =
{
    USBD_DeviceDesc,          // 设备描述符
    USBD_CfgDesc,             // 配置描述符
    USBD_FS_StringDesc,       // 字符串描述符
    NULL                      // 回调函数
};

五、USB传输的实现

  1. USB传输分为控制传输、批量传输和中断传输。
  2. 控制传输是一种请求-应答模式,用于设备与主机之间的命令和数据交换。
  3. 批量传输是一种大数据块的传输方式,适用于大量数据的传输,如文件传输。
  4. 中断传输是一种实时性要求较高的传输方式,适用于需要快速响应的数据交互。

示例代码(使用控制传输):

#include "usbd_core.h"
#include "usbd_cdc.h"
#include "usbd_cdc_if_template.h"

USBD_HandleTypeDef hUsbDeviceFS;

static int8_t CDC_Init_FS(void)
{
    // 初始化CDC设备
    hUsbDeviceFS.pClassData = &hUsbDeviceFS;
    USBD_CDC_Init(&hUsbDeviceFS, CDC_IncomingData, CDC_OutgoingData);
    return (USBD_OK);
}

static int8_t CDC_DeInit_FS(void)
{
    // 取消初始化CDC设备
    return (USBD_OK);
}

static int8_t CDC_Control_FS(uint8_t cmd, uint8_t *pBuf, uint16_t length)
{
    // 控制传输处理
    return (USBD_OK);
}

static int8_t CDC_Receive_FS(uint8_t *pBuf, uint32_t *Len)
{
    // 接收数据处理
    return (USBD_OK);

作者:大黄鸭duck.

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 USB通信学习指南

发表回复