本帖最后由 jinyi7016 于 2016-3-22 06:08 编辑
Nand-flash内存是flash内存的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用
nand flash 是在核心板上的,所以也没有什么原理图,就看一下在核心板上的吧。型号是MS01G200BHI00,但是没有找到数据手册,应该与一般的nand flash的使用是一样的。
nand flash使用是外设是EMIf,EMIF的初始化是在gel文件中执行的。 nand flash的芯片信息读取使用platform_device_open函数。函数的参数是PLATFORM_DEVID_MT29F1G08ABCHC,还有其他的定义有nor Flash 与EEPTOM。
对系统初始化后,就使用print_flash_info函数打印出了nand flash的基本信息。这此内容是存储在PLATFORM_DEVICE_info结构体中的,platform_device_open返回值就是一个PLATFORM_DEVICE_info结构体变量,p_device,它的值如下:
print_flash_info()函数打印出的信息是在Console窗口中,与PLATFORM_DEVICE_info是一们的。如下:
nand flash测试函数使用的是nandflash_test(),函数的功能是先打开flash设备,应该是相当于初始化了,之后对nand flash时行擦除、写入、读取,通过对比写入与读取的内容,验证nand flash的功能 。
platform_device_erase_block函数的功能是擦除,它的参数是打开函数返回句柄与nand flash 的块数,程序中设定的block是512. platform_device_write函数的功能是写入,它的参数是打开函数返回句柄,偏移,写入的buffer,大小。将buffer的内容写入到nand flash中。 platform_device_read函数的功能是读取,它的参数是打开函数返回句柄,偏移,写入的buffer,大小。将nand flash中的内容写入到buffer中。
- void nandflash_test()
- {
- unsigned char *buf1 = NULL, *buf2 = NULL;
- unsigned int offset;
- PLATFORM_DEVICE_info *p_device;
- // 打开
- p_device = platform_device_open(PLATFORM_DEVID_MT29F1G08ABCHC, 0);
- if(p_device == NULL)
- {
- platform_write("Could not open NAND device errno = 0x%x n", platform_errno);
- goto free;
- }
- // 擦除
- if(platform_device_erase_block(p_device->handle, EMIF_NANDFLASH_TEST_BLOCK) != Platform_EOK)
- {
- platform_write("Unable to erase (%d) block %d errno = 0x%xn", EMIF_NANDFLASH_TEST_BLOCK, platform_errno);
- goto free;
- }
- platform_delay(1000);
- // 写入
- memset(buf1, 0x55, p_device->page_size);
- buf1 = (unsigned char *)malloc(p_device->page_size);
- if(buf1 == NULL)
- {
- platform_write("Can't allocate %d bytes for buf1n", p_device->page_size);
- goto free;
- }
- platform_blocknpage_to_offset(p_device->handle, &offset, EMIF_NANDFLASH_TEST_BLOCK, 0);
- if(platform_device_write(p_device->handle, offset, buf1, p_device->page_size) != Platform_EOK)
- {
- platform_write("Unable to write (%d) block %d page %d errno = 0x%x n", EMIF_NANDFLASH_TEST_BLOCK, 0, platform_errno);
- goto free;
- }
- platform_delay(1000);
- // 读取
- buf2 = (unsigned char *)malloc(p_device->page_size);
- if(buf2 == NULL)
- {
- platform_write("Can't allocate %d bytes for buf2n", p_device->page_size);
- goto free;
- }
- memset(buf2, 0xff, p_device->page_size);
- platform_blocknpage_to_offset(p_device->handle, &offset, EMIF_NANDFLASH_TEST_BLOCK, 0);
- if(platform_device_read(p_device->handle, offset, buf2, p_device->page_size) != Platform_EOK)
- {
- platform_write("Unable to read block %d page %d errno = 0x%xn", EMIF_NANDFLASH_TEST_BLOCK, 0, platform_errno );
- goto free;
- }
- platform_delay(1000);
- // 校验
- if(memcmp(buf1, buf2, p_device->page_size))
- {
- platform_write("failed for block %d. What we wrote is not what we read. n", EMIF_NANDFLASH_TEST_BLOCK);
- }
- else
- {
- platform_write("passedn");
- }
- free:
- if(buf1)
- {
- free(buf1);
- }
- if(buf2)
- {
- free(buf2);
- }
- platform_device_close(p_device->handle);
- }
复制代码
最后进行仿真时,窗口的输出内容如下,说明nand flash 的测试结果是正确的。
而对于STK的EMIF例程中,不同的是,EMIT_init()函数用于对EMIF进行初始化,使用了EMIF16_CE_Config与EMIF16_Config两个结构体。
初始化方式也是先对结构体进行赋值,再使用KeyStone_EMIF16_init(&gEmif16Cfg);函数进行初始化。这里就不再赘述了。
|