打印

I2C通信问题

[复制链接]
1261|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sinadz|  楼主 | 2012-10-9 23:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机控制EEPROM,哪位大神帮忙看i2c通信错在哪里了
#include <reg52.h>
#define uchar unsigned char
sbit scl=P3^0;
sbit sda=P3^1;
void delay();
void delayl(uchar times);
void start();
void stop();
void tack();
void nack();
void ack();
void write(uchar date);
uchar read();
void writeadd(uchar address,uchar date);
uchar readadd(uchar address);
void delay()
{
;
;
}
void delayl(uchar times)
{
uchar x,y;
for(x=times;x>0;x--)
for(y=110;y>0;y--);
}
void start()
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
scl=0;
delay();

}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
scl=0;
delay();

}
void tack()
{


scl=1;
delay();
scl=0;
delay();


}
void nack()
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}
void ack()
{
sda=0;
delay();
scl=1;
delay();
scl=0;
delay();
}
void write(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
}
uchar read()
{
uchar temp,i,k;
for(i=0;i<8;i++)
{
scl=1;
delay();
if(sda==1)
k=1;
else
k=0;
temp=(temp<<1)+k;
scl=0;
delay();
}
return temp;
}
void writeadd(uchar address ,uchar date)
{
start();
write(0xae);
tack();
write(address);
tack();
write(date);
tack();
stop();


}
uchar readadd(uchar address)
{
uchar date;
start();
write(0xae);
tack();
write(address);
tack();
start();
write(0xaf);
tack();
date=read();
nack();
stop();
return date;
}
void main()
{
scl=1;
sda=1;
writeadd(0x00,0xfe);
delayl(1000);
P1=readadd(0x00);
while(1);
}

相关帖子

沙发
无冕之王| | 2012-10-9 23:39 | 只看该作者
代码太长了,实在是没耐性看完

使用特权

评论回复
板凳
hsbjb| | 2012-10-9 23:57 | 只看该作者
相当长啊
1.加2个上拉电阻看看
2.tack()如果没有ACK则要及时返回,不要继续读写了
3. 你要看看你的EEPROM到底是不是8位地址的即容量有没有超过256字节
4. 确定器件地址是0xae.这个地方就不对,读写不会都是0XAE的

使用特权

评论回复
地板
lagogo2012| | 2012-10-10 22:57 | 只看该作者
太长了,实在没耐心看完,能否挑重点分析啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

304

主题

2313

帖子

0

粉丝