高通字库
版本 V1.0I · 更新于 2026-05

操作指令

4.1 指令参数 (Instruction Parameter)

指令 Instruction描述 Description操作码 Code地址字节 Address Bytes空周期 Dummy Bytes数据字节 Data Bytes
READRead Data Bytes03H (0000 0011)31 to ∞
FAST_READRead Data Bytes at Higher Speed0BH (0000 1011)311 to ∞

所有对字库芯片 SPI 接口的操作均为上述两种指令的组合:READ(一般读取)和 FAST_READ(快速读取点阵数据)。

4.2 READ(一般读取)— 03H

READ 指令用于从芯片中读取数据,时序如下:

SPI 读时序SPI 读时序

  • 首先把片选信号(CS#)变为低,紧跟着 1 字节命令字(03H)和 3 字节地址通过串行数据输入引脚(SI)移位输入,每一位在串行时钟(SCLK)上升沿被锁存
  • 然后该地址的字节数据通过串行数据输出引脚(SO)移位输出,每一位在 SCLK 下降沿被移出
  • 读取字节数据后,把片选信号(CS#)变为高,结束本次操作
  • 如果 CS# 继续保持为低,则下一个地址的字节数据继续通过 SO 移位输出
spi_read.c
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 快速读时序SPI 快速读时序

  • 首先把 CS# 变为低,紧跟着 1 字节命令字(0BH)和 3 字节地址以及 1 字节 Dummy Byte 通过 SI 移位输入,每一位在 SCLK 上升沿被锁存
  • 然后该地址的字节数据通过 SO 移位输出,每一位在 SCLK 下降沿被移出
  • 如果 CS# 继续保持为低,则下一个地址继续输出

例:读取一个 15×16 点阵汉字需要 32 字节,连续 32 字节读取后结束一个汉字的点阵数据读取操作。

spi_fast_read.c
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 写使能时序SPI 写使能时序

时序:CS# 变低 → 发送 06H → CS# 变高

spi_write_enable.c
void spi_write_enable(void) {
    cs_low();
    spi_send_byte(0x06);  // WREN
    cs_high();
}

4.5 写禁止 — 04H

写禁止指令用于复位写使能锁存器:

SPI 写禁止时序SPI 写禁止时序

时序:CS# 变低 → 发送 04H → CS# 变高

4.6 页写入 — 02H

页写入指令可一次写入最多 256 字节数据。若写入数据超过当前页边界,地址将回绕到该页起始位置。

SPI 页写入时序SPI 页写入时序

时序:CS# 变低 → 发送 02H → 发送 3 字节地址 → 发送数据 → CS# 变高

注意:CS# 拉高后需进行忙状态判断,等待芯片内部写入完成后才可进行下一步操作。忙状态判断请参考该型号相应的库文件,如无库文件请向原厂索要。

spi_page_program.c
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 扇区擦除时序SPI 扇区擦除时序

时序:CS# 变低 → 发送 20H → 发送 3 字节地址 → CS# 变高

注意:CS# 拉高后需进行忙状态判断,等待芯片内部擦除完成后才可进行下一步操作。

spi_sector_erase.c
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 深度睡眠时序SPI 深度睡眠时序

时序:CS# 变低 → 发送 B9H → CS# 变高 → 保持高电平 ≥ tDP(25μs)

4.9 唤醒深度睡眠模式 — ABH

发送 ABH 指令后芯片恢复正常运行:

SPI 唤醒时序SPI 唤醒时序

时序:CS# 变低 → 发送 ABH → CS# 变高 → 保持高电平 ≥ tRES1(25μs)