|
|
本帖最后由 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 吗 ????
};
.... ...
}
|
|