当前位置:   article > 正文

STM32HAL库学习笔记八——SPI通信_hal库 spi

hal库 spi

HAL库快速部署SPI通信

本文主要记录如何使用STMCubeMX快速部署SPI通信。



SPI简介

SPI是一种串行同步高速的全双工通信方式。

SPI的物理层一般由四条数据线组成:片选信号线CS/NSS,时钟信号线SCK,主写从读信号线MOSI,主读从写信号线MISO。
在这里插入图片描述

SPI的协议层主要包括起始信号、停止信号、数据有效性、通信模式四个部分。
与I2C通信不同,SPI的起始停止信号由片选信号线控制,而I2C由时钟线为高电平时数据线电平的变化来控制。
数据有效性部分,SPI在时钟信号电平变化时,即上升沿或者下降沿进行数据的触发(数据变化)或者采样(认定此时数据有效),前一个边沿触发,后一个边沿就进行采样,具体采样和触发谁先谁后要依据通信模式的配置;I2C相对要简单一些,在时钟线为高电平时数据有效,在低电平时进行数据电平变换。
对于通信模式,引入CPOL和CPHA的概念,CPOL和CPHA分别被称为时钟极性和时钟相位,CPOL为0表示SPI通信未开始时SCK时钟信号为低电平,为1则是高电平;CPHA为0表示数据采样时刻是SCK的奇数边沿,为1则是SCK的偶数边沿。
CPOL与CPHA两两组合形成4种模式,对于FLASH芯片支持模式0和模式3,即CPOL和CPHA都为0或者都为1的模式。这样一来,模式0就表示片选信号触发通信开始后,时钟线第一个上升沿进行数据采样,之后的下降沿数据触发,第二个上升沿再采样,依次类推。
在这里插入图片描述
而SPI没有应答信号的设置,也不需要在通信前先发送从机地址查找从机,用片选信号线就能解决。由于SPI是全双工通信,因此也不需要设置读写位。


FLASH简介

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

STM32f103VET6单片机使用的是型号为W25Q64的FLASH芯片,是一种使用 SPI 通讯协议的 NOR FLASH存储器(NOR Flash是一种非易失闪存技术,是Intel在1988年创建。是市场上两种主要的非易失闪存技术之一),存储容量64Mbit,即8MBytes。它的CS/CLK/DIO/DO 引 脚 分 别 连 接 到 了 STM32 对 应 的 SPI 引 脚NSS/SCK/MOSI/MISO 上,其中 STM32 的 NSS 引脚是一个普通的 GPIO,不是 SPI 的专用NSS 引脚,所以程序中我们要使用软件控制片选信号,对于STM32f103VET6单片机片选信号由PC0引脚控制。
STM32F103VET6单片机的FLASH连接图
FLASH芯片在接收到主机发来的信号时会解析信号内容,根据指令表执行不同的命令。
本次实验用到的W25Q64指令表如下(详细的可以查阅W25Q64芯片手册获取相关信息):

指令 指令编码 指令解释
写使能 06h 开启FLASH芯片的写入
写禁止 04h 禁止FLASH芯片的写入
读状态寄存器 05h 判断FLASH读取工作的状态
写状态寄存器 01h 判断FLASH写入工作的状态
03h 开始读取FLASH中数据
页写入 02h 一次最多写入256个字节
扇区擦除 20h 擦除一个扇区的数据(4KB)
厂商设备信息 09h 获取厂商和设备编号

HAL库配置读写串行FLASH

一、CubeMX配置

1.新建工程,常规配置调试模式、时钟树、项目环境;
2.选择PB0、PB5、PC0配置为GPIO_Out,初始为高电平,PC0为片选信号;
3.选择SPI1,配置模式为全双工主模式,硬件片选关闭,软件片选打开,选择数据大小,MSB/LSB模式。
值得注意的是,分频系数选择4,虽然SPI1的最大波特率能取到36MBits/s,但这里是被限制了。

SPI1配置
4.配置好USART1用于串口调试。
5.GENERATE CODE

二、手写代码

1.宏定义与全局变量

#define CS_enable HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET)		//片选信号使能
#define CS_disable HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET)		//片选信号失能

/***FLASH指令集***/
#define W25X_WriteEnable 0x06
#define W25X_WriteDisable 0x04
#define W25X_ReadStatusReg 0x05
#define W25X_WriteStatusReg 0x01
#define W25X_ReadData 0x03
#define W25X_PageProgram 0x02
#define W25X_SectorErase 0x20
#define W25X_ManufactDeviceID 0x90

uint8_t devid[2];
uint8_t sendbuf[8] = {
   1,36,4,7,8,
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/126041
推荐阅读
相关标签
  

闽ICP备14008679号