STM32学习笔记-SPI总线通信

一、SPI总线通信原理

1、SPI总线简介

1.1、SPI总线介绍

SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。
SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间,要求通讯速率较高的场合。
在这里插入图片描述

1.2、SPI总线物理·拓扑结构

SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。
在这里插入图片描述
(1)MOSI:主器件数据输出,从器件数据输入
(2)MISO:主器件数据输入,从器件数据输出
(3)SCLK :时钟信号,由主器件产生
(4)/SS:从器件使能信号,由主器件控制(片选)

1.3、SPI总线协议

在这里插入图片描述

  • 起始信号: NSS信号线由高变低,是SPI通讯的起始信号

  • 结束信号:NSS信号由低变高,是SPI通讯的停止信号

  • 数据传输:SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。SPI每次数据传输可以8 位或 16 位为单位,每次传输的单位数不受限制。

  • 主从设备间数据交换逻辑示意
    主机和从机都包含一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机。这样两个移位寄存器中的内容就被交换了。从机的写操作和读操作时同步完成的,因此SPI成为一个很有效的协议。
    在这里插入图片描述

2、SPI的四种通信模式

在SPI操作中,最重要的两项设置就是时钟极性(CPOL)和时钟相位(CPHA)这两项即是主从设备间数据采样的约定方式。

  • 时钟极性CPOL : 设置时钟空闲时的电平
    当CPOL = 0 ,SCK引脚在空闲状态保持低电平;
    当CPOL = 1 ,SCK引脚在空闲状态保持高电平。

  • 时钟相位CPHA :设置数据采样时的时钟沿
    当 CPHA=0 时,MOSI或 MISO 数据线上的信号将会在 SCK时钟线的奇数边沿被采样
    当 CPHA=1时, MOSI或 MISO 数据线上的信号将会在 SCK时钟线的偶数边沿被采样

2.1、SPI的四种通信模式

在这里插入图片描述
在这里插入图片描述

2.2、通信模式的设置

由CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,因此通常主机要按照从机支持的模式去设置
在这里插入图片描述

3、STM32F4-SPI控制器特性

在这里插入图片描述
STM32的SPI架构剖析:
• 通讯引脚
• 时钟控制逻辑
• 数据控制逻辑
• 整体控制逻辑

3.1、通讯引脚

STM32F4芯片有多个SPI外设,它们的SPI通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚,以《STM32F4xx规格书》为准。
在这里插入图片描述
注:其中SPI1、SPI4、SPI5、SPI6是APB2上的设备,最高通信速率达42Mbtis/s,SPI2、SPI3是APB1上的设备,最高通信速率为21Mbits/s。其它功能上没有差异。

3.2、时钟控制逻辑

SCK线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对f pclk 时钟的分频因子,对f pclk 的分频结果就是SCK引脚的输出时钟频率
在这里插入图片描述
注:其中的f pclk 频率是指SPI所在的APB总线频率,APB1为f pclk1 ,APB2为f pckl2

3.3、数据控制逻辑

STM32F4的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源来源于接收缓冲区及发送缓冲区。
• 通过写SPI的“数据寄存器DR”把数据填充到发送缓冲区中。
• 通过读“数据寄存器DR”,可以获取接收缓冲区中的内容。
• 其中数据帧长度可以通过“控制寄存器CR1”的“DFF位”配置成8位及16位模式;配置“LSBFIRST位”可选择MSB先行还是LSB先行。

3.4、整体控制逻辑
  • 整体控制逻辑负责协调整个SPI外设,控制逻辑的工作模式根据“控制寄存器(CR1/CR2)”的参数而改变,基本的控制参数包括前面提到的SPI模式、波特率、LSB先行、主从模式、单双向模式等等。
  • 在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,只要读取状态寄存器相关的寄存器位,就可以了解SPI的工作状态了。除此之外,控制逻辑还根据要求,负责控制产生SPI中断信号、DMA请求及控制NSS信号线。
  • 实际应用中,一般不使用STM32SPI外设的标准NSS信号线,而是更简单地使用普通的GPIO,软件控制它的电平输出,从而产生通讯起始和停止信号。

二、串行FLASH_W25X16简介

1、串行FLASH_W25X16简介

  • FLASH的特性
    FLSAH 存储器又称闪存,它与 EEPROM 都是掉电后数据不丢失的存储器,但 FLASH存储器容量普遍大于 EEPROM,现在基本取代了它的地位。我们生活中常用的 U盘、SD卡、SSD 固态硬盘以及我们 STM32 芯片内部用于存储程序的设备,都是 FLASH 类型的存储器。在存储控制上,最主要的区别是FLASH 芯片只能一大片一大片地擦写,而EEPROM可以单个字节擦写。

  • SPI_Flash W25X16简介
    W25X16有8192个可编程页,每页256字节。用“页编程指令”每次就可以编程256个字节。用扇区擦除指令每次可以擦除16页,用块擦除指令每次可以擦除256页,用整片擦除指令即可以擦除整个芯片。W25X16有512个可擦除扇区或32个可擦除块。 在这里插入图片描述

2、W25X16硬件连线

在这里插入图片描述
CS: 片选引脚,低电平有效,连接到STM32-PH2管脚
SO: 连接到STM32-PB4管脚(MISO)
SI: 连接到STM32-PB5管脚(MOSI)
CLK: 连接到STM32-PA5管脚(CLK)
WP: 写保护管脚,低电平有效,有效时禁止写入数据。接电源未使用
HOLD: HOLD 引脚可用于暂停通讯,该引脚为低电平时,通讯暂停,未使用

3、W25X16控制指令

3.1、W25X16操作方式:

我们需要了解如何对 FLASH 芯片进行读写。FLASH 芯片自定义了很多指令,我们通过控制 STM32利用 SPI总线向 FLASH 芯片发送指令,FLASH芯片收到后就会执行相应的操作。
而这些指令,对主机端(STM32)来说,只是它遵守最基本的 SPI通讯协议发送出的数据,但在设备端(FLASH 芯片)把这些数据解释成不同的意义,所以才成为指令。
注:可查看FLASH 芯片的数据手册《W25X16》,可了解各种它定义的各种指令的功能及指令格式
在这里插入图片描述

3.2、读制造商/设备ID(90)

该指令通常在调试程序的时候用到,判断SPI通信是否正常。该指令通过主器件拉低/CS片选使能器件开始传输,首先通过DI线传输“90H”指令,接着传输000000H的24位地址(A23-A0),之后从器件会通过DO线返回制造商ID(EFH)和设备ID。
(注:SPI为数据交换通信,主器件在发送“90H”指令时也会接收到一个字节FFH,但此数据为无效数据)
在这里插入图片描述

3.3、写使能命令(06H)

在向 FLASH 芯片存储矩阵写入数据前,首先要使能写操作,通过“Write Enable”命
令即可写使能
在这里插入图片描述

3.4、扇区擦除(20H)

由于 FLASH 存储器的特性决定了它只能把原来为“1”的数据位改写成“0”,而原来为“0”的数据位不能直接改写为“1”。所以这里涉及到数据“擦除”的概念。
在写入前,必须要对目标存储矩阵进行擦除操作,把矩阵中的数据位擦除为“1”,在数据写入的时候,如果要存储数据“1”,那就不修改存储矩阵 ,在要存储数据“0”时,才更改该位。
在这里插入图片描述

3.5、读状态寄存器(05H)

FLASH 芯片向内部存储矩阵写入数据需要消耗一定的时间,并不是在总线通讯结束的一瞬间完成的,所以在写操作后需要确认 FLASH 芯片“空闲”。我们只需要读取状态寄存器SRP的S0即可(当这个位为“1”时,表明 FLASH芯片处于忙碌状态,它可能正在对内部的存储矩阵进行“擦除”或“数据写入”的操作)
在这里插入图片描述

3.6、读数据(03H)

读数据指令可从存储器依次一个或多个数据字节,该指令通过主器件拉低/CS电平使能设备开始传输,然后传输“03H”指令,接着通过DI管脚传输24位地址,从器件接到地址后,寻址存储器中的数据通过DO引脚输出。每传输一个字节地址自动递增,所以只要时钟继续传输,可以不断读取存储器中的数据。
在这里插入图片描述

3.7、写数据——页编程(02H)
页编程指令可以在已擦除的存储单元中写入256个字节。该指令先拉低/CS引脚电平,接着传输“02H”指令和24位地址。后面接着传输至少一个数据字节,最多256字节。

注: 当数据写到一个新的扇区的时候,需要重新发起一个页编程信号才能继续写入数据。
在这里插入图片描述

三、STM32 SPI_FLASH基本配置和操作

1、CubeMx配置

1.1、falsh管脚配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2、片选管脚

在这里插入图片描述

1.3、串口配置

在这里插入图片描述

1.4、时钟配置

在这里插入图片描述
在这里插入图片描述

1.5、SPI配置

在这里插入图片描述

2、代码实现

2.1、配置确认

在这里插入图片描述
在这里插入图片描述

2.2、操作函数封装

在这里插入图片描述

在这里插入图片描述

头文件路径设置
在这里插入图片描述
在这里插入图片描述

2.3、完成一个字节的读写

在这里插入图片描述
在这里插入图片描述

2.4、读取设备地址

发送3次0000,因为是24位,每次发送8位
接收两次,一次是厂商ID,一次是设备ID
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、SPI_FLASH擦除及读数据操作

在这里插入图片描述

1、使能写使能

在这里插入图片描述
在这里插入图片描述

2、擦除扇区

在这里插入图片描述
在这里插入图片描述

3、等待擦除或写数据完成

在这里插入图片描述

在这里插入图片描述

4、测试擦除

在这里插入图片描述
读数据
在这里插入图片描述
在这里插入图片描述
输出擦出后flash值,是否都为1
在这里插入图片描述

五、SPI_FLASH写数据操作

  • 写数据——页编程(02H)
    页编程指令可以在已擦除的存储单元中写入256个字节。该指令先拉低/CS引脚电平,接着传输“02H”指令和24位地址。后面接着传输至少一个数据字节,最多256字节。
    注: 当数据写到一个新的扇区的时候,需要重新发起一个页编程信号才能继续写入数据。
    在这里插入图片描述

1、页编程函数

写的地址24位,发送3次。
写的大些不能超过一页256。
在这里插入图片描述
在这里插入图片描述
测试写操作
在这里插入图片描述

2、多页写入

sFLASH_WritePage()只能写一页,不能超过256
段节点,超过一个扇区,新的扇区要擦除
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值