硬汉嵌入式论坛

 找回密码
 立即注册
查看: 170|回复: 5
收起左侧

[STM32H7] 分享一下 自己捣鼓的 mx35lf4ge4a spi nand flash 驱动,不对之处欢迎大神做出批示

[复制链接]

734

主题

3877

回帖

6104

积分

论坛元老

自定义头衔

积分
6104
发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2026-5-21 14:16 编辑


分享一下 自己捣鼓的 mx35lf4ge4a spi nand flash 驱动,不对之处欢迎大神做出批示


主要是移植 自  st 提供的 w25n01g 驱动作为参考,其中修改了一丢丢来 适配 mx35lf4ge4a 的

目前 基本的读写 成功了

bsp_spi_mx35lf4ge4ad_st.h (24.47 KB, 下载次数: 2)

bsp_spi_mx35lf4ge4ad_st.c (67.04 KB, 下载次数: 1)

************************************************************************************************


static const uint8_t hex_char[] = {"0123456789ABCDEF\0"};
#define NAND_RW_TEST_SIZE    (1024*8)

/*

U1 RX :mx35lf-st-demo

MX35LF_NAND_TestST RW OK !
*/
void MX35LF_NAND_TestST(void)
{
        
        mx35lf4ge4xx_status_t  status;
        
    uint32_t  flash_addr;
        uint32_t  rw_size;
        uint32_t  rx_full_pages;
    uint32_t  trans_len = 0;
    uint32_t  i=0, error_cnt = 0;
    uint16_t  seed = 0;
   
    uint16_t  col_address = 0;
        uint16_t start_block;
        uint16_t num_blocks;
        uint8_t  page;
        uint8_t   *pTxBuff = 0;        
        uint8_t   *pRxBuff = 0;        
        
        
        if(mx35lf_info.nand_ok != 1)  return ;
        
        
        pTxBuff = mymalloc (SDRAMEX, NAND_RW_TEST_SIZE);
        pRxBuff = mymalloc (SDRAMEX, NAND_RW_TEST_SIZE);
        
        for(i=0;i<NAND_RW_TEST_SIZE; i++) {
                pTxBuff = hex_char[i%16];
                pRxBuff = 0;
        }
        
        
        start_block = 2048-2;                // 最后一个块进行读写测试
        num_blocks  = 0;
        rw_size = NAND_RW_TEST_SIZE;
        
    num_blocks = (rw_size / MX35LF2GE4AD_BLOCK_SIZE) +
                        (((rw_size % MX35LF2GE4AD_BLOCK_SIZE) == 0U) ? 0U : 1U);
        
        status = mx35lf4ge4xx_erase_blocks(&mx35lf4ge4xx_obj,  start_block,  num_blocks);                // 一个块 == 256KB 大小
        
        
        page = 0;
        status = mx35lf4ge4xx_write(&mx35lf4ge4xx_obj, start_block,  page, pTxBuff,   rw_size);
        
    /* calculate the number of pages to write */
    uint32_t full_pages = (rw_size / MX35LF2GE4AD_PAGE_MEM_SIZE) +
                        (((rw_size % MX35LF2GE4AD_PAGE_MEM_SIZE) == 0U) ? 0U : 1U);
        
        for(i=0;i<full_pages;i++) {
               
                status = mx35lf4ge4xx_read(&mx35lf4ge4xx_obj, start_block,  page, &pRxBuff[i*MX35LF2GE4AD_PAGE_MEM_SIZE],   MX35LF2GE4AD_PAGE_MEM_SIZE);
                page ++;
        }
        
        for(i=0;i<NAND_RW_TEST_SIZE; i++) {
                if(pTxBuff != pRxBuff) {
                        error_cnt = 1;
                        __log("MX35LF_NAND_TestST RW ERROR ..?\r\n");
                        break;
                }

        }
        
        if(!error_cnt)
                __log("MX35LF_NAND_TestST RW OK !\r\n");
        
        
        myfree (SDRAMEX, pTxBuff);
        myfree (SDRAMEX, pRxBuff);
}



说明:

mx35lf4ge4xx_write  这个写函数写入数据大小范围 0-(512MB-1)

mx35lf4ge4xx_read   这个读取函数一次最多只能读取 4096 byte, 超过则需要分包读取

后续看看哪位大神把他适配一下 fatfs 后发上来分享一下哈  适配 fatfs 读写建议 使用 512 大小,这样可以兼容 sd 的 fatfs 了



***************************************************************

在 st 官方提供的 w25n01g 的块擦除函数里面有个 页地址 最后一字节是 &0xC0  ??  不知道是怎么来的,哪位大佬帮忙看看是怎么回事呀 ??


static w25n01g_status_t  w25n01g_erase_block_cmd(mx35lf4ge4xx_obj_t *pobj, uint16_t block)
{
  /* Check parameters */
  if ((pobj == NULL) || (block > W25N01G_NUM_OF_BLOCK))
  {
    return W25N01G_ERROR;
  }

  w25n01g_status_t ret =  W25N01G_OK;
  /* Page address calculation to get the block address we want to erase */
  uint16_t page_addr = block * W25N01G_NUM_PAGE_PER_BLOCK ;

  /* Initialize the erase block instructions sequence */
  uint8_t cmd[4] = {W25N01G_CMD_BLOCK_ERASE,                            // w25n01
                   W25N01G_DUMMY_BYTE,
                   (uint8_t)((page_addr & 0xFF00U) >> 8),
                   (uint8_t)(page_addr & 0xC0U)                       // 这个地方怎么会是 0xC0  ??  不应该是 0xFF 吗 ????
                  };



.... ...

}





回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122740
QQ
发表于 4 天前 | 显示全部楼层
谢谢楼主分享,这个价格多少钱一颗
回复

使用道具 举报

734

主题

3877

回帖

6104

积分

论坛元老

自定义头衔

积分
6104
 楼主| 发表于 4 天前 | 显示全部楼层
eric2013 发表于 2026-5-21 13:02
谢谢楼主分享,这个价格多少钱一颗

我咸鱼上淘了几颗, 10大洋一颗 , 还是全新没有使用过的
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122740
QQ
发表于 4 天前 | 显示全部楼层
hpdell 发表于 2026-5-21 14:06
我咸鱼上淘了几颗, 10大洋一颗 , 还是全新没有使用过的

原装的应该挺贵的吧
回复

使用道具 举报

734

主题

3877

回帖

6104

积分

论坛元老

自定义头衔

积分
6104
 楼主| 发表于 4 天前 | 显示全部楼层
eric2013 发表于 2026-5-21 14:58
原装的应该挺贵的吧

淘宝上貌似写着全新原装的 不到 20 大洋哟, 这个价格如果为真的那应该也还可以把 ?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122740
QQ
发表于 3 天前 | 显示全部楼层
hpdell 发表于 2026-5-21 16:40
淘宝上貌似写着全新原装的 不到 20 大洋哟, 这个价格如果为真的那应该也还可以把 ?

那还行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-5-25 14:14 , Processed in 0.626005 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表