📖 第 39 章:USB读卡器(Slave)实验(USB Reader (Slave))

1次阅读
没有评论
这一章在干嘛?

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 Storage U 盘/读卡器
CDC 虚拟串口
Vendor 自定义

📖 第 39 章:USB读卡器(Slave)实验(USB Reader (Slave))原书图 39.1.1:USB 协议分层

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

39.2 硬件设计

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

📖 第 39 章:USB读卡器(Slave)实验(USB Reader (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 章:USB读卡器(Slave)实验(USB Reader (Slave))原书图 39.3.2.1:USB Mass Storage 数据流

📖 第 39 章:USB读卡器(Slave)实验(USB Reader (Slave))原书图 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 字节。

正文完
 0