赞
踩
本文主要记录如何使用STMCubeMX快速部署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 存储器又称闪存,它与 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引脚控制。
FLASH芯片在接收到主机发来的信号时会解析信号内容,根据指令表执行不同的命令。
本次实验用到的W25Q64指令表如下(详细的可以查阅W25Q64芯片手册获取相关信息):
指令 | 指令编码 | 指令解释 |
---|---|---|
写使能 | 06h | 开启FLASH芯片的写入 |
写禁止 | 04h | 禁止FLASH芯片的写入 |
读状态寄存器 | 05h | 判断FLASH读取工作的状态 |
写状态寄存器 | 01h | 判断FLASH写入工作的状态 |
读 | 03h | 开始读取FLASH中数据 |
页写入 | 02h | 一次最多写入256个字节 |
扇区擦除 | 20h | 擦除一个扇区的数据(4KB) |
厂商设备信息 | 09h | 获取厂商和设备编号 |
1.新建工程,常规配置调试模式、时钟树、项目环境;
2.选择PB0、PB5、PC0配置为GPIO_Out,初始为高电平,PC0为片选信号;
3.选择SPI1,配置模式为全双工主模式,硬件片选关闭,软件片选打开,选择数据大小,MSB/LSB模式。
值得注意的是,分频系数选择4,虽然SPI1的最大波特率能取到36MBits/s,但这里是被限制了。
4.配置好USART1用于串口调试。
5.GENERATE CODE
#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,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。