STC-MCU 读写 25NO1GVZE1G
STC-MCU读写25NO1GVZE1G
平时读写W25Q128\64\32\16\8的代码并不适合25NO1GVZE1G,
可以看下数据手册和其他nor flash有什么不同 W25N01GVZE1G是3V 1G-BIT SERIAL SLC NAND FLASH MEMORY,而W25Q128\64\32\16\8是3V SERIAL FLASH MEMORY,差别大了去了,好好去看pdf吧
1、25N01读ID
2、25n01内存结构、寄存器
3、25n01 时序、指令表
4、读写代码逻辑参考
/* 5.4 页读取
基本操作概述:
1)先发送0x13指令,将指定物理地址的数据读到内部缓冲区;
先发送0x13,再发送0x00,发送页地址PA的高8位,最后发送页地址PA的低8位。
发完结束,等待完成即可。
2)再发送0x03指令,将缓冲区的数据读到用户的Buff中;
先发送0x03,发送列地址CA的高8位,然后发送列地址CA的低8位,最后发送0x00。
发完结束,等待完成即可。
3)读取完毕之后,检查状态寄存器的ECC校验位,判断是否读取正确。
下面是我的可用代码: */
/* uint16_t blocks, 128KB block addr(1024 blocks)
uint16_t pages, page addr(64 page)
uint8_t *Buff bype address(0-2047 byte) */
uint8_t W25N01_PageRead(uint16_t blocks, uint16_t pages, uint8_t *Buff)
{
uint16_t PA = (blocks << 6) + (pages & 0x3F);
SPI_FLASH_CS_LOW();
SpiReadWriteByte(0x13);
SpiReadWriteByte(0x00);
SpiReadWriteByte((uint8_t)(PA>>8));
SpiReadWriteByte((uint8_t)(PA&0xFF));
SPI_FLASH_CS_HIGH();
HAL_Delay(1);
SPI_FLASH_CS_LOW();
SpiReadWriteByte(0x03);
SpiReadWriteByte(0x00);
SpiReadWriteByte(0x00);
SpiReadWriteByte(0x00);
SpiFlashReceive(Buff, 2048);
SPI_FLASH_CS_HIGH();
if( (W25N01_ReadReg(FLASH_STATUS_REG3_ADDR) & 0x30) >= 0x20)
return W25N01XX_FAIL;
return W25N01XX_OK;
}
/* 5.5 页写入
1)Buff写缓冲区
必须先发送0x06写使能命令
再发送0x02命令,发送2个 0x00,然后传输2048字节数据
2)缓冲区写物理地址
先发送0x10,发送0x00,
然后发送页地址PA的高8位,最后发送页地址PA的低8位,结束,
等待传输完成
下面是我的可用代码: */
uint8_t W25N01_PageWrite(uint16_t blocks, uint16_t pages, uint8_t *Buff)
{
uint16_t PA = (blocks << 6) + (pages & 0x3F);
W25N01_WriteEnable();
HAL_Delay(1);
SPI_FLASH_CS_LOW();
SpiReadWriteByte(0x02);
SpiReadWriteByte(0x00);
SpiReadWriteByte(0x00);
SpiFlashTrans(Buff, 2048);
SPI_FLASH_CS_HIGH();
HAL_Delay(1);
SPI_FLASH_CS_LOW();
SpiReadWriteByte(0x10);
SpiReadWriteByte(0x00);
SpiReadWriteByte((uint8_t)(PA>>8));
SpiReadWriteByte((uint8_t)(PA&0xFF));
SPI_FLASH_CS_HIGH();
W25N01_WaitBusy();
if( (W25N01_ReadReg(FLASH_STATUS_REG3_ADDR) & FLASH_SR_WRITE_FAIL)
== FLASH_SR_WRITE_FAIL)
return W25N01XX_FAIL;
return W25N01XX_OK;
}
你好兄弟,我在学习这个FLASH,能把你的工程文件贴上来吗? 理论上这个FLASH芯片需要做坏块管理,按块擦除时根据状态返回值来判断坏块,并做块地址记录。
页:
[1]