ZHDA287
September 2026
MSPM0G5117
,
MSPM0G5187
1
1
说明
2
所需外设
3
兼容器件
4
设计步骤
5
设计注意事项
6
软件流程图
7
应用代码
8
数据流示例
9
其他资源
10
商标
6
软件流程图
图 6-1
展示了此示例的代码流程。
USB 到 SPI 方向:
每当 USB 主机发送数据时,TinyUSB 都会调用 tud_cdc_rx_cb()。该回调函数会调用 usb2spi_pushTask(),从 USB CDC 接口读取最多 64 个字节,并将其作为任务加入 gUSB2SPITask 队列。
在主循环中,当 gUSB2SPITask.fifoCount > 0 时,usb2spi_popTask() 会刷新 SPI TX FIFO,使用任务缓冲区地址和长度配置 DMA 通道 CH1,使能 DMA_DONE_TX 中断,并启动 SPI 写传输。
当 DMA 完成装载 TX FIFO 时,DMA_DONE_TX 中断触发。该中断处理程序会清除并使能 TX_EMPTY 中断。当最后一个字节被时钟移出时,TX_EMPTY 中断触发。该处理程序调用 fifoCompleteRead() 释放任务,并清除 spiInProgress。
SPI 到 USB 方向:
SPI 目标设备拉高数据就绪 GPIO 引脚(上升沿)。GPIO 中断处理程序将 SPISlaveDataReady 置为 true 并立即返回。
在主循环中,当 SPISlaveDataReady 被置位且 spiInProgress 为 false 时,spi2usb_pushTask() 会刷新 RX 和 TX FIFO,为接收缓冲区配置 DMA 通道 CH0,配置 DMA 通道 CH1 以在 MOSI 上发送虚拟数据,然后启动两个 DMA。显式禁用 TX_DONE_TX 中断,以便仅由 DMA_DONE_RX 指示完成。
当所有 64 个字节均已接收完成时,DMA_DONE_RX 中断触发。该处理程序调用 fifoCompleteWrite() 将任务标记为可进行 USB 传输,清除 SPISlaveDataReady,并清除 spiInProgress。
在主循环中,当 gSPI2USBTask.fifoCount > 0 时,spi2usb_popTask() 会检查 TinyUSB CDC TX FIFO 是否有足够空间,写入缓冲数据,将其刷新到主机,并调用 fifoCompleteRead() 释放任务。
图 6-1
应用软件流程图