norflash的基本操作

本文详细介绍了在单片机环境中使用C语言进行NorFlash的基本操作,包括读取、写入和擦除等步骤,旨在帮助嵌入式硬件开发者更好地理解和应用NorFlash存储技术。
摘要由CSDN通过智能技术生成
norflash与mcu之间主要通过SPI接口进行通信。
norflash的初始化主要包括SPI接口的初始化、分区创建及初始化操作。

详细过程:
初始化norflash访问的SPI接口
根据名字创建分区,如果该名字分区已经存在,则不创建
如果创建分区时,空间不足,返回错误
创建新分区时,该分区与其他分区是否存在重叠
int _norflash_init(const char *name, struct norflash_dev_platform_data *pdata)//初始化
{
   
    log_info("norflash_init ! %x %x", pdata->spi_cs_port, pdata->spi_read_width);//打印CS引脚和位宽
    if (_norflash.spi_num == (int) - 1) {
   //SPI编号未初始化
        _norflash.spi_num = pdata->spi_hw_num;//编号
        _norflash.spi_cs_io = pdata->spi_cs_port;//CS引脚配置
        _norflash.spi_r_width = pdata->spi_read_width;//位宽配置
        _norflash.flash_id = 0;
        _norflash.flash_capacity = 0;//flash的存储能力
        os_mutex_create(&_norflash.mutex);//创建互斥信号量
        _norflash.max_end_addr = 0;//最大的结束地址
        _norflash.part_num = 0;//已使用的分区个数
    }
    ASSERT(_norflash.spi_num == pdata->spi_hw_num);
    ASSERT(_norflash.spi_cs_io == pdata->spi_cs_port);
    ASSERT(_norflash.spi_r_width == pdata->spi_read_width);
    struct norflash_partition *part;
    part = norflash_find_part(name);//根据名字查找part
    if (!part) {
   //没找到则可以根据这个name进行新建
        part = norflash_new_part(name, pdata->start_addr, pdata->size);//新建
        ASSERT(part, "not enough norflash partition memory in array\n");//空间不足
        ASSERT(norflash_verify_part(part) == 0, "norflash partition %s overlaps\n", name);//检验是否重叠
        log_info("norflash new partition %s\n", part->name);
    } else {
   
        ASSERT(0, "norflash partition name already exists\n");//名字已存在
    }
    return 0;
}
这里仅对指定name的分区进行了初始化操作。


norflash的打开操作首先判断是否被打开过,
没有被打开过,则需要进行SPI的初始化,
读取芯片的ID,通过芯片ID计算芯片的存储容量,
如果使能了缓存功能,则先从flash地址0处读4KB到缓存中,
将打开计数递增。
open函数主要是整个芯片的打开、初始化;init函数是分区的初始化。
int _norflash_open(void *arg)//打开
{
   
    int reg = 0;
    os_mutex_pend(&_norflash.mutex, 0);
    log_info("norflash open\n");
    if (!_norflash.open_cnt) {
   //如果open cnt为0表示接口未打开,需初始化接口等
        spi_cs_init();//片选引脚初始化
        spi_open(_norflash.spi_num);//SPI打开
        _norflash.flash_id = _norflash_read_id();//读芯片ID
        log_info("norflash_read_id: 0x%x\n", _norflash.flash_id);//打印芯片ID
        if ((_norflash.flash_id == 0) || (_norflash.flash_id == 0xffffff)) {
   //读回来的为0或全F,表示错误
            log_error("read norflash id error !\n");
            reg = -ENODEV;
            goto __exit;
        }
        //id号的最后一个字节表明芯片的存储空间大小
        //通过换算计算flash存储空间
        //例如WinBond FLASH W25X16最后一个ID为0x15,W25X32最后一个ID为0x16
        //W25X16空间为2MB,W25X32为4MB
        //W25X16空间大小计算:(ID & 0xFF) - 0x10 = 5
        //                   2^5 * 64KB = 2MB
        _norflash.flash_capacity = 64 * _pow(2, (_norflash.flash_id & 0xff) - 0x10) * 1024;//计算存储空间大小
        log_info("norflash_capacity: 0x%x\n", _norflash.flash_capacity)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值