串行闪存控制器(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。