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存储芯片,传感器类芯片。
相关文章推荐
- SPI总线协议和裸板操作
- stm32 SPI通信[操作寄存器+库函数]
- 基于stm32固件库的的spi 对NRF905SE无线模块操作的API
- STM32:DMA方式接收SPI总线数据,并按照协议进行处理
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现
- FPGA作为从机与STM32进行SPI协议通信---Verilog实现
- 寒假学习之stm32(17)----SPI通信协议
- Linux C 函数参考(文件内容操作)
- GPL是开源的一种许可协议,而DTS是一种音频编解码技术,以下内容可供参考
- 给初学者:VB如何操作WEB页的浏览提交———五:如何对网页内容进行解析?
- ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
- 母版页动态操作内容页
- SPI总线协议
- 实现网页在显示对话框时网页的内容不可操作
- 批处理应用:根据文件内容进行重命名操作
- 关于互联网内容服务的公共协议(ICCP)[1]
- ASP.net在页面所有内容生成后、输出内容前对页面内容进行操作
- 一些网络协议的定义和内容(如Http等)