eFlash
函数列表
简要说明
eFlash闪存是嵌入式系统中常用的非易失存储器,支持代码片上执行。eFlash在写入之前必须先执行擦除动作,擦除以块为单位。eFlash的写入也叫编程,需要通过特殊的命令来实现。
接口描述
csi_eflash_initialize
eflash_handle_t csi_eflash_initialize(int32_t idx, eflash_event_cb_t cb_event)
功能描述:
- 通过传入设备数初始化对应的eflash实例,返回eflash实例的句柄 。
参数:
idx
: 设备号。cb_event
: eflash实例的事件回调函数。回调函数原型定义见eflash_event_cb_t。回调函数类型eflash_event_cb_t定义如下:
typedef void (*eflash_event_cb_t)(int32_t idx, eflash_event_e event);
其中idx为设备号,event为传给回调函数的事件类型,eflash回调事件枚举类型。
事件类型见 eflash_event_e定义。
返回值:
- NULL: 初始化失败。
- 其它: 实例句柄。
eflash_event_e:
名字 | 定义 | 备注 |
---|---|---|
EFLASH_EVENT_READY | eflash ready事件 | |
EFLASH_EVENT_ERROR | eflash 错误事件 |
csi_eflash_uninitialize
int32_t csi_eflash_uninitialize(eflash_handle_t handle)
功能描述:
- eflash实例反初始化。该接口会停止eflash实例正在进行的工作(如果有),并且释放相关的软硬件资源。
参数:
handle
: 实例句柄。
返回值:
- 错误码。
csi_eflash_get_capabilities
eflash_capabilities_t csi_eflash_get_capabilities(int32_t idx)
功能描述:
- 获取eflash实例支持的能力。
参数:
idx
: 设备号。
返回值:
- 描述eflash能力的结构体,eflash的能力定义见 eflash_capabilities_t。
eflash_capabilities_t:
名字 | 定义 | 备注 |
---|---|---|
event_ready :1 | 支持eventready | |
data_width :1 | 支持的数据宽度 | |
erase_chip :1 | 支持整片擦除 |
csi_eflash_power_control
int32_t csi_eflash_power_control(eflash_handle_t handle, csi_power_stat_e state)
功能描述:
- 配置eflash实例的功耗模式。
参数:
handle
: 实例句柄。state
: eflash的功耗模式,参看 csi_power_stat_e的定义。
返回值:
- 错误码。
csi_eflash_read
int32_t csi_eflash_read(eflash_handle_t handle, uint32_t addr, void *data, uint32_t cnt)
功能描述:
- 从eflash读数据。
参数:
handle
: 实例句柄。addr
: 待读取的eflash地址。data
: 待接收数据的缓冲区地址。cnt
: 读取的数据的长度。
返回值:
- 错误码。
csi_eflash_program
int32_t csi_eflash_program(eflash_handle_t handle, uint32_t addr, const void *data, uint32_t cnt)
功能描述:
- 往eflash写数据。
参数:
handle
: 实例句柄。addr
: 写入的eflash地址。data
: 待烧写数据的缓冲区地址。cnt
: 数据的长度。
返回值:
- 错误码。
csi_eflash_erase_sector
int32_t csi_eflash_erase_sector(eflash_handle_t handle, uint32_t addr)
功能描述:
- 以sector擦除eflash的数据。
参数:
handle
: 实例句柄。addr
: 要擦除eflash地址。
返回值:
- 错误码。
csi_eflash_erase_chip
int32_t csi_eflash_erase_chip(eflash_handle_t handle)
功能描述:
- 擦除整片eflash的数据。
参数:
handle
: 实例句柄。
返回值:
- 错误码。
csi_eflash_get_info
eflash_status_t csi_eflash_get_info(eflash_handle_t handle)
功能描述:
- 获取当前时刻eflash的信息。
参数:
handle
: 实例句柄。
返回值:
- eflash信息的结构体,eflash的状态定义见 eflash_info_t。
eflash_info_t:
名字 | 定义 | 备注 |
---|---|---|
uint32_t start | 开始地址 | |
uint32_t end | 末尾地址 | |
uint32_t sector_count | sector个数 | |
uint32_t sector_size | sector的大小 | |
uint32_t page_size | page的大小 | |
uint32_t program_unit | 写入的最小单位 | |
uint32_t erased_value | 擦除完成的值 |
csi_eflash_get_status
eflash_status_t csi_eflash_get_status(eflash_handle_t handle)
功能描述:
- 获取当前时刻eflash的状态。
参数:
handle
: 实例句柄。
返回值:
- eflash状态的结构体,eflash的状态定义见 eflash_status_t。
eflash_status_t:
名字 | 定义 | 备注 |
---|---|---|
busy : 1 | 状态为忙 | |
error : 1 | 写入/擦除 错误 |
示例
eFlash示例1
static eflash_handle_t eflash;
define ELFASH_START_ADDR 0x10000000
define EFLASH_READ_LEN 0x200
define EFLASH_WRITE_LEN 0x200
void example_main(void)
{
int32_t ret;
uint32_t addr = ELFASH_START_ADDR;
uint8_t read_data[EFLASH_READ_LEN]={0};
uint32_t cnt = EFLASH_READ_LEN;
eflash_capabilities_t cap;
//get eflash capabilities
cap = csi_eflash_get_capabilities(0);
printf("eflash %s erase by chip \n",cap.erase_chip==1 ? "support":"not support");
//initialize eflash by idx
eflash = csi_eflash_initialize(0, NULL);
if (eflash == NULL) {
//fail
return;
}
ret = csi_eflash_power_control(eflash, DRV_POWER_FULL);
if (ret < 0) {
// power control failed
return;
}
//get the eflash information
eflash_info_t *info=NULL;
info = csi_eflash_get_info(eflash);
printf("the eflash sector_count is %x \n sector size is %x \n program uint is %x \n erased value is %x\r\n", info-sector_count, info-sector_size, info-program_unit, info-erased_value);
//erase eflash by chip
ret = csi_eflash_erase_chip(eflash);
if (ret < 0) {
//failed
}
//get the status
eflash_status_t status;
while(1) {
status = csi_eflash_get_status(eflash);
if (status.busy==0) {
break;
}
}
uint8_t write_data[EFLASH_WRITE_LEN]={0};
memset(write_data, 0x5a, EFLASH_WRITE_LEN);
//write data to the eflash addr
ret = csi_eflash_program(eflash, addr, write_data, cnt);
if (ret < 0) {
//failed
}
//read data from the eflash addr
ret = csi_eflash_read(eflash, addr, read_data, cnt);
if (ret < 0) {
//failed
}
//erase eflash by sector
ret = csi_eflash_erase_sector(eflash, addr);
if (ret < 0) {
//failed
}
ret = csi_eflash_power_control(eflash, DRV_POWER_OFF);
if (ret < 0) {
// power control failed
return;
}
//uninitialize eflash
ret = csi_eflash_uninitialize(eflash);
if (ret != 0) {
//failed
}
}