1. 存储器分类
存储器按其存储介质特性主要分为“易失性存储器”和“非易失性存储器”两大类。
“易失/非易失”是指存储器断电后, 它存储的数据内容是否会丢失的特性。
在计算机中易失性存储器最典型的代表是内存,非易失性存储器的代表则是硬盘。
RAM
Random access memory
ROM
read only memory
EEROM
Electrically Erasable Programmable Read-Only Memory
- 断电保护
- 可以随意访问和修改任何一个字节
- 掉电不丢失,保存100年,擦写100w次
Flash
分为 NOR FLASH和NAND FLASH
- 擦除以块为单位,简化电路,降低成本
- NOR FLASH,可以实现RAM一样的随机寻址功能,读取任意一个字节,擦除任需按块擦除
- 整体擦除,按页读取
- NOR FLASH按字节寻址,
2. W25Q芯片
2.1. 芯片简介
64/128代表的是存储大小
原理图:
时序图:
支持模式1和模式3
模式1:0 0 极性0,相位0
模式3:0 1 极性0,相位1
3. 读和写操作
3.1. 读取ID操作
根据代码:
得知:
高八位保存
低八位保存
3.2. 写入
3.2.1.1. 写入逻辑代码:
3.2.1.1.1. 扇区擦除操作
时序图:
传24位地址,是因为一部分找扇区地址,一部分找块存储地址
根据时序图来写代码,如下
擦除操作代码
除以4096是因为,一个扇区4个字节,一个字节1024k,是为了获取扇区的编号
擦除方法内部逻辑
①把地址右移16位,读取高八位的数据。 ——>读取00000000 00000000 00000000
②把地址右移八位,强转成uint8_t类型,相当于读取地址中间的八位地址 ——>读取00000000 00000000 00000000
③传输原地址,强转成uint8_t类型,读取最后面的八位地址 ——>读取00000000 00000000 00000000
擦除操作:
W25Q64_erase_sector(addr/4096);//擦除扇区数据(除以4096获取扇区编号)
具体实现:
void W25Q64_erase_sector(uint32_t addr)
{
addr *= 4096;
W25Q64_write_enable(); //写使能
W25Q64_wait_busy(); //判断忙
gpio_bit_write(GPIOF, GPIO_PIN_6, RESET);
spi_read_write_byte(0x20);
spi_read_write_byte((uint8_t)((addr)>>16));
spi_read_write_byte((uint8_t)((addr)>>8));
spi_read_write_byte((uint8_t)addr);
gpio_bit_write(GPIOF, GPIO_PIN_6, SET);
//等待擦除完成
W25Q64_wait_busy();
}