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
    }
}

results matching ""

    No results matching ""