版主,你好,我也遇到了你以前遇到的类似问题。
我用io模拟SPI接口,操作AT45DB161D,能够读取状态,也能读取ID,
但是写BUF,读BUF就会出现错误,读出的全是FF,折腾两天了没出来,希望版主帮忙,小弟不胜感激!具体代码见下面:
//*****************************************************
void Wat45_byte(unsigned char x)
{
//----这种使用循环与位运算的实现方式,速度要比直接用位寻址与顺序执行方式实现慢得多
// ----因为它把大部分的时间花在了循环因子的递增、比较与位运行上了
unsigned char i=0;
for(i=0;i<8;i++)
{
SPI_SCL=0;
// SPI_SI=;
if((x&(0x80>>i)) != 0)
SPI_SI = 1;
else
SPI_SI = 0;
SPI_SCL=1;
}
}
//******************************************************
unsigned char Rat45_byte()
{
//----这种使用循环与位运算的实现方式,速度要比直接用位寻址与顺序执行方式实现慢得多
//----因为它把大部分的时间花在了循环因子的递增、比较与位运行上了
unsigned char i=0,temp=0;
SPI_SO=1;
for(i=0;i<8;i++)
{
SPI_SCL=1;
SPI_SCL=0;
if(SPI_SO) temp|=0x80>>i;
}
return temp;
}
//******************************************************
unsigned char Rat45_status()
{
unsigned char status;
at45_cs = 0; //片选打开
delayus(10);
Wat45_byte(0xd7); //D7H是读取状态的命令字
status = Rat45_byte(); //读取状态字节
at45_cs = 1; //片选关闭
delayus(10);
return status;
}
//******************************************************
void Rat45_ID(void)
{
at45_cs = 0; //片选打开
delayus(10);
Wat45_byte(0x9F); //9fH是读ID
buf[1] = Rat45_byte(); //读取状态字节
buf[2] = Rat45_byte(); //读取状态字节
buf[3] = Rat45_byte(); //读取状态字节
buf[4] = Rat45_byte(); //读取状态字节
at45_cs = 1; //片选关闭
delayus(10);
}
//********************************************************
void Rat45_buf(void)
{
unsigned int i;
while(!(Rat45_status()& 0x80 )); //判断是否忙
at45_cs = 0; //片选打开
//Wat45_byte(0xD6); //读缓冲区2指令字
Wat45_byte(0xD1); //读缓冲区1指令字
Wat45_byte(0x00); //从0开始
Wat45_byte(0x00);
Wat45_byte(0x00);
for (i=0;i<100;i++)
{
buf = Rat45_byte();
}
at45_cs = 1;
delay(1);
}
//********************************************************
void Wat45_buf(void)
{
unsigned int i;
while(!(Rat45_status()& 0x80 )); //判断是否忙
at45_cs = 0; //片选打开
// Wat45_byte(0x87); //写缓冲区2指令字
Wat45_byte(0x84); //写缓冲区1指令字
Wat45_byte(0x00); //从0开始
Wat45_byte(0x00);
Wat45_byte(0x00);
for (i=0;i<100;i++)
{
Wat45_byte(buf);
}
at45_cs = 1; //片选关闭
delayus(10);
}
void t_data (int temp)
{
SBUF = temp;
while (TI == 0)
{}
TI = 0;
}
int r_data()
{int temp;
temp = SBUF;
while(RI == 0);
{}
RI = 0;
return temp;
}
void t_buf(unsigned char count)
{
unsigned char i;
for(i=0;i < count;i++)
{
t_data(buf);
delay(25);
}
}
//********************************************************
void uart_init (void)
{
IE=0x00; // 禁止所有中断
SCON=0x50; // 串口工作方式1,即10位异步收发器(8位数据),波特率可变
TMOD|=0x20; // 定时器1:工作方式2(8位自动重装定时/计数器)
PCON|=0xC0; // SMOD=1,即波特率提高一倍
TH1=0xFA; // 晶振频率为11.0592MHz时,波特率为9600
TR1=1; // 启动定时器/计数器1
}
void main (void)
{
unsigned char i;
uart_init();
//at45db_init();
P1M0 = 0x00;
P1M1 = 0x00;
delay(1000);
for(i=0;i<100;i++)
{
buf = i;
}
t_buf(100);
delay(500);
t_data(0x11);
t_data(Rat45_status());
t_data(0x11);
delay(100);
Rat45_ID();
t_buf(10);
t_data(0x22);
t_data(Rat45_status());
t_data(0x22);
delay(100);
Wat45_buf();
t_data(0x33);
t_data(Rat45_status());
t_data(0x33);
delay(100);
Rat45_buf();
t_buf(20);
while(1)
{}
} |