⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drive.c

📁 nandflash的驱动,带有测试程序,可以单独运行.当然是在有硬件的情况下.
💻 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 + -