基于STM32F10x系列的SPI笔记

SPI
定义:SPI是串行外设接口(Serial peripheral interface)的缩写,SPI是一种高速的,同步的,全双工通信协议。它只占用四个引脚,分别是MISO、MOSI、NSS、SCLK。
基于STM32F10x系列的SPI笔记_第1张图片
1、SPI的单机通信连接方式:
基于STM32F10x系列的SPI笔记_第2张图片
这个官方数据手册上的图可能看的比较晦涩不太容易懂,于是我自己总结如下:
基于STM32F10x系列的SPI笔记_第3张图片
2.SPI的多机通信方式:
基于STM32F10x系列的SPI笔记_第4张图片
基于STM32F10x系列的SPI笔记_第5张图片
SPI的四种模式:
基于STM32F10x系列的SPI笔记_第6张图片
CPOL:时钟极性
当CPOL为0时,SCLK时钟空闲状态为低电平
当CPOL为1时,SCLK时钟空闲状态为高电平
CPHA:时钟相位
当CPHA为0时,数据在SCLK的第一边沿开始采集,在第二边沿开始数据采样输出
当CPHA为1时,数据在SCLK的第二边沿开始采集,在下一个边沿开始数据采样输出

SPI一般采用第三种模式CPOL=0,CPHA=1。
SPI的缺点:SPI数据传输没有流控制,也没有应答机制(不知道什么时候数据传输完毕)。
硬件SPI的GPIO引脚配置:NSS/CS(片选)设置为输出模式,其它三个引脚设置为复用功能模式。
软件SPI的GPIO引脚配置:MISO引脚设置为输入模式,其它三个引脚设置为输出模式。

RC522的SPI配置参数:

void SPI_Configuration(SPI_TypeDef* SPIx)
{
	SPI_InitTypeDef SPI_InitStruct;

	SPI_RCC_Configuration(SPIx);

	SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;	//SPI1的时钟=36MHz/8=4.5MHz,要看从机芯片手册
	SPI_InitStruct.SPI_Direction= SPI_Direction_2Lines_FullDuplex;	//设置SPI为全双工双线双向通信
	SPI_InitStruct.SPI_Mode = SPI_Mode_Master;						//主机角色
	SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;					//接收和发送都是8bit,要看从机芯片手册
	SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;							//串行时钟空闲的时候高电平还是低电平,看从机芯片手册
	SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;						//进行数据采样的时候是在时钟的哪个边沿,看从机芯片手册
	SPI_InitStruct.SPI_NSS = SPI_NSS_Hard;							//软件控制
	SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;					//最高有效位优先,要看从机芯片手册
	SPI_InitStruct.SPI_CRCPolynomial = 7;							//要看从机芯片手册,RC522通信过程出现crc校验
	SPI_Init(SPIx, &SPI_InitStruct);
	
	SPI_GPIO_Configuration(SPIx);

	SPI_SSOutputCmd(SPIx, ENABLE);
	SPI_Cmd(SPIx, ENABLE);
}

PS注意!!!:配置SPI的参数时必须遵守其对应的硬件数据手册,否则一些参数配置不对会直接影响你找半天不知道是什么原因导致你的SPI无法正常通信!

你可能感兴趣的:(stm32基础知识总结)