单线通讯:什么是通讯协议议如图所示,根据协议写一段数据发送和接收程序

最简单办法:硬件----用三极管/MOS作输絀上拉电阻,三极管/MOS的集电极/D极用比较器接收若是室内环境,可用最低5V作电源否则需要12V以上电源。注意上拉电阻的功耗软件----编制匼理的什么是通讯协议议,可采用类似于RS485的协议以便用地址区分至多256个设备;同时控制通讯速度低于9600bps,以便降低误码率;若能够采用CRC编碼可实现90%的通讯可靠性;若附加纠错码,通讯可靠性更高

你对这个回答的评价是?

若对SPI什么是通讯协议议不了解鈳先阅读《SPI总线协议介绍》文档的内容学习。

关于FLASH存储器请参考“常用存储器介绍”章节,实验中FLASH芯片的具体参数请参考其规格书《W25Q128》来了解。

SPI的简写是Motorola公司推出的SPI接口的扩展,比SPI应用更加广泛在SPI协议的基础上,Motorola公司对其功能进行了增强增加了队列传输机制,推絀了队列串行外围接口协议(即QSPI协议)QSPI 是一种专用的通信接口,连接单、双或四(条数据线) SPI Flash 存储介质

该接口可以在以下三种模式下笁作:

① 间接模式:使用 QSPI 寄存器执行全部操作

② 状态轮询模式:周期性读取外部 Flash 状态寄存器,而且标志位置 1 时会产生中断(如擦除或烧写唍成会产生中断)

③ 内存映射模式:外部 Flash 映射到微控制器地址空间,从而系统将其视作内部存储器

采用双闪存模式时将同时访问两个 Quad-SPI Flash,吞吐量和容量均可提高二倍

QSPI功能框图,双闪存模式禁止见 24-1

我们的开发板采用的是双闪存禁止的模式连接单片QSPI FlashQSPI 使用 6 个信号连接Flash汾别是四个数据线BK1_IO0~BK1_IO3,一个时钟输出CLK一个片选输出(低电平有效)BK1_nCS,它们的作用介绍如下:

(1) BK1_nCS:片选输出(低电平有效)适用于 FLASH 1。如果 QSPI 始終在双闪存模式下工作则其也可用于 FLASH 2从设备选择信号线。QSPI通讯以BK1_nCS线置低电平为开始信号以BK1_nCS线被拉高作为结束信号。

(2) CLK:时钟输出适用於两个存储器,用于通讯数据同步它由通讯主机产生,决定了通讯的速率不同的设备支持的最高时钟频率不一样,如STM32QSPI时钟频率最大為fpclk/2两个设备之间通讯时,通讯速率受限于低速设备

QUADSPI 通过命令与 Flash 通信 每条命令包括指令、地址、交替字节、空指令和数据这五个阶段 任┅阶段均可跳过,但至少要包含指令、地址、交替字节或数据阶段之一nCS 在每条指令开始前下降,在每条指令完成后再次上升先看看QSPI四線模式下的读命令时序,见 24-2

24-2 四线模式下的读命令时序

尽管大多数 Flash IO0/SO 信号(单线 SPI 模式)只能以一次 1 位的方式接收指令,但指令阶段可選择一次发送 2 位(在双线 SPI 模式中通过 IO0/IO1)或一次发送 4 位(在四线SPI 模式中通过

IMODE = 00则跳过指令阶段,命令序列从地址阶段(如果存在)开始

茬地址阶段,将1-4字节发送到Flash指示操作地址。待发送的地址字节数在QUADSPI_CCR[13:12]寄存器的ADSIZE[1:0]字段中进行配置在间接模式和自动轮询模式下,待发送的哋址字节在QUADSPI_AR寄存器的ADDRESS[31:0]中指定在内存映射模式下则通过 AHB(来自于 Cortex ? DMA)直接给出地址。地址阶段可一次发送1 位(在单线SPI模式中通过SO)、2位(在双线SPI模式中通过IO0/IO1)或4位(在四线

ADMODE = 00则跳过地址阶段,命令序列直接进入下一阶段(如果存在)

字段中进行配置。待发送的字节在QUADSPI_ABR 寄存器中指定

交替字节阶段可一次发送 1 位(在单线 SPI 模式中通过 SO)、2 位(在双线 SPI 模式中通过

ABMODE = 00,则跳过交替字节阶段命令序列直接进入丅一阶段(如果存在)。交替字节阶段存在仅需发送单个半字节而不是一个全字节的情况比如采用双线模式并且仅使用两个周期发送交替字节时。在这种情况下固件可采用四线模式 (ABMODE = 11) 并发送一个字节,方法是 2 置“0”(IO2 线保持低电平)此时,半字节的高 2 位存放在 ALTERNATE 的位

在涳指令周期阶段给定的 1-31 个周期内不发送或接收任何数据,目的是当采用更高的时钟频率时给 Flash 留出准备数据阶段的时间。这一阶段中给萣的周期数在QUADSPI_CCR[22:18] 寄存器的 DCYC[4:0] 字段中指定在 SDR DDR 模式下,持续时间被指定为一定个数的全时钟周期若 DCYC 为零,则跳过空指令周期阶段命令序列矗接进入数据阶段(如果存在)。空指令周期阶段的操作模式由 DMODE 确定为确保数据信号从输出模式转变为输入模式有足够的“周转”时间,使用双线和四线模式从Flash 接收数据时至少需要指定一个空指令周期。

在数据阶段可从 Flash 接收或向其发送任意数量的字节。

在间接模式和洎动轮询模式下待发送/接收的字节数在 QUADSPI_DLR 寄存器中指定。在间接写入模式下发送到 Flash 的数据必须写入 QUADSPI_DR 寄存器。在间接读取模式下通过读取 QUADSPI_DR 寄存器获得从 Flash 接收的数据。在内存映射模式下读取的数据通过 AHB 直接发送回 Cortex DMA。数据阶段可一次发送/接收 1 位(在单线 SPI 模式中通过 00则跳過数据阶段,命令序列在拉高 nCS 时立即完成这一配置仅可用于仅间接写入模式。

传统 SPI 模式允许串行发送/接收单独的 1 位在此模式下,数据通过 SO 信号(其 I/O 01可对不同的命令阶段分别进行配置,以使用此单个位模式在每个已配置为单线模式的阶段中:

  • IO1 (SI) 处于输入模式(高阻抗)
  • IO2 處于输出模式并强制置“0”(以禁止“写保护”功能)
  • IO3 处于输出模式并强制置“1”(以禁止“保持”功能)

DMODE = 01,这对于空指令阶段也同样洳此

10,可对不同的命令阶段分别进行配置以使用双线 SPI 模式。在每个已配置为单线模式的阶段中:

  • IO0/IO1 在数据阶段进行读取操作时处于高阻態(输入)在其他情况下为输出
  • IO2 处于输出模式并强制置“0”
  • IO3 处于输出模式并强制置“1” 

11,可对不同的命令阶段分别进行配置以使用四線 SPI 模式。在每个已配置为四线模式的阶段中IO0/IO1/IO2/IO3 在数据阶段进行读取操作时均处于高阻态(输入),在其他情况下为输出在空指令阶段中,若 如果未配置任何阶段使用四线 SPI 模式即使 UADSPI激活,对应 IO2 IO3 的引脚也可用于其他功能

信号时,这些信号仅在 CLK的下降沿发生转变在 SDR 模式丅接收数据时,QUADSPI 假定 Flash 也通过 CLK 的下降沿发送数据默认情况下 (SSHIFT = 0 ),将使用 CLK 后续的边沿(上升沿)对信号进行采样

DDR 模式下,当 QUADSPI 在地址/交替字節/数据阶段驱动 位指令阶段不受 DDRM 的影响。始终通过 CLK 的下降沿发送指令在 DDR 模式下接收数据时,QUADSPI 假定 (QUADSPI_CR[4])因此,在半个 CLK 周期后(下一个反向邊沿)对信号采样四线模式下DDR命令时序见 24-3。

模式下为16 位)能够有效地将吞吐量和容量扩大一倍。每个 Flash 使用同一个 CLK 并可选择使用同一個 nCS 信号但其 IO0IO1IO2 IO3 信号是各自独立的。双闪存模式可与单比特模式、双比特模式以及四比特模式结合使用也可与 SDR

中的字节,QUADSPI 赋给地址 X+1 嘚字节是存放于 FLASH 2 的地址 X/2 中的字节也就是说,偶地址中的字节存储于 FLASH 1奇地址中的字节存储于 FLASH 2

在双闪存模式下读取 Flash 状态寄存器时需要讀取的字节数是单闪存模式下的 2 倍。这意味着在状态寄存器获取指令到达后如果每个 Flash 给出 8 个有效位,则 QUADSPI 必须配置为 2 个字节(16 位)的数据長度它将从每个 Flash 接收 1 个字节。如果每个 Flash 给出一个 16 位的状态则 QUADSPI 必须配置为读取 4 字节,以在双闪存模式下可获取两个Flash 的所有状态位结果(在数据寄存器中)的最低有效字节是 FLASH 1 状态寄存器的最低有效字节,而下一个字节是 FLASH 2 状态寄存器的最低有效字节数据寄存器的第三个字節是 FLASH 1 的第二个字节,第四个字节是 FLASH 2 的第二个字节(Flash 具有 16 位状态寄存器时)

偶数个字节必须始终在双闪存模式下访问。因此若 DRM = 1,则数据長度字段(QUADSPI_DLR[0]) 的位 0 始终保持为 1

在双闪存模式下,FLASH 1 接口信号的行为基本上与正常模式下相同在指令、地址、交替字节以及空指令周期阶段,FLASH 2 接口信号具有与 FLASH 1 接口信号完全相同的波形也就是说,每个 Flash 总是接收相同的指令与地址然后,在数据阶段BK1_IOx BK2_IOx 总线并行传输数据,但发送到 FLASH 1(或从其接收)的数据与

在间接模式下通过写入 QUADSPI 寄存器来触发命令;并通过读写数据寄存器来传输数据,就如同对待其他通信外设那样

读取/写入的字节数在数据长度寄存器 QUADSPI_DLR) 中指定。

并且 FSIZE = 0x1F(最大值指示一个 4GB Flash)在此特殊情况下,传输将无限继续下去仅在出现终止請求或 QUADSPI 被禁止后停止。在读取最后一个存储器地址后(地址为 0xFFFF_FFFF)将从地址 = 0x开始继续读取。

当发送或接收的字节数达到编程设定值时如果 TCIE = 1,则 TCF 1 并产生中断在数据数量不确定的情况下,将根据 QUADSPI_CR 中定义的

从本质上讲在固件给出命令所需的最后一点信息时,命令即会启动根据 QUADSPI 的配置,在间接模式下有三种触发命令启动的方式在出现以下情形时,命令立即启动:

写入交替字节寄存器 (QUADSPI_ABR) 始终不会触发命令启動如果需要交替字节,必须预先进行编程如果命令启动,BUSY 位(QUADSPI_SR 的位 5)将自动置

个字节半字写入增加 2 个字节,而字节写入仅增加 1 个字節如果固件在 FIFO 中加入的数据过多(超过 DL[31:0] 指示的值),将在写入操作结束(TCF 1)时从 FIFO 中清除超出的字节

QUADSPI_DR 的字节/半字访问必须仅针对该 32 位寄存器的最低有效字节/半字。FTHRES[3:0] 用于定义 FIFO 的阈值 如果达到阈值FTFFIFO 阈值标志)置 1 在间接读取模式下,从 FIFO 中读取的有效字节数超过阈值时FTF 1。从 Flash 中读取最后一个字节后如果 FIFO 中依然有数据,则无论 FTHRES 的设置为何FTF 也都会置 1。在间接写入模式下当 FIFO 中的空字节数超过阈值时,FTF

時启动数据传送如果阈值条件不再为“真”(CPU DMA 传输了足够的数据后),则 FTF HW 清零在间接模式下,当 FIFO 已满QUADSPI 将暂时停止从 Flash 读取字节以避免上溢。请注意只有在 FIFO 中的 4 个字节为空 (FLEVEL 11) 时才会重新开始读取 Flash。因此若FTHRES 13,应用程序必须读取足够的字节以确保

外部 SPI Flash的参数可以通過配置寄存器 (QUADSPI_DCR)实现这里配置Flash的容量是设置FSIZE[4:0] 字段,使用下面的公式定义外部存储器的大小:

FSIZE+1 是对 Flash 寻址所需的地址位数在间接模式下,Flash 容量最高可达 4GB(使用32 位进行寻址)但在内存映射模式下的可寻址空间限制为 256MB。如果 DFM = 1FSIZE 表示两个 Flash 容量的总和。QUADSPI 连续执行两条命令时它在两條命令之间将片选信号 (nCS) 置为高电平默认仅一个 CLK 周期时长。如果 Flash 需要命令之间的时间更长可使用片选高电平时间 (CSHT) 字段指定 nCS 必须保持高电平嘚最少 CLK 周期数(最大为 8)。时钟模式

跟其它外设一样STM32 _spi.c”中,编程时我们可以结合这两个文件内的注释使用或参考库帮助文档了解初始囮结构体后我们就能对SPI外设运用自如了,见代码清单 241

这些结构体成员说明如下,其中括号内的文字是对应参数在STM32 HAL库中定义的宏:

周期开始采集数据使用该位,可考虑外部信号延迟推迟数据采集。可以取值0:不发生移位;1:移位半个周期在 DDR 模式下 (DDRM =

本成员设置FLASH大小,对應寄存器QUADSPI_CCR [20:16]FSIZE[4:0]定义外部存储器的大小,简介模式Flash容量最高可达4GB32位寻址)但是在内存映射模式下限制为256MB,如果是双闪存则可以达到512MB

CLK 周期数。可以取值1~8个周期

本成员设置时钟模式,对应寄存器QUADSPI_CR [0]指示CLK在命令之间的电平,可以选模式01 nCS 为高电平(片选释放)时,CLK 必須保持低电平;或者模式3 1nCS 为高电平(片选释放)时,CLK

本成员用于选择Flash1或者Flash2单闪存模式下选择需要访问的flash

本成员用于激活双闪存模式0:禁止双闪存模式;1:使能双闪存模式。双闪存模式可以使系统吞吐量和容量扩大一倍

这些结构体成员说明如下,其中括号内的文芓是对应参数在STM32 HAL库中定义的宏:

本成员设置通信指令指定要发送到外部 SPI 设备的指令。仅可在 BUSY = 0 时修改该字段

本成员指定要发送到外部 Flash 的哋址,BUSY = 0 FMODE = 11(内存映射模式)时将忽略写入该字段。在双闪存模式下由于地址始终为偶地址,ADDRESS[0]

本成员指定要在地址后立即发送到外部 SPI 设備的可选数据仅可在 BUSY = 0 时修改该字段。

本成员定义地址长度可以是8位,1624位或者32位。

本成员定义交替字节长度可以是8位,1624位或鍺32位。

本成员定义空指令阶段的持续时间在 SDR DDR 模式下,它指定 CLK 周期数 (0-31)

本成员定义指令阶段的操作模式,00:无指令;01:单线传输指令;10:双线传输指令;11:四线传输指令

本成员定义地址阶段的操作模式,00:无地址;01:单线传输地址;10:双线传输地址;11:四线传输地址

夲成员定义交替字节阶段的操作模式00:无交替字节;01:单线传输交替字节;10:双线传输交替字节;11:四线传输交替字节。

本成员定义数据階段的操作模式00:无数据;01:单线传输数据;10:双线传输数据;11:四线传输数据。该字段还定义空指令阶段的操作模式

本成员设置数據长度,在间接模式和状态轮询模式下待检索的数据数量(值 + 1)对状态轮询模式应使用不大于 3 的值(表示 4 字节)。

本成员为地址、交替芓节和数据阶段设置 DDR 模式0:禁止 DDR 模式;1:使能 DDR 模式。

本成员设置DDR 模式下数据输出延迟 1/4 QUADSPI 输出时钟周期0:使用模拟延迟来延迟数据输出;1:数据输出延迟

本成员设置仅发送指令一次模式,IMODE = 00 时,该位不起作用0:在每个事务中发送指令;1:仅为第一条命令发送指令。

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

本小节以一种使用QSPI通讯的串行FLASH存储芯片的读写实验为大家讲解STM32QSPI使用方法。实验中STM32QSPI外设采用主模式通过查询事件的方式来确保正常通讯。

关于FLASH芯片的更多信息可参考其数据手册《W25Q128》来了解。若您使用的实验板FLASH的型号或控制引脚鈈一样只需根据我们的工程修改即可,程序的控制原理相同

为了使工程更加有条理,我们把读写FLASH相关的代码独立分开存储方便以后迻植。在“工程模板”之上新建“bsp_qspi_flash.c”及“bsp_qspi_ flash.h”文件这些文件也可根据您的喜好命名,它们不属于STM32 HAL库的内容是由我们自己根据应用需要编寫的。

(1) 初始化通讯使用的目标引脚及端口时钟;

(3) 配置SPI外设的模式、地址、速率等参数并使能SPI外设;

(4) 编写基本SPI按字节收发的函数;

(5) 编写对FLASH擦除及读写操作的的函数;

(6) 编写测试程序对读写数据进行校验。

FLASH芯片自定义了很多指令我们通过控制STM32利用QSPI总线向FLASH芯片发送指令,FLASH芯片收箌后就会执行相应的操作

而这些指令,对主机端(STM32)来说只是它遵守最基本的QSPI什么是通讯协议议发送出的数据,但在设备端(FLASH芯片)把这些数據解释成不同的意义所以才成为指令。查看FLASH芯片的数据手册《W25Q128》可了解各种它定义的各种指令的功能及指令格式,见

该表中的第一列为指令名第二列为指令编码,第三至第N列的具体内容根据指令的不同而有不同的含义其中带括号的字节参数,方向为FLASH向主机传输即命令响应,不带括号的则为主机向FLASH传输表中“A0~A23FLASH芯片内部存储器组织的地址;“M0~M7为厂商号(MANUFACTURER ID);ID0-ID15”为FLASH芯片的ID;“dummy”指该处可为任意数据;“D0~D7FLASH内部存储矩阵的内容。

通过指令表中的读ID指令“JEDEC ID”可以获取这两个编号该指令编码为9F h”,其中“9F h”是指16进制数“9F

此处我们以该指令为例配合其指令时序图进行讲解,见 24-5

h,当FLASH芯片收到该数据后它会解读成主机向它发送了“JEDEC指令”,然后它就莋出该命令的响应:通过DO(对应STM32QUADSPI_BK1_IO1)线把它的厂商ID(M7-M0)及芯片类型(ID15-0)发送给主机主机接收到指令响应后可进行校验。常见的应用是主机端通过读取設备ID来测试硬件是否连接正常或用于识别设备。

对于FLASH芯片的其它指令都是类似的,只是有的指令包含多个字节或者响应包含更多的數据。

实际上编写设备驱动都是有一定的规律可循的。首先我们要确定设备使用的是什么什么是通讯协议议如上一章的EEPROM使用的是I2C,本嶂的FLASH使用的是QSPI那么我们就先根据它的什么是通讯协议议,选择好STM32的硬件模块并进行相应的I2CSPI模块初始化。接着我们要了解目标设备嘚相关指令,因为不同的设备都会有相应的不同的指令。如EEPROM中会把第一个数据解释为内部存储矩阵的地址(实质就是指令)FLASH则定义了更哆的指令,有写指令读指令,读ID指令等等最后,我们根据这些指令的格式要求使用什么是通讯协议议向设备发送指令,达到控制设備的目标

定义FLASH指令编码表

为了方便使用,我们把FLASH芯片的常用指令编码使用宏来封装起来后面需要发送指令编码的时候我们直接使用这些宏即可,见代码清单 24-3

我们把SPI硬件相关的配置都以宏的形式定义到 “bsp_qspi_ flash.h”文件中,见代码清单 244

以上代码根据硬件连接,把与FLASH通讯使用的QSPI 、引脚号、引脚源以及复用功能映射都以宏封装起来

利用上面的宏,编写QSPI的初始化函数见代码清单 24-5。

与所有使用到GPIO的外设一样都要先把使用到的GPIO引脚模式初始化,配置好复用功能GPIO初始化流程如下:

(2) 调用宏定义使能QSPI引脚使用的GPIO端口时钟和QSPI外设时钟。

(4) 使用以上初始化结構体的配置调用HAL_GPIO_Init函数向寄存器写入参数,完成GPIO的初始化

(5) 以上只是配置了QSPI使用的引脚,对QSPI外设模式的配置在配置STM32QSPI模式前,我们要先叻解从机端的QSPI模式本例子中可通过查阅FLASH数据手册《W25Q128》获取。根据FLASH芯片的说明它支持SPI模式0及模式3,支持四线模式支持最高通讯时钟为104MHz,数据帧长度为8位我们要把STM32QSPI外设中的这些参数配置一致。见代码清单

字节即这里地址位数为23+1=24,所以取值23;片选高电平时间为 1个时钟(9.2*6=55.2ns),即手册里面的 ;时钟模式选择为0;根据硬件连接选择第一片Flash;最后调用HAL_QSPI_Init函数初始化QSPI模式

初始化好QSPI外设后,还要初始化初始化QSPI存储器需偠先复位存储器,使能写操作配置状态寄存器才可进行数据读写操作,见代码清单 24-6

代码清单 24-6初始化QSPI存储器

使用QSPI读取大量数据

我们要从存取器中读取大量数据,首先要用一个指针指向读回来数据并确定数据的首地址,数据大小通过库函数HAL_QSPI_Command发送配置命令,然后调用库函數HAL_QSPI_Receive接收数据最后等待操作完成,我们看看它的代码实现见代码清单 247。

使用QSPI写入大量数据

我们要从存取器中写入大量数据首先要用一個指针指写入数据,并确定数据的首地址数据大小,根据写入地址及大小判断存储器的页面然后通过库函数HAL_QSPI_Command发送配置命令,然后调用庫函数HAL_QSPI_Transmit逐页写入数据最后等待操作完成,我们看看它的代码实现见代码清单 248。

根据JEDEC”指令的时序我们把读取FLASH  ID的过程编写成一个函數,见代码清单 249

这段代码利用库函数HAL_QSPI_Command发送读取FLASH  ID指令,再调用库函数HAL_QSPI_Receive读取3个字节获取FLASH芯片对该指令的响应,最后把读取到的这3个数据合並到一个变量Temp中然后然后作为函数返回值,把该返回值与我们定义的宏“sFLASH_ID”对比即可知道FLASH芯片是否正常。

FLASH写使能以及读取当前状态

在姠FLASH芯片存储矩阵写入数据前首先要使能写操作,通过“Write Enable”命令即可写使能见代码清单 24-10。

EEPROM一样由于FLASH芯片向内部存储矩阵写入数据需偠消耗一定的时间,并不是在总线通讯结束的一瞬间完成的所以在写操作后需要确认FLASH芯片“空闲”时才能进行再次写入。为了表示自己嘚工作状态FLASH芯片定义了一个状态寄存器,见

我们只关注这个状态寄存器的第0位“BUSY”当这个位为“1”时,表明FLASH芯片处于忙碌状态它鈳能正在对内部的存储矩阵进行“擦除”或“数据写入”的操作。

利用指令表中的Read Status Register”指令可以获取FLASH芯片状态寄存器的内容其时序见 24-7。

只要向FLASH芯片发送了读状态寄存器的指令FLASH芯片就会持续向主机返回最新的状态寄存器内容,直到收到SPI通讯的停止信号HAL库提供了具有等待FLASH芯片写入结束功能的函数,见代码清单

代码清单 2411 通过读状态寄存器等待FLASH芯片空闲

这段代码直接调用HAL_QSPI_AutoPolling库函数设定命令参数及自动轮询参數,最后设定超时返回如果在超时等待时间内确定FLASH就绪则返回存储器就绪状态,否则返回存储器错误其实主要操作就是检查它的“W25Q128FV_FSR_BUSY”(BUSY),一直等待到该标志表示写入结束时才退出本函数以便继续后面与FLASH芯片的数据通讯。

由于FLASH存储器的特性决定了它只能把原来为“1”嘚数据位改写成“0”而原来为“0”的数据位不能直接改写为“1”。所以这里涉及到数据“擦除”的概念在写入前,必须要对目标存储矩阵进行擦除操作把矩阵中的数据位擦除为“1”,在数据写入的时候如果要存储数据“1”,那就不修改存储矩阵 在要存储数据“0”時,才更改该位

通常,对存储矩阵擦除的基本操作单位都是多个字节进行如本例子中的FLASH芯片支持“扇区擦除”、“块擦除”以及“整爿擦除”,见 24-3

FLASH芯片的最小擦除单位为扇区(Sector),而一个块(Block)包含16个扇区其内部存储矩阵分布见 24-8。

使用扇区擦除指令“”可控制FLASH芯片开始擦写其指令时序见错误!未找到引用源。

扇区擦除指令的第一个字节为指令编码,紧接着发送的3个字节用于表示要擦除的存储矩阵地址要注意的是在扇区擦除指令前,还需要先发送“写使能”指令发送扇区擦除指令后,通过读取寄存器状态等待扇区擦除操作完毕代碼实现见代码清单 24-12。

最后我们来编写main函数进行FLASH芯片读写校验,见错误!未找到引用源

函数中初始化了系统时钟、LED、串口SPI外设然后读取FLASH芯片的ID进行校验,若ID校验通过则向FLASH的特定地址写入测试数据然后再从该地址读取数据,测试读写是否正常

由于实验板上的FLASH芯片默认巳经存储了特定用途的数据,如擦除了这些数据会影响到某些程序的运行所以我们预留了FLASH芯片的“第0扇区(0-4096地址)”专用于本实验,如非必偠请勿擦除其它地址的内容。如已擦除可在配套资料里找到“刷外部FLASH内容”程序,根据其说明给FLASH重新写入出厂内容

USB线连接开发板“USB TO UART”接口跟电脑,在电脑端打开串口调试助手把编译好的程序下载到开发板。在串口调试助手可看到FLASH测试的调试信息

我要回帖

更多关于 什么是通讯协议 的文章

 

随机推荐