SPI时钟线连续输出
-
1. 版本
Config Tool Version:2.7.8
ME05 SDK version:1.4.0
EVB version: YTM32B1ME0-EVB Rev.C2. 需求
- 需要将SPI的CLK引脚保持一直连续输出,不能有间隔。
- 波特率10M,软件上不需要做太多处理,要搭配DMA,尽可能节省CPU资源。
3. 方案思路
- 可以正常配置SPI的1024byte(可适当配置)连续发送,在DMA的发送完成中断中重新配置开启下一次的DMA发送。接收的DMA搬运同理。
- 要保证重新配置的操作时间尽可能短,在SPI的TX_FIFO发送完成之前重新配置好DMA,SPI的波形就会连续,不会有间隔。
4. 示例工程配置
4.1 SPI时钟配置
- 功能时钟选择PLL, 120M时钟, 3分频,所以SPI的功能时钟为40M.

4.2 SPI功能配置
- 这里只考虑主机发送和接收的配置:

4.3 DMA发送完成中断重新配置DMA
4.3.1 TX DMA
- 找到 SPI_DRV_MasterCompleteDMATransfer 函数,这个函数会在DMA完成中断中调用。
- 注释掉原有的SPI传输完成操作,添加如下代码:

- 如上图,重新配置DMA通道0的源地址,TriiggerCount,最后StartChannel.
4.3.2 RX DMA
- 找到 SPI_DRV_MasterCompleteRX 函数,这个函数会在DMA完成中断中调用。
- 注释掉原有的SPI接收完成操作,添加如下代码:

- 如上图,重新配置DMA通道1的目标地址,TriiggerCount,最后StartChannel.
4.4 代码配置
- 只需调用一次 SPI_DRV_MasterTransfer ,MCU就会一直发送SPI波形,因为有DMA,程序不会频繁进入中断处理,只会在DMA发送完成中断里处理一下就行,软件负载低。
- 如果想将进一步降低软件负载,可将发送的长度(1024byte)适当扩大。

- 调试,将SIN和SOUT连接

5. 实测波形
- 通道0是片选线,通道1是时钟线,通道2是MOSI,通道3是MISO,通道4代表DMA完成中断处理时间。
- 如下图,波形连续发送无间隔

6. 示例工程
-
补充确认一下:这个方案是可行的。ME0 的 SPI SVD 里,SPIx->CTRL 提供 TXDMAEN/RXDMAEN,发送 FIFO 低于 watermark 或 buffer empty 时可以触发 TX DMA,接收 FIFO 高于 watermark 或 buffer full 时可以触发 RX DMA。因此要保持 SCK 连续,关键是让下一段 DMA 在 TX FIFO 消耗完之前重新装载/启动。
使用时建议注意:
- 发送块长度尽量放大,减少 DMA 完成中断频率。
- DMA 完成回调里只做源/目的地址、TriggerCount 和 StartChannel 等最少操作,避免日志、复杂判断或耗时调用。
- 40 MHz 功能时钟下做 10 MHz SPI 时钟是合理的;如果实测仍有空隙,可以优先调大单次传输长度或降低 FIFO watermark,确认 DMA 重装载时间小于 FIFO 剩余数据发送时间。
- 需要收发环回时,SIN/SOUT 短接的方式可以用于验证 RX DMA 是否同步搬运。
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...