我在官网下了一个下载应用程序的NandWriter例程,希望能够通过这个程序将目标应用程序写入Nand Flash,我的NAND FLASH为MT29F4G16ABADAH4,和C6748 LCDK的应该一样。按理说应该不需要修改什么就能使用的(DDR2 SDRAM这里先不讨论,只讨论怎么操作FLASH),可是NAND_open函数就没正常运行。
在debug模式下,hNandInfo = NAND_open((Uint32)&NANDStart, DEVICE_BUSWIDTH_16BIT );返回为空,出现问题
进入函数里面观察,发现安装的确实是CS3 ,从地址0x62000000开始的 NAND FLASH,这里没问题
然后发现是NAND_open函数里面的LOCAL_flashGetDetails(hNandInfo)处出现了返回为NULL的值,显然问题出在这里了。
跳进LOCAL_flashGetDetails(hNandInfo)里面观察,从NAND FLASH读取信息
hNandInfo->dataBytesPerPage = (Uint16) (*((Uint32 *) (paramPageData+80))) & 0xFFFF;
hNandInfo->spareBytesPerPage = (Uint16) (*((Uint16 *) (paramPageData+84)));
hNandInfo->pagesPerBlock = (Uint16) (*((Uint32 *) (paramPageData+92))) & 0xFFFF;
hNandInfo->numBlocks = (Uint32) (*((Uint32 *) (paramPageData+96))) * paramPageData[100];
hNandInfo->numColAddrBytes = (Uint8) ((paramPageData[101] >> 4) & 0xF);
hNandInfo->numRowAddrBytes = (Uint8) (paramPageData[101] & 0xF);
这些内容完全与NAND FLASH的实际参数相吻合,这里也没问题
最后程序运行到LOCAL_flashGetDetails(hNandInfo)快要返回时,出现了问题。
已知,hNandInfo指的结构体类型为
LOCAL_flashGetDetails(hNandInfo)中出现问题的语句地方:
// Check to make sure there are enough spare bytes to satisfy our needs
if ((hNandInfo->numOpsPerPage * hNandInfo->spareBytesPerOp) > hNandInfo->spareBytesPerPage)
return E_FAIL;
这里返回为E_FAIL,问题就在这里。后来确定hNandInfo->spareBytesPerOp有问题,在debug下,观察它的值等于hNandInfo->spareBytesPerPage(固定的64BYTES),所以出错了。
而hNandInfo->spareBytesPerOp的值的确定是根据判断条件确定的
而参数 hNandInfo->spareBytesPerOp(需要最终确定的值)、hNandInfo->hPageLayout->spareRegion.bytesPerOp都是不确定的,程序事先都对其没有赋值,虽然程序在刚开始进行了好像进行了初始化的操作,但实际并没有对这些参数赋值
问题1: 这个判断条件的参数hNandInfo->hPageLayout->spareRegion.bytesPerOp断电后再试验的值都是变化的,因为它需要和hNandInfo->spareBytesPerPage(固定值,64BYTES)比较后,才能断定hNandInfo->spareBytesPerOp的值,程序虽然初始化hNandInfo->hPageLayout = &DEVICE_NAND_PAGE_layout;,却没有具体赋值hNandInfo->hPageLayout ,因为DEVICE_NAND_PAGE_layout也只是定义了,没有赋值。按照提示语句
// Use device specific page layout and ECC layout
hNandInfo->hPageLayout = &DEVICE_NAND_PAGE_layout;
hNandInfo->hEccInfo = &DEVICE_NAND_ECC_info;
hNandInfo->hBbInfo = &DEVICE_NAND_BB_info;
hNandInfo->hChipInfo = DEVICE_NAND_CHIP_infoTable;
我是不是应该对DEVICE_NAND_PAGE_layout,DEVICE_NAND_ECC_info,DEVICE_NAND_BB_info,DEVICE_NAND_CHIP_infoTable都先赋值了?如果幅值这些结构体,那么hNandInfo->hPageLayout->spareRegion.bytesPerOp的值不确定问题就自然解决了,但是这些结构体(特别是里面的hPageLayout->spareRegion.bytesPerOp)又应该给什么值呢?跟用的NAND FLASH有关?
问题2: 我的NAND FLASH跟官方的LCDK的一样,在官方的device_nand.h中给了一些具体参数:
其中中间红色这三行,我在NAND FLASH MT29F4G16ABADAH4里也没有找到这类技术指标,这三个参数是怎么定的?还有,问题1的参数hNandInfo->hPageLayout->spareRegion.bytesPerOp是不是在DEVICE_NAND_MIN_SPAREBYTES_PER_OP(10)和DEVICE_NAND_MAX_SPAREBYTES_PER_OP (16)之间,随便选个数就可以了?



