您的位置:首页 > 其它

SPI协议内容及STM32 SPI的操作

2016-12-22 21:52 281 查看

SPI总线协议简介及内容

简介

SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全/半双工,同步的通信总线,并且在芯片的管脚上只占用三/四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

SPI特征

3根/4根线全双工同步传输

8或16位传输帧格式选择

主从操作模式

支持多主操作模式

从模式频率(最大为fpclk/2)

可编程的时钟极性和相位

可编程的数据顺序,MSB在前或LSB在前

可触发中断的专用发送和标志

SPI总线忙状态标志

支持可靠通信的CRC

功能

SPI框图



SPI通常都是采用四个引脚和外围设备相连,每个引脚的含义:

MISO 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。

MOSI 主设备输出/从设备输入引脚。该引脚在从模式下接收数据,在主模式下发送数据。

SCK 串口时钟,作为主设备的输出,从设备的输入。

NSS 从设备选择(片选引脚),是一个可选的引脚,用来选择主/从设备。

SPI时钟极性(CPOL)和时钟相位(CPHA)的组合时序图



SPI的极性和相位组合有四种:

CPHA=0,表示第一个边沿:

对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;

对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;

CPHA=1,表示第二个边沿:

对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;

对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;

可以相互组合通过寄存器(SPI_CR1)设置不同的时钟极性和时钟相位组合。

STM32 的SPI寄存器映射及复位值

SPI寄存器映射



用STM32固件库函数编程配置SPI总线操作

SPI所用到的GPIO初始化

void SPI_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure SPI2  -------------------------*/
GPIO_StructInit(&GPIO_InitStructure);
//CS | NSS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//SCK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//MISO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}


SPI配置初始化

void SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;

SPI_Cmd(SPI2, DISABLE);
SPI_StructInit(&SPI_InitStructure);

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);

/*Enable SPI1.NSS as a GPIO*/
SPI_SSOutputCmd(SPI2, ENABLE);

//  GPIO_SetBits(GPIOD, GPIO_Pin_7);
GPIO_SetBits(GPIOB, GPIO_Pin_12);    //CS = 1 |  NSS=1

/* Enable SPI1 */
SPI_Cmd(SPI2, ENABLE);
}


Tips

对于SPI配置中的CPOL和CPHA两个选项,可以根据连接外设需求不同进行修改配置,参考上面提到的四种模式。

SPI发送和接收

u8 SPI_SendByte(u8 tempdata)
{
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(SPI2, tempdata);    //send tempdata

/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus  */
return SPI_I2S_ReceiveData(SPI2);
}

u8 SPI_ReceiveByte(void)
{
return (SPI_SendByte(0x00));
}


一般在SPI总线外围所接设备

一般常见的SPI连接外围设备有:

Flash存储芯片,传感器类芯片。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: