SPI (Serial Peripheral interface),顾名思义就是串行外围设备接口。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间
SPI内部简明结构图
关于SPI传输过程(下面由灵魂画家作图)
SPI包含四根线:
1、SS(Slave Select):片选信号线,当有多个SPI设备与MCU相连时,每个设备的这个片选信号线是与MCU单独的引脚相连的,而其他SCK,MOSI,MISO线则为多个设备并联到相同的SPI总线上,当SS信号线为低电平时,片选有效,开始SPI通信
2、SCK(Serial Clock):时钟信号线,由主通信设备产生,不同的设备支持的时钟频率不一样。
3、MOSI(Master Output,Slave Input):主设备输出、从设备输入引脚
4、MISO(Master Input,Slave Output):主设备输入、从设备输出引脚
关于SPI模式
根据SPI时钟极性(CPOL)和时钟相位(CPHA)配置的不同可分为4种模式
时钟极性是指SPI通信设备处于空闲状态时(或SPI通信开始时,即SS为低电平时),SCK的电平信号
CPOL=0时,SCK空闲状态为低电平,CPOL=1时则相反。
时钟相位是指数据采样的时刻,当CPHA=0时,MOSI或MISO数据线会在时钟线第一个边沿开始采样(奇数边沿)
当CPHA=1时,MOSI或MISO数据线会在时钟线第二个边沿开始采样(偶数边沿)
步骤分析:SS片选信号线拉低-->根据CPOL和CPHA进行数据采样
stm32 SPI接口框图
stm32 SPI配置过程
1、配置相关引脚的复用功能,使能SPIx时钟
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
2、初始化SPIx,设置SPIx工作模式
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);
3、使能SPIx
void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);
4、SPI传输数据
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);
5、查看SPI传输状态
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);
转自:古墓派掌门 - 博客园