操作指令
4.1 指令参数 (Instruction Parameter)
| 指令 Instruction | 描述 Description | 操作码 Code | 地址字节 Address Bytes | 空周期 Dummy Bytes | 数据字节 Data Bytes |
|---|---|---|---|---|---|
| READ | Read Data Bytes | 03H (0000 0011) | 3 | — | 1 to ∞ |
| FAST_READ | Read Data Bytes at Higher Speed | 0BH (0000 1011) | 3 | 1 | 1 to ∞ |
所有对字库芯片 SPI 接口的操作均为上述两种指令的组合:READ(一般读取)和 FAST_READ(快速读取点阵数据)。
4.2 READ(一般读取)— 03H
READ 指令用于从芯片中读取数据,时序如下:
SPI 读时序
- 首先把片选信号(CS#)变为低,紧跟着 1 字节命令字(03H)和 3 字节地址通过串行数据输入引脚(SI)移位输入,每一位在串行时钟(SCLK)上升沿被锁存
- 然后该地址的字节数据通过串行数据输出引脚(SO)移位输出,每一位在 SCLK 下降沿被移出
- 读取字节数据后,把片选信号(CS#)变为高,结束本次操作
- 如果 CS# 继续保持为低,则下一个地址的字节数据继续通过 SO 移位输出
void spi_read_data(uint32_t addr, uint8_t *buf, uint32_t len) {
cs_low();
spi_send_byte(0x03); // READ command
spi_send_byte((addr >> 16) & 0xFF);
spi_send_byte((addr >> 8) & 0xFF);
spi_send_byte(addr & 0xFF);
for (uint32_t i = 0; i < len; i++) {
buf[i] = spi_recv_byte();
}
cs_high();
}
4.3 FAST_READ(快速读取)— 0BH
FAST_READ 在地址之后插入 1 字节空周期(Dummy Byte),支持更高时钟频率读取:
SPI 快速读时序
- 首先把 CS# 变为低,紧跟着 1 字节命令字(0BH)和 3 字节地址以及 1 字节 Dummy Byte 通过 SI 移位输入,每一位在 SCLK 上升沿被锁存
- 然后该地址的字节数据通过 SO 移位输出,每一位在 SCLK 下降沿被移出
- 如果 CS# 继续保持为低,则下一个地址继续输出
例:读取一个 15×16 点阵汉字需要 32 字节,连续 32 字节读取后结束一个汉字的点阵数据读取操作。
void spi_fast_read_data(uint32_t addr, uint8_t *buf, uint32_t len) {
cs_low();
spi_send_byte(0x0B); // FAST_READ command
spi_send_byte((addr >> 16) & 0xFF);
spi_send_byte((addr >> 8) & 0xFF);
spi_send_byte(addr & 0xFF);
spi_send_byte(0xFF); // Dummy byte
for (uint32_t i = 0; i < len; i++) {
buf[i] = spi_recv_byte();
}
cs_high();
}
4.4 写使能 — 06H
在执行页写入或扇区擦除之前,必须先发送写使能指令:
SPI 写使能时序
时序:CS# 变低 → 发送 06H → CS# 变高
void spi_write_enable(void) {
cs_low();
spi_send_byte(0x06); // WREN
cs_high();
}
4.5 写禁止 — 04H
写禁止指令用于复位写使能锁存器:
SPI 写禁止时序
时序:CS# 变低 → 发送 04H → CS# 变高
4.6 页写入 — 02H
页写入指令可一次写入最多 256 字节数据。若写入数据超过当前页边界,地址将回绕到该页起始位置。
SPI 页写入时序
时序:CS# 变低 → 发送 02H → 发送 3 字节地址 → 发送数据 → CS# 变高
注意:CS# 拉高后需进行忙状态判断,等待芯片内部写入完成后才可进行下一步操作。忙状态判断请参考该型号相应的库文件,如无库文件请向原厂索要。
void spi_page_program(uint32_t addr, uint8_t *data, uint16_t len) {
spi_write_enable();
cs_low();
spi_send_byte(0x02); // Page Program
spi_send_byte((addr >> 16) & 0xFF);
spi_send_byte((addr >> 8) & 0xFF);
spi_send_byte(addr & 0xFF);
for (uint16_t i = 0; i < len; i++) {
spi_send_byte(data[i]);
}
cs_high();
// 等待写入完成,参考芯片库文件中的忙状态判断
}
4.7 扇区擦除 — 20H
扇区擦除以 4KB 为单位,擦除后该扇区所有字节变为 FFH:
SPI 扇区擦除时序
时序:CS# 变低 → 发送 20H → 发送 3 字节地址 → CS# 变高
注意:CS# 拉高后需进行忙状态判断,等待芯片内部擦除完成后才可进行下一步操作。
void spi_sector_erase(uint32_t addr) {
spi_write_enable();
cs_low();
spi_send_byte(0x20); // Sector Erase (4KB)
spi_send_byte((addr >> 16) & 0xFF);
spi_send_byte((addr >> 8) & 0xFF);
spi_send_byte(addr & 0xFF);
cs_high();
// 等待擦除完成
}
4.8 深度睡眠模式 — B9H
发送 B9H 指令后芯片进入深度睡眠模式,所有指令被忽略,功耗降至最低:
SPI 深度睡眠时序
时序:CS# 变低 → 发送 B9H → CS# 变高 → 保持高电平 ≥ tDP(25μs)
4.9 唤醒深度睡眠模式 — ABH
发送 ABH 指令后芯片恢复正常运行:
SPI 唤醒时序
时序:CS# 变低 → 发送 ABH → CS# 变高 → 保持高电平 ≥ tRES1(25μs)

