SPI主机发送时序优化:缩短 CS 到 SCLK 的延迟

一、前言

在使用 HPM_SDK 的 SPI 主机示例(如 samples/drivers/spi/dma/master)时,常见波形为“CS 先被拉低,但一段时间内无 SCLK,随后 SCLK 才连续输出”。该现象本质上是 SPI 已启动但 TX FIFO 暂无数据,DMA 尚未开始搬运,导致 CS→SCLK 之间出现“空窗”。本文给出优化流程与实现要点,帮助在拉低 CS 后尽快产生连续的 SCLK。如图:

image.png

本文提供如何优化该现象的思路。

二、优化思路

该现象主要是例子中对于SPI主机发送,是先配置和启动SPI,然后再配置和启动DMA,这样就导致SPI启动之后,发送FIFO有一段时间没有数据,直到DMA启动之后才开始搬运数据进而进行传输。以在samples/drivers/spi/dma/master为例,另外也可以参考components/spi的相关API实现,比如hpm_spi_transmit_nonblocking, 其优化思路如下:

(一)配置和启动DMA

1、在初始化DMA之前可以先DMAMUX绑定外设DMA通道,使用dmamux_config API进行绑定使能。只需要调用一次即可。

2、在每次配置和启动DMA之前,需要关闭SPI的发送DMA请求,使用spi_disable_tx_dma API进行关闭

3、配置DMA的设备地址、源地址、传输长度、传输模式等以及启动DMA,使用dma_setup_handshake API或者dma_setup_channel API。

提示:对于发送上,有些DMA配置参数是不变的,比如源地址就是SPI的FIFO DATA,是固定不变的,下次传输的时候可以保持不变,只需要改动源地址和传输长度即可,这样可以dma_set_source_address 等API操作即可,并且使用dma_enable_channel API重新使能即可。

(一)配置和启动SPI

可以通过使用spi_setup_dma_transfer API进行全局配置启动。里面的配置包括:

1、SPI控制配置,比如SPI的传输模式(只读模式或者只写模式等)、SPI的地址和命令段是否使能等,使用spi_control_init API

2、使能SPI的TX DMA请求和RX DMA请求,使用spi_enable_tx_dma API和 spi_enable_rx_dma API

3、写入地址(如果使能地址段的话),使用spi_write_address API

4、写入命令。(无论有没有使能命令段,都必须写入一次命令,非命令段可以是dummy值,使用spi_write_command API

提示:如果每次SPI传输的长度等配置不变,可以只需要使能SPI相关DMA请求,并且写入命令启动SPI即可。

三、效果

经过以上优化,CS→SCLK 的首字节延迟显著缩短;整帧连续性增强。

f980bfd0-62a9-47f6-b7f6-2be2a12e9b05.png

四、总结

1、现象根因:示例流程“先启 SPI、后启 DMA”导致 SPI 起跑时 TX FIFO 为空,出现 CS 先拉低而无 SCLK 的空窗。

2、核心优化:需要先配置和启动 DMA 后配置和启动SPI。

该优化将于 HPM SDK 1.11.0 提供。

0
0

订阅

发表回复 0

Your email address will not be published. Required fields are marked *

captcha
Enter the characters shown in the image:
Reload

This CAPTCHA helps ensure that you are human. Please enter the requested characters.