别的不说你写的时候第一步就错了。你k9f1208上面写的是什么?
要写先擦除。擦除是一块为单位,而写的时候,你要以页为单位。
1、先写一个擦除源码
- int NF_EraseBlock(unsigned int block)
- {
- unsigned int blockPage;
- unsigned char data;
-
- blockPage=(block<<5);
- NF_nFCE_L();
- NF_CMD(NAND_CMD_ERASE1); //发出擦除命令
- NF_ADDR(blockPage&0xff);
- NF_ADDR((blockPage>>8)&0xff);
- NF_ADDR((blockPage>>16) & 0xff);
- NF_CMD(NAND_CMD_ERASE2); //确认并开始擦除
- NF_WAITRB(); //等待状态查询命令
-
- NF_CMD(NAND_CMD_STATUS); //发出状态查询命令
- data=NF_RDDATA();
- NF_nFCE_H();
- return !(data & 1); //data=0:擦除成功 data=1:擦除失败
- }
复制代码
2、写的时候你必须以页为单位进行,这是芯片编程的需要。你的有效数据写完之后,还要把最后的16位校验位要写上,这个你可以参照芯片文档,也可以写入0xFF。
需要额外说明的是,
1、读写时序你不用对我们搞软件的可以不予理会,那个是写给做硬件的人看的,你只要命令字正确,时序就对了。
2、你读的时候,也没对齐,我没试过,不过感觉你读出来的数据可能不是你要的。读的时候分了前半页和后半页。如果你从127个字节后读,你的命令字应是NFCMD = 1;
还有什么不明白的可以联系我,嘿嘿,我这个模块记忆很深的。 |