STM32 SPI DMA 的使用
一是想总结一下SPI总线的特点与注意点,二是总结一下SPI DMA的使用
一、SPI信号线说明
通常SPI通过4个引脚与外部器件相连:
- MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
- MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
- SCK:串口时钟,作为主设备的输出,从设备的输入
- NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。
二、原理
MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。
通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。
DMA说明
DMA是AMBA的先进高性能总线(AHB)上的设备,它有2个AHB端口:
一个是从端口,用于配置DMA,另一个是主端口,使得DMA可以在不同的从设备之间传输数据。
DMA的作用是在没有Cortex-M3核心的干预下,在后台完成数据传输。在传输数据的过程中,
主处理器可以执行其它任务,只有在整个数据块传输结束后,需要处理这些数据时才会中断主处理器的操作。
它可以在对系统性能产生较小影响的情况下,实现大量数据的传输。
SPI_DMA的通信过程
- 设置外设地址
- 设置存储器地址
- 设置传输数据量
- 设置通道的配置信息
- 使能DMA通道,启动传输
- 发送时,在每次TXE被设置为’1’时发出DMA请求,DMA控制器则写数据至SPI_DR寄存器,TXE标志因此而被清除。
- 接收时,在每次RXNE被设置为’1’时发出DMA请求,DMA控制器则从SPI_DR寄存器读出数据,RXNE标志因此而被清除。
相关代码 这里使用的是SPI1 SPI_DMA配置
/******************************************************************************* * Function Name : SPI1_DMA_Configuration * Description : 配置SPI1_RX的DMA通道2,SPI1_TX的DMA通道3 * Input : None * Output : None * Return : None * Attention : *******************************************************************************/ void SPI1_DMA_Configuration( void ) { DMA_InitTypeDef DMA_InitStructure; /* DMA1 Channel2 (triggered by SPI1 Rx event) Config */ DMA_DeInit(DMA1_Channel2); DMA_InitStructure.DMA_PeripheralBaseAddr = SPI1_DR_Addr; //设置 SPI1 发送外设(0x4001300C) 地址(目的地址) DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI1_RX_Buff; //设置 SRAM 存储地址(目的地址) DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSR