请教,24C02 能写进去,但读不出来? 如题,能写 24C02(模拟里看到),但读出来是一串0.
代码如下:复制内容到剪贴板代码:#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ID 0xa0
#define NOP _nop_;_nop_;_nop_;_nop_;_nop_;
sbit WP =P3^7;
sbit SCL=P3^6;
sbit SDA=P2^7;
void delay(uint z)
{
uint x,y;
for (x=z;x>0;x--)
{
for (y=110;y>0;y--)
{
;
}
}
}
void Start()
{
// 发送开始信号 时钟线保持高电平期间,数据线从高到低跳变
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
void Stop()
{
// 停止 时钟保持高电平期间,数据电平从低到高跳变
SCL=0;
SDA=0;
SCL=1;
SDA=1;
}
void Write_byte(uchar dat) //写字节。
{
uchar i,temp;
temp=dat;
for (i=0;i<8;i++)
{
SCL=0;
if ((temp&0x80)==0x80)
{
SDA=1;
}
else
{
SDA=0;;
}
SCL=1;
temp=temp<<1;
NOP;
}
SCL=0;
}
void Wait4Ack() //等待应答
{
uchar i=0;
SCL=1;
while ( (SDA==1) && (i<20) )
{
i++;
}
SDA=0;
SCL=0;
}
void SendNoAck() //发送一个不应答
{
SDA=1;
SCL=1;
SCL=0;
}
void Write(uchar address,uchar dat)
{
Start();
Write_byte(ID);
Wait4Ack();
Write_byte(address);
Wait4Ack();
Write_byte(dat);
Wait4Ack();
Stop();
NOP;
}
uchar Read_byte()
{
uchar i,dat=0;
for (i=0;i<8;i++)
{
SCL=1;
dat=dat<<1;
dat=dat|((uchar)(SDA));
SCL=0;
}
return(dat);
}
uchar Read(uchar address)
{
uchar dat;
Start();
Write_byte(ID); //写器件地址 0xa0
Wait4Ack(); //等待应答
Write_byte(address); //写要读的地址
Wait4Ack(); //等待应答
Start(); //重新开始
Write_byte(ID|0x01);//写器件地址,指明要读 (0xa1)
Wait4Ack(); //等待应答 <---这里出问题,怎么都不应答。
dat=Read_byte();
SendNoAck();
Stop();
return(dat);
}
void main()
{
uchar DATA;
WP=0;
P1=0xf0;
Write(0xf0,0xAB); //在0xf0 写入一个 0xAB;
delay(20);
NOP;
DATA=Read(0xf0); // 读 0xf0,给 DATA
P1=DATA; // 按 DATA 点亮 P1。
while(1);
}
通过调试,发现能正常写入,但读出时碰到器件不响应问题。
这是怎么回事,应该如何解决? |