STM32H750XB_RT-THREAD/25-FMC—扩展外部NAND/User/nand/nandtest.c
2025-07-21 14:34:29 +08:00

214 lines
5.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "./nand/nandtest.h"
#include "./nand/bsp_nand.h"
#include "./nand/ftl.h"
#include "string.h"
#include "./malloc/malloc.h"
/**
* @brief 向NAND某一页写入指定大小的数据
* @param pagenum:要写入的页地址
* @param colnum:要写入的开始列地址(页内地址)
* @param writebytes:要写入的数据大小MT29F16G最大为4320MT29F4G最大为2112
* @retval 0,检查成功,全部相等;1,检查失败,有不相等的情况
*/
uint8_t test_writepage(uint32_t pagenum,uint16_t colnum,uint16_t writebytes)
{
uint8_t *pbuf;
uint8_t sta=0;
uint16_t i=0;
pbuf=mymalloc(SRAMEX,5000);
for(i=0;i<writebytes;i++)//准备要写入的数据,填充数据,从0开始增大
{
pbuf[i]=i;
}
sta=NAND_WritePage(pagenum,colnum,pbuf,writebytes); //向nand写入数据
myfree(SRAMEX,pbuf); //释放内存
return sta;
}
/**
* @brief 读取NAND某一页指定大小的数据
* @param pagenum : 要读取的页地址
* @param colnum : 要读取的开始列地址(页内地址)
* @param readbytes : 要读取的数据大小MT29F16G最大为4320MT29F4G最大为2112
* @retval 操作结果
*/
uint8_t test_readpage(uint32_t pagenum, uint16_t colnum, uint16_t readbytes)
{
uint8_t *pbuf;
uint8_t sta=0;
uint16_t i=0;
pbuf=mymalloc(SRAMEX,5000);
sta=NAND_ReadPage(pagenum,colnum,pbuf,readbytes); //读取数据
if(sta==0||sta==NSTA_ECC1BITERR||sta==NSTA_ECC2BITERR)//读取成功
{
printf("read page data is:\r\n");
for(i=0;i<readbytes;i++)
{
printf("%d ",pbuf[i]); //串口打印读取到的数据
}
printf("\r\nend\r\n");
}
myfree(SRAMEX,pbuf); //释放内存
return sta;
}
/**
* @brief 将一页数据拷贝到另外一页,并写入一部分内容.
* @note 源页和目标页要在同一个Plane内(同为奇数/同为偶数)
* @param spnum : 源页地址
* @param epnum : 目标页地址
* @param colnum : 要写入的开始列地址(页内地址)
* @param writebytes : 要写入的数据大小,不能超过页大小
* @retval 操作结果
*/
uint8_t test_copypageandwrite(uint32_t spnum, uint32_t dpnum, uint16_t colnum, uint16_t writebytes)
{
uint8_t *pbuf;
uint8_t sta=0;
uint16_t i=0;
pbuf=mymalloc(SRAMEX,5000);
for(i=0;i<writebytes;i++)//准备要写入的数据,填充数据,从0X80开始增大
{
pbuf[i]=i+0X80;
}
sta=NAND_CopyPageWithWrite(spnum,dpnum,colnum,pbuf,writebytes); //向nand写入数据
myfree(SRAMEX,pbuf); //释放内存
return sta;
}
/**
* @brief 读取NAND某一页Spare区指定大小的数据
* @param pagenum : 要读取的页地址
* @param colnum : 要读取的spare区开始地址
* @param readbytes : 要读取的数据大小MT29F16G最大为64MT29F4G最大为224
* @retval 操作结果
*/
uint8_t test_readspare(uint32_t pagenum, uint16_t colnum, uint16_t readbytes)
{
uint8_t *pbuf;
uint8_t sta=0;
uint16_t i=0;
pbuf=mymalloc(SRAMEX,512);
memset(pbuf,0,512);
sta=NAND_ReadSpare(pagenum,colnum,pbuf,readbytes); //读取数据
if(sta==0)//读取成功
{
printf("read spare data is:\r\n");
for(i=0;i<readbytes;i++)
{
printf("%x ",pbuf[i]); //串口打印读取到的数据
}
printf("\r\nend\r\n");
}
myfree(SRAMEX,pbuf); //释放内存
return sta;
}
/**
* @brief 从指定位置开始,读取整个NAND,每个BLOCK的第一个page的前5个字节
* @param sblock : 指定开始的block编号
* @retval 无
*/
void test_readallblockinfo(uint32_t sblock)
{
uint8_t j=0;
uint32_t i=0;
uint8_t sta;
uint8_t buffer[5];
for(i=sblock;i<nand_dev.block_totalnum;i++)
{
printf("block %d info:",i);
sta=NAND_ReadSpare(i*nand_dev.block_pagenum,0,buffer,5);//读取每个block,第一个page的前5个字节
if(sta)printf("failed\r\n");
for(j=0;j<5;j++)
{
printf("%x ",buffer[j]);
}
printf("\r\n");
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
/* FTL层测试代码 */
/**
* @brief 从某个扇区开始,写入seccnt个扇区的数据
* @param secx : 开始的扇区编号
* @param secsize : 扇区大小
* @param seccnt : 要写入的扇区个数
* @retval 操作结果
*/
uint8_t test_ftlwritesectors(uint32_t secx, uint16_t secsize, uint16_t seccnt)
{
uint8_t *pbuf;
uint8_t sta=0;
uint32_t i=0;
pbuf=mymalloc(SRAMEX,secsize*seccnt);
for(i=0;i<secsize*seccnt;i++) //准备要写入的数据,填充数据,从0开始增大
{
pbuf[i]=i;
}
sta=FTL_WriteSectors(pbuf,secx,secsize,seccnt); //向nand写入数据
myfree(SRAMEX,pbuf); //释放内存
return sta;
}
/**
* @brief 从某个扇区开始,读出seccnt个扇区的数据
* @param secx : 开始的扇区编号
* @param secsize : 扇区大小
* @param seccnt : 要读取的扇区个数
* @retval 操作结果
*/
uint8_t test_ftlreadsectors(uint32_t secx, uint16_t secsize, uint16_t seccnt)
{
uint8_t *pbuf;
uint8_t sta=0;
uint32_t i=0;
pbuf=mymalloc(SRAMEX,secsize*seccnt);
memset(pbuf,0,secsize*seccnt);
sta=FTL_ReadSectors(pbuf,secx,secsize,seccnt); //读取数据
if(sta==0)
{
printf("read sec %d data is:\r\n",secx);
for(i=0;i<secsize*seccnt;i++) //准备要写入的数据,填充数据,从0开始增大
{
printf("%x ",pbuf[i]); //串口打印读取到的数据
}
printf("\r\nend\r\n");
}
myfree(SRAMEX,pbuf); //释放内存
return sta;
}