【嵌入式学习笔记】嵌入式入门8——SPI总线协议

1.SPI介绍

SPI:串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。主要应用在存储芯片、AD转换器以及LCD中。
【注:IIC是电平协议,SPI是边沿协议】
【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第1张图片
【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第2张图片

1.1.SPI框图(以F1/F4为例,主机模式)

【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第3张图片

  • SPI外设对应的引脚
    STM32芯片有多个SPI外设,每个SPI外设输出的信号会到不同的GPIO口。STM32F1有三个SPI。F4 / F7 / H7 系列芯片SPI外设都有6个,分别为SPI1、SPI2、SPI3、SPI4、SPI5和SPI6。不同系列的SPI外设用到的引脚是不一样的,具体可以查看芯片的datasheet。

  • SPI发送与接收流程
    主机只向从机进行写操作,可以忽略接收到的从机数据。
    主机要对从机进行读操作,需要发送一个空数据来引发从机发送数据。

【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第4张图片
【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第5张图片

1.2.SPI的工作模式

  • 时钟极性(CPOL):没有数据传输时时钟线的空闲状态电平
    0:SCK在空闲状态保持低电平
    1:SCK在空闲状态保持高电平
  • 时钟相位(CPHA):时钟线在第几个时钟边沿采样数据
    0:SCK的第一(奇数)边沿进行数据位采样,数据在第一个时钟边沿被锁存
    1:SCK的第二(偶数)边沿进行数据位采样,数据在第二个时钟边沿被锁存

【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第6张图片

  • 模式0:CPOL=0,CPHA=0,低电平奇数边沿
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第7张图片

  • 模式1:CPOL=0,CPHA=1,低电平偶数边沿
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第8张图片

  • 模式2:CPOL=1,CPHA=0,高电平奇数边沿
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第9张图片

  • 模式3:CPOL=1,CPHA=1,高电平偶数边沿
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第10张图片

1.3.SPI相关寄存器介绍(F1/F4/F7)

  • SPI控制寄存器1
    用于配置SPI工作参数:SPI模式、SPI方向、NSS、数据帧、CPOL、CPHA、波特率、帧格式等
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第11张图片

  • SPI状态寄存器
    用于查询当前SPI传输状态(TXE、RXNE)
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第12张图片

  • SPI数据寄存器
    用于存放待发送数据或接收数据,有两个缓冲区(TX/RX)
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第13张图片

1.4.SPI配置步骤(F1/F4/F7)

  • 配置SPI工作参数:HAL_SPI_Init()
  • SPI的MSP初始化:HAL_SPI_MspInit(),配置NVIC、CLOCK、GPIO等
  • 使能SPI:__HAL_SPI_ENABLE
  • SPI传输数据:HAL_SPI_Transmit 发送数据、HAL_SPI_Receive 接收数据、HAL_SPI_TransmitReceive 进行发送与接收
  • 设置SPI传输速度(可选):操作SPI_CR1寄存器中的波特率控制位
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第14张图片
  • 关键结构体
typedef struct 
{ 
	uint32_t Mode				/* SPI模式(主机)  */
	uint32_t Direction			/* 工作方式(全双工) */
	uint32_t DataSize			/* 帧格式(8位) */
	uint32_t CLKPolarity		/* 时钟极性(CPOL = 0) */
	uint32_t CLKPhase			/* 时钟相位 (CPHA = 0)*/
	uint32_t NSS				/* SS控制方式(软件) */
	uint32_t BaudRatePrescaler	/* SPI波特率预分频值 */
	uint32_t FirstBit			/* 数据传输顺序(MSB)*/
	uint32_t TIMode				/* 帧格式:Motorola / TI  */
	uint32_t CRCCalculation		/* 设置硬件CRC校验 */
	uint32_t CRCPolynomial		/*  设置CRC校验多项式 */}SPI_InitTypeDef;
//(对于F7/H7来说,还有一些附加功能相关成员(NSS/CRC/IOSwap))

2.NOR FLASH介绍

2.1.FLASH简介

  • FLASH是常用的储存器件,它具有容量大,可重复擦写、按“扇区/块”擦除、掉电后数据可继续保存的特性,属于EEPROM
  • FLASH是有一个物理特性:写数据前需要擦除写操作,1->0,擦除0->1
  • FLASH主要有NOR Flash和NAND Flash两种类型,NOR和NAND是两种数字门电路

【注意:NAND和NOR的0地址是不冲突的,NOR占用BANK地址,而NAND不占用BANK地址,它的0地址是内部的】

【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第15张图片

2.2.NOR FLASH举例——NM25Q128

NM25Q128,串行闪存器件,属于NOR FLASH,容量为128 Mb。擦写周期可达10W次,可以将数据保存达20年之久。
SPI数据传输时序:支持模式0(CPOL = 0 , CPHA = 0)和模式3(CPOL = 1, CPHA = 1)
数据格式:数据长度8位大小,先发高位,再发低位
传输速度:支持标准模式104M bit/s
【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第16张图片
【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第17张图片
寻址范围:0x00000000-0x00FFFFFF
读:任意读
写:页内写、页间写(擦除/不擦除)
擦:片擦、块擦、扇擦…

  • 常用指令及时序

2.3.NOR Flash工作时序(NM25Q128)

NOR FLASH的指令总数比较多, 但是如果只需要实现基本操作, 还是比较简单的。一般我们只需要:5条指令即可完成对NOR FLASH的基本使用(以NM25Q128为例)
【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第18张图片

  • 写使能 Write Enable (06H)
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第19张图片

  • 读状态寄存器Read Status Reg1(05H)
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第20张图片

  • 读时序 Read Data Bytes(03H)
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第21张图片

  • 页写时序 PageProgram (02H)
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第22张图片

  • 扇区擦除时序 Sector Erase(20H)
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第23张图片

  • NM25Q128的状态寄存器
    【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第24张图片
    BUSY位:指示当前状态。 0:空闲状态(硬件自动清除) 1:当前处于忙碌状态
    WEL位 :执行WriteEnable指令该位为1,可以页写/扇区or块or片擦除/写状态寄存器。0:写禁止,不能页编程/扇区or块or片擦除/写状态寄存器

2.4.NOR FLASH驱动步骤(NM25Q128)

  • 初始化片选引脚与SPI接口:相关GPIO初始化、SPI初始化(模式、位数、分频、MSB等)
  • NM25Q128 读取:0x03指令 + 24位地址 + 读取数据
  • NM25Q128 扇区擦除:0x06指令 + 等待空闲 + 0x20指令 + 24位地址 + 等待空闲
  • NM25Q128 写入:擦除扇区(可选)+ 0x06指令 + 0x02指令 + 24位地址 + 写入数据 + 等待空闲

NOR FLASH驱动核心在写数据,写数据需要注意:

  1. 是否需要擦除?
  2. 写入数据(是否需要换页?是否需要换扇区?)
  3. 遵循:读、改、写 的原则

3.STM32使用SPI协议驱动NM25Q128实验

【嵌入式学习笔记】嵌入式入门8——SPI总线协议_第25张图片
【代码暂不贴出】

你可能感兴趣的:(嵌入式学习专栏(STM32),学习,笔记,单片机,嵌入式硬件,stm32)