W25Q64
:一共是
8M
字节
=8*1024*1024=8388608(Byte)
,分为
128
块
(64K)
,每一块有分为
16
个扇 区
(4K)
,所以扇区的个数是:
128*16=2048(
个
)
,那么上面函数的参数
Dst_Addr
的范围就是
0-2047
,
假如要擦除第1000个的扇区,那么这个扇区的字节起始就是1000*4096=4096000,因此把*4096000
先发送最高8位,次高8位,再到最低8位,然后W25Q64就从4096000开始往下擦除4K大小的数据空间,计算地址的时候是使用字节来计算的。
Master---->主机 | Slave--->从机;
SPI,高速,全双工,同步通信总线;
SPI接口一般使用4条线
:
[主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。MISO 主机数据输入,从机数据输出。MOSI 主机数据输出,从机数据输入。SCLK时钟信号,由主机产生。CS从机片选信号,由主机控制。
寄存器通过MOSI信号线将字节传送给从机,从机将自己的移位寄存器
中的内容通过MISO信号线返回给主机。]
SPI 主机和从机,两者通过SPI协议通讯。
设置SPI的模式 ,是从机的模式,决定了主机的模式。从机的SPI 的模式分为:
1.固定的,由SPI从机的硬件决定。
(SPI从机模式,相关的datasheet中会有描述;SPI从机在空闲时间,是高电平还是低电平,即决定了 CPOL是0还是1;)
2.可配置的,有软件自己决定
指令集
#define W25X_WriteEnable 0x06 //Write Enable
#define W25X_WriteEnableVSR 0x50 //Write Enable for Volatile Status Register
#define W25X_WriteDisable 0x04 //Write Disable
#define W25X_ReadStatusReg1 0x05 //读状态寄存器1:S7~S0
#define W25X_ReadStatusReg2 0x35 //读状态寄存器2:S15~S8
#define W25X_WriteStatusReg 0x01 //写读状态寄存器:BYTE1:S7~S0 BYTE2:S15~S8
#define W25X_PageProgram 0x02 //单页编程:BYTE1:A23~A16|2:A15~A8|3:A7~A0|4:D7~D0 #define W25X_SectorErase 0x20 //扇区擦除:4K BYTE1:A23~A16|2:A15~A8|3:A7~A0 #define W25X_BlockErase32K 0x52 //块擦除:32K BYTE1:A23~A16|2:A15~A8|3:A7~A0
#define W25X_BlockErase64K 0xD8 //块擦除:64K BYTE1:A23~A16|2:A15~A8|3:A7~A0
#define W25X_ChipErase 0xC7 //芯片擦除
#define W25X_EraseSuspend 0x75 //暂停擦除
#define W25X_EraseResume 0x7A //恢复擦除
#define W25X_PowerDown 0xB9 //掉电
#define W25X_ContinuousReadMode 0xFF //连续读模式
#define W25X_ReadData 0x03 //读数据:BYTE1:A23~A16|2:A15~A8|3:A7~A0|4:D7~D0 #define W25X_FastReadData 0x0B //快速读取BYTE1:A23~A16|2:A15~A8|3:A7~A0|4:dummy|5:D7~D0 #define W25X_FastReadDual 0x3B //快速双读取BYTE1:A23~A16|2:A15~A8|3:A7~A0|4:dummy|5:D7~D0