这一章在干嘛?

USB 读卡器实验:USB OTG Full-Speed 协议、Mass Storage 类、Bulk-Only 传输、SCSI 命令。从此 MCU 可以当 U 盘。

39.1 USB 简介

39.2 硬件设计

39.3 程序设计

39.4 下载验证

39.1 USB 简介

USB OTG FS = USB On-The-Go Full-Speed(12 Mbps)。

F407 有 2 个 USB OTG:

  • OTG_FS:Full Speed,PA11/PA12;
  • OTG_HS:High Speed(外接 PHY 可达 480 Mbps),PB14/PB15。

USB 类(Class):

典型应用
HID键鼠/触摸
Mass StorageU 盘/读卡器
CDC虚拟串口
Vendor自定义

原书图 39.1.1:USB 协议分层原书图 39.1.1:USB 协议分层

USB 协议栈复杂:实际开发直接用 ST 的 USB Device 库 + Middleware,10 分钟搞定一个读卡器。

39.2 硬件设计

USB OTG FS 接 PA11/PA12 → 开发板 USB Slave 接口。

原书图 39.2.1:USB OTG FS 接线图原书图 39.2.1:USB OTG FS 接线图

39.3 程序设计

39.3.1 CubeMX 配置

  • USB_OTG_FS → Mode = Device Only, Activate VBUS sensing
  • USB_DEVICE → Class = Mass Storage, SCSI support
  • Middleware → USB_DEVICE
  • USE_USB_FS

39.3.2 关键代码

启用 ST 提供的 usbd_msc_if.c 模板。修改读写回调指向 SPI Flash:

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) {
    W25Qxx_ReadData(buf, blk_addr * 512, blk_len * 512);
    return 0;
}

int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size) {
    *block_num = 16384;     // 8 MB / 512 = 16384 扇区
    *block_size = 512;
    return 0;
}

原书图 39.3.2.1:USB Mass Storage 数据流原书图 39.3.2.1:USB Mass Storage 数据流

原书图 39.3.2.2:MSC SCSI 命令处理流程原书图 39.3.2.2:MSC SCSI 命令处理流程

39.4 下载验证

USB 线接 PC → 弹出「可移动磁盘」→ 拖文件测试读写 → 串口调试显示状态机切换。

首次插入 PC 可能要装驱动:ST 的 USB 设备驱动在 Win10+ 通常免驱,但 XP/Win7 可能要手动装。