zyp89s52 发表于 2024-6-21 11:12:02

STC-MCU 读写 25NO1GVZE1G



STC-MCU读写25NO1GVZE1G
平时读写W25Q128\64\32\16\8的代码并不适合25NO1GVZE1G,




soma 发表于 2024-6-21 13:40:08

可以看下数据手册和其他nor flash有什么不同

xxxevery 发表于 2024-6-21 21:53:48

W25N01GVZE1G是3V 1G-BIT SERIAL SLC NAND FLASH MEMORY,而W25Q128\64\32\16\8是3V SERIAL FLASH MEMORY,差别大了去了,好好去看pdf吧

zyp89s52 发表于 2024-6-29 11:48:46


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;
}

zwcled 发表于 2024-10-21 23:28:19

你好兄弟,我在学习这个FLASH,能把你的工程文件贴上来吗?

晓飛飛 发表于 2024-10-22 00:15:18

理论上这个FLASH芯片需要做坏块管理,按块擦除时根据状态返回值来判断坏块,并做块地址记录。
页: [1]
查看完整版本: STC-MCU 读写 25NO1GVZE1G