📄 drive.c
字号:
#include "stdio.h"#include "nand.h"/****************** 延时子程序 ******************/void FlashDelay(int FlashDelay) //用于适应芯片的时序 { int i; for(i=0;i<FlashDelay;i++);}/****************** 与Flash有关的硬件初始化子程序 ******************/void HwInitForFlash(void){ Mcfg1=Mcfg1|0x00080000; /* I/O_0 Enable 即选定i/o_0空间的寄存器,应和接线有关*/ Mcfg1=Mcfg1&0xe7ffffff; /* I/O bus width =8 即设定总线的宽度,nand芯片以是8位数据进行读写的*/ Gpio0Dir=Gpio0Dir|0x00003800; /* Gpio0[11],Gpio0[12],Gpio0[13] is output 即设定GPIO口的*/ Gpio0Dir=Gpio0Dir&0xffff3fff; FlashCeDis(); FlashCleDis(); FlashAleDis();}/****************** Flash控制子程序 ******************/void FlashCeEn(void){ Gpio0Data=Gpio0Data&0xffffdfff; //第13位}void FlashCeDis(void){ Gpio0Data=Gpio0Data|0x00002000;}void FlashCleEn(void){ Gpio0Data=Gpio0Data|0x00001000; //第12位}void FlashCleDis(void){ Gpio0Data=Gpio0Data&0xffffefff;}void FlashAleEn(void){ Gpio0Data=Gpio0Data|0x00000800; //第11位}void FlashAleDis(void){ Gpio0Data=Gpio0Data&0xfffff7ff;}/****************** 读Flash ID子程序 ******************/unsigned int FlashIdRead(void){ unsigned char i; unsigned int j=0; FlashCeEn(); FlashCleEn(); FlashAddr=0x90; FlashCleDis(); FlashAleEn(); FlashAddr=0x00; FlashAleDis(); i=FlashAddr; printf("i=%x",i); j=FlashAddr; printf("\n j=%x\n",j); FlashCeDis(); j=j<<8; j=j+i; printf("second j=%x\n",j); return(j);} /****************** Flash初始化子程序 ******************//*程序中在使用nandFlash前必须对nandFlash进行一次初始化。返回值:"0":成功;"非0":不成功*/unsigned char FlashInit(void){ unsigned int i; i=FlashIdRead(); if(i==0x75ec) return(0); else return(1); }/****************** 擦删Flash的Block子程序 ******************/unsigned char FlashBlockErase(unsigned long Address){ unsigned char A9_16,A17_24,Status; A9_16=(unsigned char)(Address&0x000000ff); A17_24=(unsigned char)((Address&0x0000ff00)>>8); Status=0x00; FlashCeEn(); FlashCleEn(); FlashAddr=0x60; FlashCleDis(); FlashAleEn(); FlashAddr=A9_16; FlashAddr=A17_24; FlashAleDis(); FlashCleEn(); FlashAddr=0xd0; FlashCleDis(); FlashDelay(10); /*delay 3ms*/ while((Status&0x40)==0x00) { FlashCleEn(); FlashAddr=0x70; FlashCleDis(); Status=FlashAddr; } FlashCleEn(); FlashAddr=0x70; FlashCleDis(); Status=FlashAddr; FlashCeDis(); Status=Status&0x01; return(Status);}/****************** 向Flash中写入指定长度数据子程序 ******************//*所写的地址空间必须在同一Page中*//*Address:指定写入数据的nandFlash线性地址起始位置, Length:指定写入数据的长度, Buf:存储要写入nandFlash数据的数据缓冲区, 返回值:"0":成功;"非0":不成功*/unsigned char FlashWrite(unsigned long Address,unsigned int Length,unsigned char *Buf){ unsigned char A0_7,A8,A9_16,A17_24,Status; unsigned int i; A0_7=(unsigned char)(Address&0x000000ff); A8=(unsigned char)((Address&0x00000100)>>8); A9_16=(unsigned char)((Address&0x0001fe00)>>9); A17_24=(unsigned char)((Address&0x01fe0000)>>17); Status=0x00; FlashCeEn(); FlashCleEn(); if (A8) FlashAddr=0x01; else FlashAddr=0x00; FlashAddr=0x80; FlashCleDis(); FlashAleEn(); FlashAddr=A0_7; FlashAddr=A9_16; FlashAddr=A17_24; FlashAleDis(); for(i=0;i<Length;i++) { FlashAddr=Buf[i]; }printf("*****ok****\n"); FlashCleEn(); FlashAddr=0x10; FlashDelay(2); /*delay 500us*/ while((Status&0x40)==0x00) { FlashCleEn(); FlashAddr=0x70; FlashCleDis(); Status=FlashAddr; } FlashAddr=0x70; FlashCleDis(); Status=FlashAddr; FlashCeDis(); Status=Status&0x01; return(Status);}/****************** 从Flash中读出指定长度的数据子程序 ******************//*所读的地址空间必须在同一Page中*//*Address:指定读出数据的nandFlash线性地址起始位置, Length:指定读出数据的长度, Buf:存储从nandFlash读出的数据, 返回值:"0":成功;"非0":不成功*/void FlashRead(unsigned long Address,unsigned int Length,unsigned char * Buf){ unsigned char A0_7,A8,A9_16,A17_24,i; A0_7=(unsigned char)(Address&0x000000ff); A8=(unsigned char)((Address&0x00000100)>>8); A9_16=(unsigned char)((Address&0x0001fe00)>>9); A17_24=(unsigned char)((Address&0x01fe0000)>>17); FlashCeEn(); FlashCleEn(); if (A8) FlashAddr=0x01; else FlashAddr=0x00; FlashCleDis(); FlashAleEn(); FlashAddr=A0_7; FlashAddr=A9_16; FlashAddr=A17_24; FlashAleDis(); FlashDelay(1); /*delay 10us*/ for(i=0;i<Length;i++) Buf[i]=FlashAddr; FlashCeDis();}void Flash_C_Read(unsigned long Address,unsigned int Length,unsigned char *Buf){ unsigned char A0_3=0,A8,A9_16=0,A17_24=0,i; A0_3=(unsigned char)(Address&0x0000000f); A9_16=(unsigned char)((Address&0x0001fe00)>>9); A17_24=(unsigned char)((Address&0x01fe0000)>>17); FlashCeEn(); FlashCleEn(); FlashAddr=0x50; FlashCleDis(); FlashAleEn(); FlashAddr=A0_3; FlashAddr=A9_16; FlashAddr=A17_24; FlashAleDis(); FlashDelay(1); //delay 10us for(i=0;i<Length;i++) Buf[i]=FlashAddr; FlashCeDis(); }int isInvalid(unsigned int blocknum){ unsigned int Addr=0; unsigned char buf[16]; int i; for(i=0;i<2;i++) { Addr=blocknum<<5+i; Addr=Addr<<9+5; Flash_C_Read(Addr,16,buf); if(buf[5]!=0xff) return 1; Addr=0; }return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -