跳转至

串行闪存控制器(SPIFLASH)


1、简介

CI14LP芯片通过DTRC(Dedicated SPI Flash Controller,专用串行闪存控制器)控制器访问外挂SPI FLASH。代码与数据存储在外部SPI FLASH中,CPU通过XIP(Execute In Place,就地执行)方式直接从FLASH取指运行。

DTRC控制器特性:

  • 支持Standard SPI(单线)、Dual SPI(双线)、Quad SPI(四线)以及DTR(Double Transfer Rate,双倍速率)读模式
  • 支持FLASH时钟模式配置(同频模式/2分频模式)
  • 支持XIP映射执行模式
  • 支持FLASH唯一ID、JEDEC ID读取,安全寄存器读写,状态寄存器读写,整体/分区擦写保护、复位、低功耗(powerdown)等完整命令集

2、API

函数名 描述
flash_init DTRC控制器初始化(时钟模式配置)
flash_xipconfig XIP模式配置(使能FLASH映射执行)
flash_read 读取FLASH数据(buf、地址、长度)
flash_dtr_read DTR(双倍速率)方式读取FLASH数据
flash_read_page 按页读取(可选DTR标志)
flash_write 向FLASH写入数据(页编程)
flash_erase 擦除FLASH指定区域(自动选择4K/32K/64K擦除命令)
flash_quad_mode 使能FLASH四线(Quad)模式
flash_protect FLASH读写保护使能/关闭
flash_reset 复位FLASH器件
flash_powerdown FLASH进入掉电(低功耗)模式
flash_release_powerdown 唤醒(释放掉电)FLASH器件
flash_read_unique_id 读取FLASH唯一ID
flash_read_jedec_id 读取FLASH JEDEC ID
flash_read_status_register 读取FLASH状态寄存器½/3
flash_erase_security_reg 擦除安全寄存器(½/3)
flash_write_security_reg 写安全寄存器
flash_read_security_reg 读安全寄存器

3、FLASH命令定义

驱动内置的标准FLASH命令(flash_cmd_code_t):

命令 值 说明
FLASH_CMD_CODE_WRITE_ENABLE 0x06 写使能
FLASH_CMD_CODE_READSTATUSREG½/3 0x05/0x35/0x15 读状态寄存器½/3
FLASH_CMD_CODE_SECTORERASE4K 0x20 4K扇区擦除
FLASH_CMD_CODE_BLOCKERASE32K 0x52 32K块擦除
FLASH_CMD_CODE_BLOCKERASE64K 0xd8 64K块擦除
FLASH_CMD_CODE_CHIPERASE 0xc7 整片擦除
FLASH_CMD_CODE_PAGEPROGRAM 0x02 页编程
FLASH_CMD_CODE_QUADINPUTPAGEPROGRAM 0x32 四线输入页编程
FLASH_CMD_CODE_READDATA 0x03 读数据
FLASH_CMD_CODE_FASTREAD 0x0b 快速读
FLASH_CMD_CODE_FASTREADDUALOUTPUT 0x3b 双线输出快速读
FLASH_CMD_CODE_FASTREADQUADOUTPUT 0x6b 四线输出快速读
FLASH_CMD_CODE_FASTREADQUADIO 0xeb 四线IO快速读
FLASH_CMD_CODE_FASTREADDTR 0x0d DTR快速读
FLASH_CMD_CODE_FASTREADDTRQUADOUTPUT 0xed 四线输出DTR快速读
FLASH_CMD_CODE_POWERDOWN 0xb9 掉电
FLASH_CMD_CODE_RELEASEPOWERDOWN 0xab 释放掉电
FLASH_CMD_CODE_ENABLERESET / RESET 0x66/0x99 使能复位/复位器件
FLASH_CMD_CODE_READ_UNIQUE_ID 0x4b 读唯一ID
FLASH_CMD_CODE_ERASE/WRITE/READ_SECURITY_REG 0x44/0x42/0x48 安全寄存器擦/写/读
FLASH_CMD_CODE_ENABLE_QPI / DISABLE_QPI 0x38/0xFF QPI模式使能/退出

4、关键类型

类型 说明
dtrc_base_t 控制器选择:DTRC(HAL_DTRC_BASE)
flash_clk_mode_t FLASH时钟模式:FLASH_CLK_MODE_SAME_AS_IPCORE(同频,flash频率和主频一样)、FLASH_CLK_MODE_DIV_2(2分频,默认)
flash_security_reg_t 安全寄存器编号:FLASH_SECURITY_REG½/3
flash_cmd_code_t 标准FLASH命令码(见上表)

5、示例

1) 以下代码在系统初始化中完成FLASH初始化与XIP配置(SDK启动流程默认完成):

#include "ci14lp_flash.h"

void flash_init_demo(void)
{
    //初始化DTRC控制器,FLASH时钟采用默认2分频模式
    flash_init(DTRC, FLASH_CLK_MODE_DIV_2);

    //配置XIP模式,使代码可以直接在FLASH中运行
    flash_xipconfig(DTRC);
}

2) 以下代码读取FLASH JEDEC ID并读写用户数据区:

#include "ci14lp_flash.h"

uint8_t jedec_id[3] = {0};
uint8_t write_buf[16] = {0};
uint8_t read_buf[16] = {0};

void flash_rw_demo(void)
{
    //读取JEDEC ID(厂商ID、存储类型、容量)
    flash_read_jedec_id(DTRC, jedec_id);
    mprintf("flash jedec id: 0x%x 0x%x 0x%x\n",
            jedec_id[0], jedec_id[1], jedec_id[2]);

    //写入数据前先擦除对应的4K扇区
    flash_erase(DTRC, 0x7F0000, 4096);

    //写入16字节数据
    flash_write(DTRC, 0x7F0000, (uint32_t)write_buf, 16);

    //读回数据校验
    flash_read(DTRC, read_buf, 0x7F0000, 16);
}

3) 以下代码使FLASH进入低功耗状态(适合低功耗应用场景):

#include "ci14lp_flash.h"

void flash_power_demo(void)
{
    flash_powerdown(DTRC);          //进入掉电模式
    //...执行其他低功耗操作...
    flash_release_powerdown(DTRC);  //唤醒FLASH
}

6、其它

  • FLASH写入前必须先擦除,擦除的最小单位为4K扇区;flash_erase 会根据擦除长度自动选择4K/32K/64K擦除命令。
  • 页编程单次最多写入一页(一般256字节),跨页写入需分多次调用 flash_write。
  • flash_protect 打开后FLASH处于写保护状态,可防止误擦写固件区;需要写入时先关闭保护。
  • XIP模式下读代码区域无需额外配置,直接通过CPU指令访问即可;flash_erase/write 操作期间XIP取指会暂停(驱动内部通过回调/RAM执行的方式规避),长擦写期间注意实时性影响。
  • FLASH分区分配参见存储API-FLASH分区表;基于FLASH的KV数据存取参见存储API-NVDATA管理。

7、API 参考

本模块接口声明于 driver\ci14lp_chip_driver\inc\ci14lp_flash.h,实现位于 driver\ci14lp_chip_driver\src\ci14lp_flash.c。