w25n01g的坏块管理代码

硬件环境:nrf52840   win10

winbond芯片:w25n01g

/*bad block management*/
typedef struct bblut_s {
    uint16_t pba;//Physical Block Address”
    uint16_t lba;//Logical Block Address
} bblut_t;

//you can reference (Read JEDEC ID) command
int8_t w25n01g_readBBLUT(flash_device_t *w25n01gc_flash, bblut_t *bblut, int lutsize)
{
    spi_transfer_t spi_xfer_data;
    int8_t status = FLASH_SUCCESS;
    uint8_t in[4];

    memset(&spi_xfer_data, 0, sizeof(spi_transfer_t));

    status = w25n01gv_write_enable(w25n01gc_flash);
    if (status != FLASH_SUCCESS)
    {
        return status;
    }

    /* Wait for busy bit */
    status = wait_if_busy(w25n01gc_flash, W25N01GV_BUSY_DEFAULT_TIMEOUT_MS);
    if (status != FLASH_SUCCESS)
    {
        if (status == FLASH_TIMEOUT)
        {
            LOG_FLASH(ERROR, "W25N01GV: %s, %d: wait if busy timeout!",
                      __func__, __LINE__);
        }
        else
        {
            LOG_FLASH(ERROR, "W25N01GV: %s, %d: wait if busy fail!", __func__,
                      __LINE__);
        }
        return status;
    }
    
    spi_xfer_data.opcode = W25N01GV_READ_BBM_LUT;
    spi_xfer_data.dummy_cycles = 1;//W25N01GV_JEDEC_ID_DUMMY_CYCLES;
    spi_xfer_data.dummy_cyles_pos = 0;
    spi_xfer_data.rx_buf = in;
    spi_xfer_data.rx_len = 4;
    spi_xfer_data.tx_len = 0;

    for(int i=0; i<lutsize; i++)
    {
        status = flash_spi_transfer(w25n01gc_flash, &spi_xfer_data);
        if (status != FLASH_SUCCESS)
        {
            LOG_FLASH(ERROR, "W25N01GV: %s, %d:  spi transfer failed", __func__,
                      __LINE__);
            return status;
        }
        else
        {
            bblut[i].pba = (in[0] << 16)|in[1];
            bblut[i].lba = (in[2] << 16)|in[3];
        }
    }

    return status;    
}

int8_t w25n01g_writeBBLUT(flash_device_t *w25n01gc_flash, uint16_t lba, uint16_t pba)
{
    spi_transfer_t spi_xfer_data;
    int8_t status = FLASH_SUCCESS;
    uint8_t send_data[4] = {lba >> 8, lba, pba >> 8, pba};
    
    memset(&spi_xfer_data, 0, sizeof(spi_transfer_t));

    status = w25n01gv_write_enable(w25n01gc_flash);
    if (status != FLASH_SUCCESS)
    {
        return status;
    }

    /* Wait for busy bit */
    status = wait_if_busy(w25n01gc_flash, W25N01GV_BUSY_DEFAULT_TIMEOUT_MS);
    if (status != FLASH_SUCCESS)
    {
        if (status == FLASH_TIMEOUT)
        {
            LOG_FLASH(ERROR, "W25N01GV: %s, %d: wait if busy timeout!",
                      __func__, __LINE__);
        }
        else
        {
            LOG_FLASH(ERROR, "W25N01GV: %s, %d: wait if busy fail!", __func__,
                      __LINE__);
        }
        return status;
    }
    
    spi_xfer_data.opcode = W25N01GV_JEDEC_ID;
    spi_xfer_data.dummy_cycles = 0;//W25N01GV_JEDEC_ID_DUMMY_CYCLES;
    spi_xfer_data.dummy_cyles_pos = 0;
    //spi_xfer_data.rx_buf = in;
    spi_xfer_data.rx_len = 0;
    spi_xfer_data.tx_len = 0;
    spi_xfer_data.tx_buf = send_data;

    status = flash_spi_transfer(w25n01gc_flash, &spi_xfer_data);
    if (status != FLASH_SUCCESS)
    {
        LOG_FLASH(ERROR, "W25N01GV: %s, %d:  spi transfer failed", __func__,
                  __LINE__);
        return status;
    }


    return status;     
}

补充:很多人可能为了节省成本,而使用nand flash  这个推荐一篇博客:主要是nand flash中文件系统的操作

CSDN

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
W25N01G是一种闪存芯片,它采用NAND Flash技术,常用于嵌入式系统中的数据存储。在Python中,可以使用第三方库来实现对W25N01G读写操作。 一个常用的Python库是`spidev`,它提供了与SPI设备通信的功能。首先,你需要确保你的系统已经正确配置了SPI接口,并且已经安装了`spidev`库。 下面是一个简单的示例代码,演示如何使用`spidev`库读取W25N01G芯片中的数据: ```python import spidev # 打开SPI设备 spi = spidev.SpiDev() spi.open(0, 0) # 参数0表示SPI总线号,参数0表示设备号 # 设置SPI通信参数 spi.max_speed_hz = 1000000 # 设置通信速率为1MHz spi.mode = 0b00 # 设置SPI模式为0 # 发送读取命令 spi.xfer([0x03, 0x00, 0x00, 0x00]) # 0x03表示读取命令,后面的三个字节表示地址 # 读取数据 data = spi.readbytes(256) # 读取256字节的数据 # 关闭SPI设备 spi.close() # 打印读取到的数据 print(data) ``` 上述代码中,首先通过`spidev.SpiDev()`创建了一个SPI对象,然后使用`spi.open(0, 0)`打开SPI设备。接下来,通过设置`spi.max_speed_hz`和`spi.mode`来配置SPI通信参数。然后,使用`spi.xfer()`发送读取命令,其中0x03表示读取命令,后面的三个字节表示要读取的地址。最后,使用`spi.readbytes()`读取指定长度的数据。读取完成后,可以通过`spi.close()`关闭SPI设备。 请注意,上述代码只是一个简单示例,实际使用时需要根据具体的硬件和芯片规格进行适配和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值