STM32 SPI DMA 的使用
一、SPI信号线说明
通常SPI通过4个引脚与外部器件相连:
- MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
- MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
- SCK:串口时钟,作为主设备的输出,从设备的输入
- NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。
二、原理
MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。
通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。
三、NSS说明与注意点
NSS分为内部引脚和外部引脚。
NSS外部引脚可以作为输入信号或者输出信号,输入信号一般用作硬件方式从机的片选,而输出信号一般用于主SPI去片选与之相连的从SPI。
NSS从设备选择有两种模式:
1、软件模式
可以通过设置SPI_CR1寄存器的SSM位来使能这种模式,当它为1时,NSS引脚上的电平由SSI决定。在这种模式下NSS外部引脚可以用作它用,而内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动。
2、硬件模式
两种方式:
(1)对于主SPI,NSS可以直接接高电平,对于从SPI,可以直接接低电平。
(2)当STM32F10xxx工作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时主机的NSS讲作为输出信号,引脚信号被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备。
此时两个的NSS信号线可以接个上拉电阻直连。
四、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配置
1 /*******************************************************************************2 * Function Name : SPI1_DMA_Configuration3 * Description : 配置SPI1_RX的DMA通道2,SPI1_TX的DMA通道34 * Input : None5 * Output : None6 * Return : None7 * Attention : 8 *******************************************************************************/9 void SPI1_DMA_Configuration( void )10 {11 DMA_InitTypeDef DMA_InitStructure;12 13 /* DMA1 Channel2 (triggered by SPI1 Rx event) Config */14 DMA_DeInit(DMA1_Channel2); 15 DMA_InitStructure.DMA_PeripheralBaseAddr = SPI1_DR_Addr; //设置 SPI1 发送外设(0x4001300C) 地址(目的地址)16 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI1_RX_Buff; //设置 SRAM 存储地址(目的地址)17 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //传输方向 外设-内存18 DMA_InitStructure.DMA_BufferSize = SPI1_ReciveBufferSize; //设置 SPI1 发送长度19 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;20 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;21 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;22 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;23 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;24 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;25 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;26 DMA_Init(DMA1_Channel2, &DMA_InitStructure);27 28 DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);29 /* Enable SPI1 DMA RX r
STM32SPIDM 相关文章:
- STM32的SPI采用DMA方式传输测试(11-19)
- STM32学习笔记之SPI_DMA寄存器级操作(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)