1. SPI
1.1. 介绍
- SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
- 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)
- 同步,全双工
- 支持总线挂载多设备(一主多从)
1.2. 硬件电路
- 所有SPI设备的SCK、MOSI、MISO分别连在一起
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚
- 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入
1.3. 移位示意图
1.4. 基本时序单元
- 起始条件:SS从高电平切换到低电平
- 终止条件:SS从低电平切换到高电平
- 交换一个字节(模式0)
- CPOL = 0:空闲状态时,SCK为低电平
- CPHA = 0:SCK的第一个边沿移入数据,第二个边沿移出数据
- 交换一个字节(模式1)
- CPOL = 0:空闲状态时,SCK为低电平
- CPHA = 1:SCK的第一个边沿移出数据,第二个边沿移入数据
- 交换一个字节(模式2)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
- 交换一个字节(模式3)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
2. Flash
2.1. 介绍
- W25QXX系列是一种低成本、小型化、使用简单的非易失性存储器,常应用与数据存储、字库存储、固件程序存储等场景。
- 存储介质:Nor Flash(闪存)
- 时钟频率:80MHz/160MHz(Dual SPI)/320MHz(Quad SPI)
- 存储容量:(24位地址)
2.2. SPI时序
- 指定地址读
- 向SS指定的设备,发送指令(0x03),随后在指定地址(Address[23,0]下,读取从机数据(Data))
2.3. 硬件电路
2.4. Flash操作注意事项
2.4.1. 写入操作时
- 写入操作前,必须先进行写使能
- 每个数据为只能由1改写为0,不能由0改写为1
- 写入数据前必须先擦除,擦除后,所有的数据位变为1
- 擦除必须按照最小擦除单元进行
- 连续写入多个字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入
- 写入操作结束后,芯片进入忙状态,不响应新的读写操作
2.4.2. 读取操作时
- 直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取。
2.5. 寄存器
2.5.1. 状态寄存器(BUSY)
当设备进行页编程、扇区擦除、快擦除、芯片擦除或者写状态寄存器指令时,该位被设置为1,在此期间,设备将忽略除读设备寄存器和擦除挂起指令意外的进一步指令。当程序、擦除或写状态寄存器指令完成时,该位被清除为0,表示设备已就绪。
2.5.2. 写使能锁存器(WEL)
2.6. W25Q64
容量:64MBit 8MByte
块(Block):64K
扇区(Sector):4K
页(Page):256Byte
2.7. 如何向Flash写入数据
2.7.1. Flash数据写入过程
- 首先在写入之前,需先将Flash进行擦除,最小擦除单元是扇区(每次最小要擦除4K字节)
- 数据写入的最小单元是页,数据写入的过程叫做编程(页编程)
- 在擦除和写入之前,需要先将Flash解锁,解锁的过程叫做写使能
写使能-->扇区擦除-->延时100ms(等待擦除完成)-->写使能-->页编程-->延时10ms(等待编程完成)