此内容是为自己方便回忆,如有错误,欢迎指导,内容来源于野火指南者开发板教程。
一.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函数实现文件的各种操作。