STM32学习之SPI读写串行存储器

         SPI协议,即串行外围设备接口协议,是一种高速全双工的通信总线。被广泛应用于ADC、LCD等设备与MCU间,适用于对通信速率要求较高的场合。

        SPI通讯使用3条总线及片选线,分别为:SCK、MOSI和MISO,片选SS。

        片选线(SS):从设备选择信号线,常称为片选信号线,以下用NSS表示。当多个SPI从设备与SPI主机相连时,设备的其它信号线SCK、MOSI、MISO同时并联到相同SPI总线上,共同使用这3条总线;但是每个从设备都有独立的片选信号线,本片选信号线独立占用一个主机引脚。SPI协议中没有设备地址,其使用NSS信号线来寻址,当主机要选择从设备时,把该设备的信号线设置为低电平,该从设备即被选中,即片选信号线有效,主机便可与被选中的从设备进行SPI通讯。所以SPI通信以NSS线为低电平为开始信号,以NSS线被拉高为结束信号。

        SCK:时钟信号线,用于通信数据同步。由主机产生,决定了通信的速率。不同设备支持的通信评率不一样。

        MOSI:主设备输出/从设备输入引脚。主机的数据从这条线输出,而丛机由这条线进行数据的写入。

        MISO:主设备输入/从设备输出引脚。主机从这条设备线进行数据读入,丛机从这条设备线进行数据输出。

1、SPI基本通讯时序:

STM32学习之SPI读写串行存储器_第1张图片

这是一个通讯时序。NSS/SCK/MOSI信号都是由主机产生。而MISO信号都是由丛机产生,主机通过该信号线读取丛机的数据信息。MOSI和MISO信号只在NSS为低电平的时候有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。在图中标号为1的地方,NSS信号线由高到低,是SPI通信的起始信号。在图中标号为6的地方,NSS信号由低到高,是SPI通信的停止信号,表示本次通信结束,丛机的选中状态被取消。

2、数据有效性:

SPI使用MOSI及MISO信号线进行数据传输,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行或LSB先行并没有做硬性规定,但是要保证两个SPI通讯设备之间使用同样的协议。可以观察图2、3、4、5标号处,MOSI及MISO的数据在SCK的上升沿期间变化输出,在SCK的下降沿时被采样。即在SCK的下降沿时刻,MOSI及MISO的数据有效,高电平时表示数据“1”,低电平时表示数据“0”。其它时刻数据无效,MOSI及MISO为下一次表示数据做准备。每次传输数据可以是8位或者16位,每次传输的数据单位受限制。

STM32中已经集成有SPI通讯的模式,其初始化结构体如下:

typedef struct
{
uint16_t SPI_Direction; //设置SPI的单双向
uint16_t SPI_Mode;   //设置SPI的主/从机端模式;
uint16_t SPI_DataSize; //设置SPI的数据帧长度,可以选择8位或者16位;
uint16_t SPI_CPOL; //设置时钟极性CPOL,可以选择高低电平;
uint16_t SPI_CPHA; //设置时钟相位,可以选择奇偶数边缘采样;
uint16_t SPI_NSS;  //这只NSS引脚由SPI硬件控制还是软件控制;
uint16_t SPI_BaudRatePresscaler; //用于设置时钟分频因子,fpclk/分频数=fsck;
uint16_t SPI_FirstBit; //设置MSB/LSB先行;
uint16_t SPI_CRCPolynomial;//设置CRC校验的表达式;
}

 

你可能感兴趣的:(STM32学习)