你们好:
我用at89s52 晶振是11.059.at24c04 上拉电阻是4.7k SDA与SCL管脚是p2.0与p2.1
能读不能写,以下是我的eeprom基本程序,请各位看看。
void start_i2c(void) //开始总线
{
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();
}
void stop_i2c(void)
{
SDA=0;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
_nop_();_nop_();_nop_();_nop_();
}
void sendB(uchar c)//发送一个字节
{
uchar bit1;
// for(bit1=0;bit1<8;bit1++)
bit1=7;
do
{
SDA=(bit)(c&0x80);
//_nop_();
SCL=1;
c=c<<1;
// _nop_();
SCL=0;
}while(bit1--);
_nop_();_nop_();
SDA=1;
_nop_();
SCL=1;
_nop_();
if(SDA==1)ack=0;
else ack=1;
SCL=0;
_nop_();_nop_();
}
uchar recB(void)
{
uchar rc;
uchar bit1;
bit1=7;
rc=0;
SDA=1;
// for(bit1=0;bit1<8;bit1++)
do
{
rc=rc<<1;
SCL=1;
rc=rc|((unsigned char)(SDA));
}while(bit1--);
SCL=0;
_nop_();_nop_();
return(rc);
}
void ack_i2c(bit a)//应答
{
if(a==0)SDA=0;
else SDA=1;
_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();
}
bit sendbety(uchar ad,uchar sad,uchar *str,uchar val)//发送多字节
{ uchar a;
start_i2c();
sendB(ad);
if(ack==0)return(0);
sendB(sad);
if(ack==0)return(0);
for(a=0;a
{
sendB(*str);
if(ack==0) return(0);
str++;
}
stop_i2c();
return(1);
}
bit recbety(uchar ad,uchar sad,uchar *str,uchar val)
{ uchar a;
start_i2c();
sendB(ad);
if(ack==0) return 0;
sendB(sad);
if(ack==0) return 0;
start_i2c();
sendB(ad+1);
if(ack==0) return 0;
for(a=0;a
{
*str=recB();
ack_i2c(0);
str++;
}
*str=recB();
ack_i2c(1);
stop_i2c();
return(1);
}
LZ你确定能读?
呵呵
是不是读出来是00你就觉得能读了?
读写转化时SDA需要改变方向与数据方向一致, 不知道at89s52是怎么处理的。
[url=http://www.by8.cn/bbs/attachment.php?aid=86425&k=6697da23c5008eba8d65aa70751d70e9&t=1227751245][/url]
嘿嘿,这个是24C02的
不知道合适LZ不
我读出来的数据不全是零。而且at24c04也应答了返回1,出错就返回0。
很有可能你没有加上拉电阻!
在SDA、SCL这里加上拉电阻
上拉电阻我加了。
8楼的老兄你再看一下。我都贴上了