2022年6月8日STM32——SPI读写串行FLASH 和 串行FLASH文件系统FatFs

此内容是为自己方便回忆,如有错误,欢迎指导,内容来源于野火指南者开发板教程。

一.SPI读写串行FLASH

SPI(Serial Peripheral Interface)串行外围设备接口,是高速全双工的通信总线,通讯速率较高。

SPI物理层:

①片选信号线NSS、CS(Slave Select):低电平时设备被选中

②时钟信号线SCK(Serial Clock):用于通讯数据同步

③主设备输出/从设备输入引脚MOSI(Master Output,Slave Input):数据传输方向由主机到从机

④主设备输入/从设备输出引脚MISO(Master Input,Slave Output):数据传输方向由从机到主机

SPI协议层:

NSS、SCK、MOSI信号都是由主机控制产生,MISO信号由从机控制产生,MOSI和MISO信号在NSS低电平有效,SCK的每个时钟周期MOSI和MISO传输一位数据。

1.起始和停止信号:NSS由高变低即为SPI通讯的起始信号,NSS由低变高即SPI通讯的停止信号

2.数据有效性:此处为MSB先行模式(还有LSB先行模式),MOSI和MISO在SCK的上升期间变化输出,在SCK下降沿时被采样,只有在SCK下降沿时刻MOSI和MISO数据有效,高电平为1,低电平为0,其他时候数据无效。

3.时钟极性CPOL/时钟相位CPHA及通讯模式

模式0和模式3使用比较多。 

SPI框架:

 SPI是APB2上的设备,最高通信速率达36Mbit/s,SPI2、SPI3是APB1上的设备,最高通信速率为18Mbit/s.

SCK线的时钟信号由波特率发生器根据SPI_CR1的BR[0:2]位控制

 数据帧长度通过控制寄存器CR1的DFF位配置成8位或16位模式,配置LSBFIRST位可选择MSB先行还是LSB先行。

STM32作为SPI通讯的主机端时的数据收发过程:

SPI结构体:

SPI读写串行FLASH实验

硬件结构:

 WP引脚控制写保护功能,低电平时进制写入数据。

HOLD引脚可用于暂停通讯,低电平时通讯暂停,数据输出引脚输出高阻态,时钟和数据输入引脚无效。

NSS引脚只是一个普通GPIO,不是SPI的专用NSS引脚。

程序思路:

1.初始化通讯使用的目标引脚和端口时钟

2.使能SPI外设时钟

3.配置SPI结构体

4.编写基本SPI按字节收发的函数

5.编写对FLASH擦除和读写操作的函数

6.数据校验

SPI初始化函数:W25Q64芯片手册支持SPI模式0及模式3,支持双线全双工,使用MSB先行模式,支持最好通讯时钟为104MHz,数据帧长度为8位。

FLASH还有些指令编码表:具体看手册 

发送并接收一个字节

使用SPI读取一个字节的数据

读取FLASH ID号

向FLASH发送"写使能"命令:

擦除FLASH指定扇区

读取FLASH的内容

向FLASH写入内容

擦除FLASH指定扇区:

FLASH存储器只能把原来的"1"的数据位改为"0",而原来的"0"的数据位不能直接改为"1"

一个块(Block)包含16个扇区

FLASH的页写入

页写入命令最多可以一次向FLASH传输256个字节的数据。

第一个字节为"页写入指令"编码,2-4字节为要写入的地址,接着是要写入的数据 

不定量数据写入:

 

从FLASH读取数据:

 等待FLASH内部时序操作完成:看状态寄存器的第0位是否为1,当为1时,FLASH芯片处于忙碌状态。

 关键在于:读懂SPI时序图!!!

二.串行FLASH文件系统FatFs

常见得windows下的文件系统格式包括FAT32、NTFS、exFAT

FatFs文件源码获取网址:http://elm-chan.org/fsw/ff/00index_e.html

FATFS文件夹中包括:

 FatFs程序结构图:

通过在diskio.c中加入bsp_spi_flash.c中的函数,完善f_函数。

diskio.h中要配置这个几个函数:

integer.h中是一些重定义:

ffconf.h中配置定义:

ff.h中包括几个重要的结构体SRESULT、FILINFO、DIR、FIL、FATFS和下面的函数:

程序思路:diskio.c这样配置

 

ffconf.h这样配置:

#define    _USE_STRFUNC    1

#define    _USE_MKFS        1  /*格式化功能选择*/

#define _CODE_PAGE    936   /*语言功能选择*/

#define    _USE_LFN    2  /*默认1,长文件名支持*/

#define _VOLUMES    2     /*物理设备数量,2为包括预留SD卡和SPI Flash芯片*/

#define    _MIN_SS        512

#define    _MAX_SS        4096  //扇区大小的最小值和最大值

 主程序:文件系统的写入和读出

  总结:如果自变量是存在局部变量中,若超过栈的大小定义的值

 就会报错,卡在这里!

 文件系统主要是用spi_flash写的函数套用在disk_函数里面,再用f_函数在mian函数实现文件的各种操作。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值