平面设计软件大全免费,福州百度快速优化,安陆市城乡建设局网站,手机网站图片轮播项目中处于成本考虑#xff0c;要把Nor Flash换成低成本的Nand Flash。
这里总结下芯片应用。 总体概述#xff1a;
1#xff09;W25N01#xff08;NandFlash#xff09;和W25Q#xff08;Nor Flash#xff09;的操作大不一样。
NandFlash擦除以块#xff08;128KB要把Nor Flash换成低成本的Nand Flash。
这里总结下芯片应用。 总体概述
1W25N01NandFlash和W25QNor Flash的操作大不一样。
NandFlash擦除以块128KB为单位读写以页2KB为单位适合存储大量数据且明确会产生坏块需要进行坏块管理。 -- 而Nor Flash擦除单元大小最小为4KB读写最小单位可以是1字节更方便处理数据。
2W25N01有内部2KB缓冲区机制数据要先写缓冲区再从缓冲区导入物理地址读取与之相反。
3基本指令的实现都一个鸟样。按照指令表的内容和时序收发数据即可。 目录
1. 芯片特性
2. 针脚定义
3. 芯片架构
4. 芯片寄存器
5. 芯片指令表
5.1 读取ID
5.2 读写寄存器
5.3 复位写使能写失能
5.4 页读取
5.5 页写入
5.6 块擦除
6. 芯片时间参数 1. 芯片特性
见下图这里简单说下主要特性
1W25N01为1Gbit大小即128M字节
2104MHz的标准时钟速度
350MB/S的传输速率
4擦除的最小单位是块128KB大小
5读写的最小单位是页2KB大小。即1G Bit分为 1024个块每个块64页。 2. 针脚定义
1注意标准SPI和Quad SPI
我们把标准的SPI接口CS/CLK/MOSI/MISO 称为2线式接口即数据线只有MOSI和MISO此外还有Quad SPI接口它将WP和HOLD复用为数据传输线称为4线式接口数据收发从1bit变成2bit 3. 芯片架构
这是第一个必须要理解的图很重要不要跳过请先看懂它。
简述下图框图
1Data Buffer是芯片内部的缓冲区总共2112字节分为2048字节 64字节。 a其中64字节是备用区域一是用于标记坏块二是用于保存ECC码纠错码 b2048字节的数据缓冲区。 在读取时要先从物理地址读到缓冲区然后再读取缓冲区。 在写入时要先将数据写入缓冲区再将缓冲区数据写入物理地址。 cColumn Address CA[11:0]即缓冲区的地址。在读写缓冲区的参数 CA 即表示该值。 2页地址 Page Address (PA) [15:0]即页面地址其高10bit表示块号索引10bit的最大值为1023低6bit表示页索引6bit的最大值为63。 标黄的两个参数很重要后面的寄存器表都会用到这两个参数。 4. 芯片寄存器
寄存器如下3张图
1SR1为保护寄存器地址为0xAx0xA0一般写0x00关闭保护即可
如果需要保护特定块需要按照章节 7.4 W25N01GV Status Register Memory Protection 配置保护寄存器。 2SR2为配置寄存器地址为0xBx0xB0一般写0x18即可即默认使能ECC校验和BUF1模式 3SR3为状态寄存器只读的 a其中BUSY位用于判断写、擦除等指令是否结束 bFAIL位用于判断写失败和擦除失败 cECC用于判断读取数据是否正确 5. 芯片指令表
这是第二个必须要理解的图很重要不要跳过请先看懂它。
下面简述下指令表该怎么看
1第1列为命令类型
2第2列OpCode表示操作码是发送的第一个字节数据CMD
3后序列Byte2/3/4……表示后续的发送字节
4实现单个命令功能时只需要按照该指令表发送字节数据。。
上层的读写功能需要多个命令组合实现…… 下面再简述下关键指令
5.1 读取ID
就以这个命令简述下每个命令的时序该怎样看
1DI一行表示要发送的数据DO一行表示要接收的数据。
2只要数据是按照时序图发的就没问题。
3每一个指令的开始都要以CS拉低开始最后1字节发送结束之后马上拉高CS。
对于这个 Read JEDEC ID 命令可知
先发送0x9F再发送Dummy空字节、数据任意然后再发送3个字节任意字节数据对端依次响应3个字节数据。
对于W25N01回复固定依次是0xEF0xAA0x21。 5.2 读写寄存器
读寄存器发送0x0F或0x05再发送寄存器地址然后读取1字节数据 - 即为寄存器值
写寄存器发送0x1F或0x01再发送寄存器地址然后发送1字节数据 - 即为寄存器设定值 5.3 复位写使能写失能
CS拉低发1字节CS再拉高结束。
复位是0xFF控制芯片复位。
写使能0x06在写缓冲区、块擦除之前必须要先写使能。使能之后状态寄存器会置位bit1。
写失能0x04恢复写保护。
5.4 页读取
基本操作概述
1先发送0x13指令将指定物理地址的数据读到内部缓冲区 先发送0x13再发送0x00发送页地址PA的高8位最后发送页地址PA的低8位。 发完结束等待完成即可。
2再发送0x03指令将缓冲区的数据读到用户的Buff中 先发送0x03发送列地址CA的高8位然后发送列地址CA的低8位最后发送0x00。 发完结束等待完成即可。
3读取完毕之后检查状态寄存器的ECC校验位判断是否读取正确。 下面是我的可用代码
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)(PA8));SpiReadWriteByte((uint8_t)(PA0xFF));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 页写入
1Buff写缓冲区 必须先发送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)(PA8));SpiReadWriteByte((uint8_t)(PA0xFF));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;
}
5.6 块擦除
必须先发送0x06写使能命令
然后发送0xD8发送0x00然后发送页地址PA的高8位最后发送页地址PA的低8位结束
等待擦除完成
uint8_t W25N01_BlockErase(uint16_t blocks, uint16_t pages)
{uint16_t PA (blocks 6) (pages 0x3F);W25N01_WriteEnable();HAL_Delay(1);SPI_FLASH_CS_LOW();SpiReadWriteByte(0xD8);SpiReadWriteByte(0x00);SpiReadWriteByte((uint8_t)(PA8));SpiReadWriteByte((uint8_t)(PA0xFF));SPI_FLASH_CS_HIGH();W25N01_WaitBusy();if( (W25N01_ReadReg(FLASH_STATUS_REG3_ADDR) FLASH_SR_ERASE_FAIL) FLASH_SR_ERASE_FAIL)return W25N01XX_FAIL;return W25N01XX_OK;
}
6. 芯片时间参数
其中
tRD表示读操作的时间最大60us最快7us
tPP表示写操作的时间最大700us
tBE表示擦除操作的时间最大10ms