norflash的基本操作2

norflash芯片擦除
芯片手册中仅扇区、块、整片擦除操作
整片擦除无须使用addr地址


int _norflash_eraser(u8 eraser, u32 addr)//擦除
{
   
    u8 eraser_cmd;
    switch (eraser) {
   
    case FLASH_PAGE_ERASER://页擦除 ???手册中无页擦除指令?
        eraser_cmd = WINBOND_PAGE_ERASE;//页擦除指令
        addr = addr / 256 * 256;//计算页对齐地址
        break;
    case FLASH_SECTOR_ERASER://扇区擦除
        eraser_cmd = WINBOND_SECTOR_ERASE;//扇区擦除指令
        //r_printf(">>>[test]:addr = %d\n", addr);
        addr = addr / 4096 * 4096;//计算扇区对齐地址
        break;
    case FLASH_BLOCK_ERASER://块擦除
        eraser_cmd = WINBOND_BLOCK_ERASE;//块擦除指令
        addr = addr / 65536 * 65536;//计算块对齐地址
        break;
    case FLASH_CHIP_ERASER://整片擦除
        eraser_cmd = WINBOND_CHIP_ERASE;//整片擦除指令
        break;
    }
    _norflash_send_write_enable();//使能写
    spi_cs_l();//片选使能
    spi_write_byte(eraser_cmd);//写指令
    if (eraser_cmd != WINBOND_CHIP_ERASE) {
   //如果不是整片擦除
        _norflash_send_addr(addr);//需要写入地址
    }
    spi_cs_h();//片选禁能
    return _norflash_wait_ok();//等待完成
}

//cmd:指令
//arg:获取时为指针的地址,设置时为参数
//unit:单位,1表示字节,1024表示KB,1024*1024表示MB
//part:分区


int _norflash_ioctl(u32 cmd, u32 arg, u32 unit, void *_part)//IO通道控制
{
   
    int reg = 0;
    struct norflash_partition *part = _part;
    os_mutex_pend(&_norflash.mutex, 0);
    switch (cmd) {
   
    case IOCTL_GET_STATUS://获取状态
        *(u32 *)arg = 1;
        break;
    case IOCTL_GET_ID://获取ID
        *((u32 *)arg) = _norflash.flash_id;
        break;
    case IOCTL_GET_CAPACITY://获取存储能力
        if (_norflash.flash_capacity == 0)  {
   //没有存储空间
            *(u32 *)arg = 0;
        } else if (_norflash.part_num == 1 && part->start_addr == 0) 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值