嵌入式--SPI通信及相关库函数功能

一、SPI接口

SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工同步的通信总线,并且在芯片的管脚上只占用四根线(NSS、MISO、MOSI、SCK),实现一对多或者一对一的通信,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

SPI总线采用的环形结构,利用的是主从模式(主机-->从机)进行数据的传输,由于是同步通信,所以在主机发送数据的同时也会收到从机数据。

1.一对一模式。

从机如果检测NSS引脚出现低电平,说明从机被选中,前提是主机把NSS引脚拉低。

 2.一对多模式

如果引脚上面有横杠,说明引脚是低电平有效。 

主要通过片选引脚选择从机设备,如果主机不打算和从机进行数据的传输,应该让NSS引脚在空闲状态下处于高电平(表示不通信),如果打算和某个从机进行单独通信的话,要把从机对应的NSS拉低。

 3.从选择(NSS)脚管理

有2种NSS模式,一般选择软件模式。
软件NSS模式:可以通过设置SPI_CR1寄存器的SSM位来使能这种模式。在这种模式下外部NSS引脚可以用作它用,而从器件选择信息在内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动

4.SPI工作模式
由于SPI外设是全双工同步通信,所以时钟信号就由SCK引脚来生成,SCK引脚只能由主设备控制,从设备是无法控制的,所以SCK引脚输出的脉冲信号的极性和相位就需要进行配置。

时钟极性:指的是SPI总线空闲状态SCK引脚的电平状态。SCK空闲状态的电平可以由SPI_CR1寄存器的位来CPOL来设置。主设备极性要根据从设备设置。

时钟相位:指的是在传输数据时选择脉冲信号的边沿(上升沿/下降沿)来进行数据的采集或者修改,由SPI_CR1寄存器的位来CPHA来设置。主设备相位要根据从设备设置。

通过两位可以得到四种不用的组合,就被作为SPI总线的工作模式,到低要选择那种模式要根据从设备数据手册进行选择

(1)CPOL=0,CPHA=0

该模式指的是SCK引脚在空闲状态下为低电平,并且在第一个时钟边沿(上升沿)采集数据,在第二个时钟边沿(下降沿)来修改数据。

(2)CPOL=0,CPHA=1

该模式指的是SCK引脚在空闲状态下为低电平,并且在第二个时钟边沿(下降沿)采集数据,在第一个时钟边沿(上升沿)来修改数据。

(3)CPOL=1,CPHA=0

该模式指的是SCK引脚在空闲状态下为高电平,并且在第一个时钟边沿(下降沿)采集数据,在第二个时钟边沿(上升沿)来修改数据。

(4)CPOL=1,CPHA=1

 该模式指的是SCK引脚在空闲状态下为高电平,并且在第二个时钟边沿(上升沿)采集数据,在第一个时钟边沿(下降沿)来修改数据。

在实际开发工程中使用最多就是第一种和第四种。 

 5.数据帧格式

主机与从机在通信过程中传输的数据以bit为单位(串行传输),所以数据格式就十分重要,主机的数据格式要根据从机的数据格式进行设置(MSB/LSB) 。

根据SPI_CR1寄存器中的LSBFIRST位,输出数据位时可以MSB在先也可以LSB在先。
根据SPI_CR1寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和/或接收都有效。一般都是八位。 

6.通信速率
 

SPI1搭载在APB1上,SPI2/SPI3搭载在APB2上。选择默认时钟初始化函数,则APB1=36MHz,APB2=72MHz。但是一般外围器件的通信速率最高也就是10Mbps左右,极少数超过10Mbps(W25Q128)。

7.中断

二、SPI相关寄存器 

1. SPI控制寄存器 1(SPI_CR1)

 2.SPI控制寄存器 2(SPI_CR2)

 3.SPI 状态寄存器(SPI_SR)

 4.SPI 数据寄存器(SPI_DR)

 5.SPI_I2S配置寄存器(SPI_I2S_CFGR)

 6.SPI_I2S预分频寄存器(SPI_I2SPR)

 三、SPI相关库函数功能

1.void SPI_I2S_DeInit(SPI_TypeDef* SPIx);

 SPI/I2S初始换函数,使用RCC_APB1PeriphResetCmd进行初始化。

2. void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);

SPI初始化函数,1.选择SPI。2.对SPI参数进行配置:(1)SPI_Direction 设置 SPI 的通信方式, 可以选择为半双工,全双工,以及串行发和串行收方式(2)SPI_Mode 设置主机模式或者从机模式(3)SPI_DataSize数据传输大小是8位或者16位(4)SPI_CPOL设置时钟极性,是高电平还是低电平(5)SPI_CPHA设置时钟相位,选择边沿采集和修改数据的方式(6)SPI_NSS设置片选信号由硬件还是软件控制(7)SPI_BaudRatePrescaler设置数据传输速率(8)SPI_FirstBit设置数据传输顺序是 MSB 位在前还是 LSB 位在前(9)SPI_CRCPolynomial数据校验

3.void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);

SPI使能函数,1.选择SPI。2.使能,主要通过SPI_CR1位6来设置。

4.void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); 

中断设置,1.选择SPI 。2.选择中断形式。3.使能

5.void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);

发送数据函数, 1.选择SPI。2.数据。主要通过SPI 数据寄存器(SPI_DR) 来进行操作。

6.uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);

获取数据函数, 1.选择SPI。主要通过SPI 数据寄存器(SPI_DR) 来进行操作

7.void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); 

SPI数据大小设置,1.选择SPI。2.数据大小8位/16位

8.FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);

 获取状态标志,1.选择SPI。2.选择需要获取的状态位。主要通过SPI 状态寄存器(SPI_SR) 操作

9.void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);

 清除标志,1.选择SPI。2.选择需要获取的状态位。主要通过SPI 状态寄存器(SPI_SR) 操作

10.ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT); 

获取中断状态,通过操作SPI控制寄存器 2(SPI_CR2)设置

11.void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);
 清除中断标志位。

二、串行Flash闪存芯片

1.W25Q128芯片是一个串行Flash闪存芯片,有16M存储空间,可反复擦除10万次数据可保存20年以上,供电电压2.7-3.6,该芯片一共提供了65536个编程页,每页有256字节,最小的擦除单位是4KB,一次最多可编程256字节,该芯片支持标准SPI接口。一共有256个块,每块大小64K,每个块分为16个扇区,每个扇区4K字节。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值