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基本通讯时序:

这是一个通讯时序。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校验的表达式;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103系列微控制器内置了SPI串行外设接口)模块,可以用于与EEPROM(电可擦除可编程只读存储器)进行读写操作。以下是一个简单的例子来说明如何使用STM32F103的SPI模块读写EEPROM。 首先,我们需要配置STM32F103的SPI模块。在SPI模块的寄存器中,我们需要设置一些参数,如SPI时钟的分频系数、数据位长度、数据传输模式等。具体配置要根据EEPROM的规格来确定。然后,使能SPI模块并设置好CS引脚和其他相关引脚。 接下来,在主程序中,我们可以使用SPI发送一些特定的指令给EEPROM,如读指令,写指令等。然后通过SPI发送具体的数据到EEPROM,完成读写操作。 以下是一个示例代码,用于演示如何使用STM32F103的SPI模块读写EEPROM: #include "stm32f10x.h" void SPI_Config(void) { // 配置SPI的时钟、数据位长度、数据传输模式等参数 // 设置CS引脚和其他相关引脚 } void EEPROM_Read(uint16_t address, uint8_t *data, uint16_t length) { // 发送读指令给EEPROM // 发送数据到EEPROM // 接收EEPROM返回的数据 // 将数据存储到指定的缓冲区中 } void EEPROM_Write(uint16_t address, uint8_t *data, uint16_t length) { // 发送写指令给EEPROM // 发送数据到EEPROM // 等待写操作完成 } int main(void) { uint8_t data[16]; SPI_Config(); // 配置SPI EEPROM_Read(0x10, data, sizeof(data)); // 读取EEPROM数据 // 对读取到的数据进行处理 EEPROM_Write(0x20, data, sizeof(data)); // 写入EEPROM数据 while (1) { // 主程序持续执行的代码 } } 需要注意的是,具体读写EEPROM的指令和数据传输协议要根据你使用的EEPROM型号来确定。以上代码仅提供一个基本的框架,并不是完整的、可直接使用的代码。你需要根据实际情况进行相应的修改和补充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值