23.2
控制FLASH的指令
对主机端(RA6M5)来说,只是它遵守最基本的QSPI通讯协议发送出的数据,但在设备端(FLASH 芯片)把这些数据解释成不同的意义,所以才成为指令。
查看FLASH芯片的数据手册《AT25SF321B》,可了解各种它定义的各种指令的功能及指令格式,见表23‑2。
表23‑2FLASH常用芯片指令表
(摘自规格书《AT25SF321B》)

该表中的第一列为指令名,第二列为指令编码,第三至第N列的具体内容根据指令的不同而有不同的含义。其中带括号的字节参数,方向为FLASH向主机传输,即命令响应,不带括号的则为主机向FLASH传输。表中“A0~A23”指FLASH芯片内部存储器组织的地址;“M0~M7”为厂商号(MANUFACTURER ID);“ID0-ID15”为FLASH芯片的ID;“dummy”指该处可为任意数据;“D0~D7”为FLASH内部存储矩阵的内容。
在FLSAH芯片内部,存储有固定的厂商编号(M7-M0)和不同类型FLASH芯片独有的编号(ID15-
ID0),见表23‑3。
表23‑3 FLASH数据手册的设备ID说明
通过指令表中的读ID指令“JEDEC ID”可以获取这两个编号,该指令编码为“9Fh”,其中“9Fh”是指16进制数“9F”(相当于C 语言中的0x9F)。紧跟指令编码的三个字节分别为FLASH芯片输出的“(M7-M0)”、“(ID15-ID8)”及“(ID7-ID0)”。
此处我们以该指令为例,配合其指令时序图进行讲解,见下图。

主机首先通过MOSI线向FLASH芯片发送第一个字节数据为“9Fh”,当FLASH芯片收到该数据后,它会解读成主机向它发送了“JEDEC指令”,然后它就作出该命令的响应:通过MISO线把它的厂商ID(M7-M0)及芯片类型(ID15-0)发送给主机,主机接收到指令响应后可进行校验。常见的应用是主机端通过读取设备ID来测试硬件是否连接正常,或用于识别设备。
对于FLASH芯片的其它指令,都是类似的,只是有的指令包含多个字节,或者响应包含更多的
数据。
实际上,编写设备驱动都是有一定的规律可循的。首先我们要确定设备使用的是什么通讯协议。
如上一章的EEPROM使用的是I2C,本章的FLASH 使用的是SPI。那么我们就先根据它的通讯协议,选择好RA6M5的硬件模块,并进行相应的I2C或SPI模块初始化。
接着,我们要了解目标设备的相关指令,因为不同的设备,都会有相应的不同的指令。如EEPROM中会把第一个数据解释为内部存储矩阵的地址(实质就是指令)。而FLASH则定义了更多的指令,有写指令、读指令、读ID指令等等。最后,我们根据这些指令的格式要求,使用通讯协议向设备发送指令,达到控制设备的目标。
为了方便使用,我们把FLASH芯片的常用指令编码使用宏来封装起来,后面需要发送指令编码
的时候我们直接使用这些宏即可。
列表1:FLASH指令编码表
左右滑动查看完整内容
/*FLASH 常用命令*/ #defineWriteEnable 0x06 #defineWriteDisable 0x04 #defineReadStatusReg 0x05 #defineWriteStatusReg 0x01 #defineReadData 0x03 #defineFastReadData 0x0B #defineFastReadDual 0x3B #definePageProgram 0x02 #defineBlockErase 0xD8 #defineSectorErase 0x20 #defineChipErase 0xC7 #definePowerDown 0xB9 #defineReleasePowerDown 0xAB #defineDeviceID 0xAB #defineManufactDeviceID 0x90 #defineJedecDeviceID 0x9F /* 其它*/ #definesFLASH_ID 0x1F8701 #defineDummy_Byte 0xFF