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;
- }
复制代码
|