这一章在干嘛?
USB 读卡器实验:USB OTG Full-Speed 协议、Mass Storage 类、Bulk-Only 传输、SCSI 命令。从此 MCU 可以当 U 盘。
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 Storage | U 盘/读卡器 |
| CDC | 虚拟串口 |
| Vendor | 自定义 |
原书图 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.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.2:MSC SCSI 命令处理流程
39.4 下载验证
USB 线接 PC → 弹出「可移动磁盘」→ 拖文件测试读写 → 串口调试显示状态机切换。
首次插入 PC 可能要装驱动:ST 的 USB 设备驱动在 Win10+ 通常免驱,但 XP/Win7 可能要手动装。
USB OTG FS 速率?
12 Mbps(Full Speed)。
USB Mass Storage 类传输数据用什么包?
Bulk 传输。
块大小一般多少?
512 字节。