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