前言
上一篇文章讲了如何给Flash发送SPI的指令,这一篇文章作为状态寄存器状态寄存器的读取与状态寄存器的写入的介绍。
状态寄存器读取
(05h/35h/15h)
状态寄存器在之前的文章有详细的介绍
这是三个状态寄存器(05h/35h/15h)分别对应status Register-1、2、3,
拿我们最常使用的busy为例,首先通过cs选择对应的Flash,然后写入0x05指令,当Flash接收到指令后会对该指令进行响应,然后MCU通过MISO进行数据读取。当你发送一次0x05指令后可以循环读取当前状态寄存器的值,只要CLK持续发送,Flash就会持续发送该状态寄存器的数据。
注意:The Read Status Register instruction may be used at any time,任何时候都可以去读状态寄存器的值。
void SPI_Flash_Wait_Busy(void)
{
while((SPI_Flash_ReadSR()&0x01)==0x01); // 等待BUSY位清空
}
u8 SPI_Flash_ReadSR(void)
{
u8 byte=0;
SPI_FLASH_CS_LOW; //使能器件
SPI_WriteByte(0x05); //发送读取状态寄存器命令
byte = SPI_ReadByte(); //读取一个字节
SPI_FLASH_CS_HIGH; //取消片选
return byte;
}
uint8_t SPI_ReadByte(void)
{
uint8_t cnt;
uint8_t RxData = 0;
for(cnt = 0; cnt<8; cnt++)
{
SPI_FLASH_SCK_LOW;
RxData <<= 1;
if(SPI_FLASH_MISO_READ) //读取数据
{
RxData |= 0x01;
}
SPI_FLASH_SCK_HIGH;
}
return RxData;
}
状态寄存器写入
Write Status Register (WRSR) (01h/31h/11h)
只有状态寄存器1 中的 SRP、SEC、TB、BP[2:0];状态寄存器2 中的 CMP、LB、QE、SRL可以写。所有其他状态寄存器位位置都是只读的,不会受到写状态寄存器指令的影响。LB 是非易失性 OTP 位,一旦设置为 1,就无法将其清除为 0。
要写入非易失性状态寄存器位,必须先执行标准的 "写使能"(06h)指令,设备才能接受 "写状态寄存器 "指令。
设备才能接受写状态寄存器指令(状态寄存器位 WEL 必须等于 1)。
不论是写数据,还是写寄存器都要先发个06 开启写使能。
在断电或执行软件/硬件复位时,易失性状态寄存器位值也将丢失。50h为易失性状态寄存器。
好处是这样就能更灵活地快速更改系统配置和内存保护方案,这样可以更灵活地快速更改系统配置和内存保护方案,而无需等待典型的非易失位写入周期或影响状态寄存器非易失位的耐用性。
void SPI_FLASH_Write_SR(u8 sr)
{
SPI_FLASH_CS_LOW; //使能器件
SPI_WriteByte(WriteStatusReg); //0x01 or 0x31 or 0x11
SPI_WriteByte(sr);
SPI_FLASH_CS_HIGH; //取消片选
}
SR内填入想要写入的内容
总结
本章是对状态寄存器读取和写入的记录,记住只有状态寄存器1 中的 SRP、SEC、TB、BP[2:0];状态寄存器2 中的 CMP、LB、QE、SRL可以写。然后写入前需要开启写使能