电路:
最简单粗暴的:
//管脚定义
sbit fwcs =P1^7;
sbit fwsck =P5^4;
sbit fwsi =P5^5;
sbit fwso =P1^6;
//spi模拟写
void w25wspi(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
if(dat & 0x80)
{
fwso=1;
}
else
{
fwso=0;
}
fwsck=1;
dat=dat<<1;
fwsck=0;
}
fwso=1;
fwsck=0;
}
//spi模拟读
uchar w25rspi()
{
uchar i;
uchar rs;
for(i=0;i<8;i++)
{
fwsck=0;
rs=rs<<1;
if(fwsi)
rs=rs | 1;
fwsck=1;
}
fwsck=0;
return rs;
}
//双倍速读
uchar w25frspi()
{
uchar i;
uchar rs;
for(i=0;i<4;i++)
{
rs=rs<<2;
fwsck=0;
if(fwsi)
rs=rs | 0x02;
if(fwso)
rs=rs | 0x01;
fwsck=1;
}
fwso=1;
fwsck=0;
return rs;
}
//读取状态寄存器1
uchar readrs1()
{
uchar rs;
fwcs=0;
w25wspi(ReadStatusRegister1);
rs=w25rspi();
fwcs=1;
return rs;
}
//读取状态寄存器2
uchar readrs2()
{
uchar rs;
fwcs=0;
w25wspi(ReadStatusRegister2);
rs=w25rspi();
fwcs=1;
return rs;
}
//读取状态寄存器3
uchar readrs3()
{
uchar rs;
fwcs=0;
w25wspi(ReadStatusRegister3);
rs=w25rspi();
fwcs=1;
return rs;
}
//初始化
void init_w25q128()
{
int i,j;
P1M1 = 0xC0; //开漏 1.6 、1.7
P1M0 = 0xC0; //开漏
P5M1 = 0x30; //开漏 5.4 、5.5
P5M0 = 0x30; //开漏
fwcs=1;
fwso=1;
fwsck=0;
//fwrst=1;
for(j=0;j<200;j++)
{
for(i=0;i<200;i++);
}
reset_w25q128();
}
//复位w25q128
void reset_w25