📄 nx25p40.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 + -