ZHDA282
September 2026
MSPM0G5117
,
MSPM0G5187
1
1
说明
2
所需外设
3
兼容器件
4
设计步骤
5
设计注意事项
6
软件流程图
7
应用代码
8
数据流示例
9
其他资源
10
商标
6
软件流程图
图 6-1
展示了此示例的代码流程。
USB 转 I2C 方向:
每当 USB 主机发送数据时,TinyUSB 都会调用 tud_cdc_rx_cb()。该回调函数会调用 usb2i2c_pushTask(),从 USB CDC 接口读取最多 64 个字节,并将其作为任务加入 gUSB2I2CTask 队列。
在主循环中,当 gUSB2I2CTask.fifoCount > 0 时,usb2i2c_popTask() 会使用任务缓冲区的地址和长度配置 DMA 通道 CH1,然后启动对目标器件的 I²C 写传输。
当 DMA 完成对 I²C TX FIFO 的加载时,会触发 TX DMA 完成中断。处理程序清除 STOP 中断状态标志并启用 STOP 中断。总线上出现 I²C STOP 条件时,将触发 STOP 中断。处理程序调用 fifoCompleteRead() 以释放任务并清除 i2cInProgress。
I2C 转 USB 方向:
I2C 目标器件将数据就绪 GPIO 引脚(上升沿)置为有效。GPIO 中断处理程序置位 i2ctargetDataReady
在主循环中,当 i2ctargetDataReady 被置位且 i2cInProgress 为 false 时,i2c2usb_pushTask() 将 DMA 通道 CH0 配置为接收缓冲区,开始 64 个字节的 I2C 读取传输,并置位 i2cInProgress。数据长度始终固定为 64 个字节。
当接收到所有 64 个字节时,将触发 RX DMA 完成中断。处理程序调用 fifoCompleteWrite() 将任务标记为 USB 传输准备就绪,清除 i2ctargetDataReady,然后清除 i2cInProgress。
在主循环中,当 gI2C2USBTask.fifoCount > 0 时,i2c2usb_popTask() 检查 TinyUSB CDC TX FIFO 是否有足够的空间,写入缓冲的数据,将其刷新到主机,然后调用 fifoCompleteRead() 以释放该任务。
图 6-1
应用软件流程图