今天调试时:
unsigned char TxBuffer0[512];
unsigned char TxBuffer1[512];
unsigned char TxBuffer2[512];
unsigned char RxBuffer0[512];
unsigned char RxBuffer1[512];
unsigned char RxBuffer2[512];
Fill_Buffer(TxBuffer0, 512, 0);
Fill_Buffer(TxBuffer1, 512, 1);
Fill_Buffer(TxBuffer2, 512, 2);
数组TxBuffer0、TxBuffer1、TxBuffer2,分别通过
Fill_Buffer()函数填充,有
Fill_Buffer0[512]={0,1,2,3...0xFF,0,1,2,3...0xFF,0,1,2,3...0XFF,0,1,2,3...0xFF};
Fill_Buffer1[512]={1,2,3...0xFF,0,1,2,3...0xFF,0,1,2,3...0XFF,0,1,2,3...0xFF,0};
Fill_Buffer2[512]={2,3...0xFF,0,1,2,3...0xFF,0,1,2,3...0XFF,0,1,2,3...0xFF,0,1};
然后:
FlashWriteOneSector(788,TxBuffer0);
FlashWriteOneSector(1300,TxBuffer1);
FlashWriteOneSector(1812,TxBuffer2);
即:
数组Fill_Buffer0中的512个数据,写入flash起始地址为788(十进制)的一个扇区内:788~1299;
数组Fill_Buffer1中的512个数据,写入flash起始地址为1300(十进制)的一个扇区内:1300~1811;
数组Fill_Buffer2中的512个数据,写入flash起始地址为1812(十进制)的一个扇区内:1812~2323;
其中:1812~2323这个扇区时跨页的,1812~2047属于Page0,2048~2323 属于Page1。
最后通过读扇区来验证数据的正确性:
FlashReadOneSector(788,RxBuffer0);
FlashReadOneSector(1300,RxBuffer1);
FlashReadOneSector(1812,RxBuffer2);
结果是:
地址范围为788~1299,1300~1800的两个扇区中的数据:读出的与之前写入的完全一致;
但地址范围为1812~2323,即跨页的这个扇区的数据:前面部分数据一致,后面的数据却是D3。
如图1所示。
后来我也试了一下跨块的扇区,
FlashWriteOneSector(130000,TxBuffer3);
FlashWriteOneSector(130512,TxBuffer4);
FlashWriteOneSector(131024,TxBuffer5);//跨块扇区
FlashReadOneSector(130000,RxBuffer3);
FlashReadOneSector(130512,RxBuffer4);
FlashReadOneSector(131024,RxBuffer5); //跨块扇区
结果依旧是:跨块扇区的数据:前面部分数据一致,后面的数据则是D3。
在此之前,我一直以为,当数据比较长时,会自动的跨到下一页。
但,这是错误的。
“NAND flash存储器会自动累加器内部的操作地址,读写数据时没有必要变换
数据的操作地址,即不必对连续的地址区操作”
“写入过程在NAND flash内部是有边界对齐的,也就是说,写入起始地址不是
页对齐时,只能从当前字节写到本页末尾,而不能跨越到第二页继续写,即使
写入够长,也不能一次跨两页”
“读取过程在NAND flash内部也是有边界对齐的,也就是说,读取地址不是
页对齐时,之恩给你从当前字节地址开始读到本页末尾,而不能跨越到第二页
继续读取,即使读取够长,也不能跨越两页读取”
后来,我避开跨块和跨页的问题,将地址都改成页对齐(Addr%FLASH_PAGE_SIZE==0)
去读和写,结果读和写的数据都是完全一致的。
|