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

📄 nx25p40.c

📁 NX25P40存储器测试程序!NX25P40与W25X40可兼容。
💻 C
字号:
#define _NX25P40_
#include "reg52.h"
#include "NX25P40.h"
#include "stdio.h"
static void Write_SPI(unsigned char *VAR,unsigned char lenth)
{unsigned char i,j,k,m;
 CS=0;
 CLK=0;
 for(i=0;i!=lenth;i++)
    {k=0x80;
	 for(j=0;j<8;j++)
	   {CLK=0;
	    m++;
	    if(*(VAR+i)&k)
	        DI=1;
		else 
		    DI=0;
		CLK=1;
		k>>=1;
	   }
	}
}
static unsigned char Read_SPI()
{unsigned char j,k;
 unsigned char temp;
 CS=0;k=0;
 CLK=1;
 for(j=0;j<8;j++)
	   {CLK=1;
	    temp<<=1;
		CLK=0;
		k++;
	    if(DO)
	        temp|=0x01;
	   }
 CLK=1;
 return temp;
}

void NX25P40_SPI(unsigned char CMD,unsigned long ADDR,unsigned char*VAR,unsigned char lenth,unsigned char *buf)
{unsigned char i;
 unsigned char addr[3];
 Write_SPI(&CMD,1);
 switch(CMD)
     {case 0x01:
	         Write_SPI(VAR,1); CS=1;
			 break;
	  case 0x02:
	         for(i=1;i!=4;i++)
 	            addr[i-1]=(unsigned char)(ADDR>>(16-((i-1)<<3)));
			 Write_SPI(addr,3);
             Write_SPI(VAR,lenth); CS=1;
			 break;
	  case 0x03:
	         for(i=1;i!=4;i++)
 	            addr[i-1]=(unsigned char)(ADDR>>(16-((i-1)<<3)));
			 Write_SPI(addr,3);
			 for(i=0;i!=lenth;i++)
			    *(buf+i)=Read_SPI();
			 CS=1;
			 break;
	  case 0x05:
	         *buf=Read_SPI(); CS=1;
			 break;
	  case 0x0b:
	         for(i=1;i!=4;i++)
 	            addr[i-1]=(unsigned char)(ADDR>>(16-((i-1)<<3)));
			 Write_SPI(addr,4);
			 for(i=0;i!=lenth;i++)
			    *(buf+i)=Read_SPI();
			 CS=1;
			 break;
	  case 0x90:
			 Write_SPI(addr,3);
			 for(i=0;i!=2;i++)
			    *(buf+i)=Read_SPI();
			 CS=1;
			 break;
	  case 0xab:
	         Write_SPI(&CMD,1); CS=1;
			 for(i=255;i!=0;i--);
			 break;
	  case 0xd8:
	         addr[0]=(unsigned char)(ADDR>>16);
			 Write_SPI(addr,3); CS=1;
			 break;
	  default: CS=1;break;                   
	}
}
void Delet_Datasheet(void)
{unsigned char temp,i;
 i=0;
 NX25P40_SPI(0x06,0,&i,0,&temp);
 i++; i++; 
 NX25P40_SPI(0xc7,0,&i,0,&temp);
 do{NX25P40_SPI(0x05,0,&i,0,&temp);
 printf("waiting...\r\n");
 }while((temp&0x01)==0x01);
}
unsigned char Write_Datasheet(unsigned long ADDR,unsigned char *var)
{unsigned char temp[32],i,WP;
 WP=0;
 printf("Check before program!\r\n");
 NX25P40_SPI(0x03,ADDR,&i,32,temp);
 for(i=0;i!=32;i++)
    {if(temp[i]!=0xff)
	   {WP=1;break;}
	}
 if(WP==0)
    {printf("Programing...\r\n");
	 NX25P40_SPI(0x06,0,&i,0,&temp);
     i++; i++;
	 NX25P40_SPI(0x02,ADDR,var,32,&i);
	 do{NX25P40_SPI(0x05,0,&i,0,temp);
	 printf("waiting...\r\n");
     }while((temp[0]&0x01)==0x01);
	}
 return WP;
}
void Cancel_Datasheet(unsigned long ADDR)
{unsigned char temp,i,var;
 var=0;
 NX25P40_SPI(0x03,ADDR+1,&i,1,&temp);
 if(temp==0xff)
    {NX25P40_SPI(0x06,0,&i,0,&temp);
	 i++;i++;
	 NX25P40_SPI(0x02,ADDR+1,&var,1,&temp);
	 do{NX25P40_SPI(0x05,0,&i,0,&temp);
	 printf("waiting...\r\n");
     }while((temp&0x01)==0x01);
	}
}
void Read_Datasheet(unsigned long ADDR,unsigned char *var,unsigned char len)
{unsigned char i;
 NX25P40_SPI(0x03,ADDR,&i,len,var);
}
unsigned long* Init_Datasheet(void)
{unsigned char temp[2],i,t,y;
 unsigned long c,buf[2];
 y=t=0;buf[0]=buf[1]=0x40000;
 for(c=0;c!=0x40000;c+=32)
    {NX25P40_SPI(0x03,c,&i,2,temp);
	 printf("The addr is %#lx \r\n",c);
	 printf("The data is %#x %#x\r\n",(unsigned int)temp[0],(unsigned int)temp[1]);
	 if(t==0)
	    {if(temp[1]==0xff){buf[0]=c;t=1;}}
	 if(y==0)
	    {if(temp[0]==0xff){buf[1]=c;y=1;}}
	 if((t==1)&&(y==1)&&(buf[0]<=buf[1]))break;
	}
 return (&buf);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -