打印

请各位大侠看看我关于IIC扩展EEPROM程序的问题

[复制链接]
1960|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hedge31|  楼主 | 2009-9-5 21:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hedge31 于 2009-9-5 21:09 编辑

#include <reg52.H>
#include <intrins.h>
#define uchar unsigned char
sbit sda=P3^6;//数据线设置为P3^6脚
sbit scl=P3^7;//时钟线设置为P3^7脚
void delay()
{
   _nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();
}

void init()
{
sda=1;
delay();
scl=1;
delay();
}

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

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

void ask(bit i)
{
sda=i;
delay();
scl=1;
delay();
scl=0;
}

void writebyte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
  scl=0;
  _nop_();
  _nop_();
  _nop_();
  temp<<=1;
  sda=CY;
  delay();
  scl=1;
  delay();
}
scl=0;
}

unsigned char readbyte(void)
{
uchar i,tmp;
tmp=0;
for(i=0;i<8;i++)
{
  scl=0;
  _nop_();
  _nop_();
  _nop_();
  sda=1;
  delay();
  scl=1;
  delay();
  tmp<<=1;
  if(sda==1)
    tmp++;
}
scl=0;
return tmp;

}
void write_add(uchar add,uchar info)
{
start();
writebyte(0xa0);
ask(0);
writebyte(add);
ask(0);
writebyte(info);
ask(1);
stop();
}

uchar read_add(uchar add)
{
uchar dd;
start();
writebyte(0xa0);
ask(0);
writebyte(add);
ask(1);
start();
writebyte(0xa1);
ask(0);
dd=readbyte();
delay();
stop();
return dd;
}

void main()
{
init();
start();
writebyte(0xa0);
ask(0);
writebyte(0x34);
ask(0);
writebyte(0x24);
ask(1);
stop();

start();
writebyte(0xa0);
ask(0);
writebyte(0x34);
ask(1);
stop();

start();
   writebyte(0xa1);
ask(0);
P0=readbyte();//LED灯管用P0口控制
stop();
}



下载到实验板 发现最后返回的数据总是0xff。 请各位高手指点指点 不胜感激

相关帖子

沙发
sangreal| | 2009-9-6 15:06 | 只看该作者
是要用单片机io(主机)模拟i2c时序读写外部eeprom(从机)吗?个人觉得你的时序处理上有问题~
写操作时第9个scl的应答处理,是由从机完成的,ask子程序在读一字节后应用是对的(主机应答),写操作时不能这样处理,主机写完一字节释放sda,再给一个scl,检测从机应答就行了。writebyte和下边的几个函数都需要修改下~

使用特权

评论回复
板凳
hedge31|  楼主 | 2009-9-6 22:02 | 只看该作者
既然是从机应答。。是不是可以把写操作的应答给去掉而换为
scl=0;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();


把这段放到写操作?

使用特权

评论回复
地板
sangreal| | 2009-9-7 15:13 | 只看该作者
既然是从机应答。。是不是可以把写操作的应答给去掉而换为
scl=0;
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();

把这段放到写操作?

hedge31 发表于 2009-9-6 22:02

这个用来产生第九个scl,时序上是对的,可以再加入sda的判别,若为低,从机应答正确,若为高,从机应答错误,做相应的处理。网上有很多样板程序,参考下就更容易理解了~

使用特权

评论回复
5
cqhtk| | 2009-9-8 09:41 | 只看该作者
:D

使用特权

评论回复
6
hedge31|  楼主 | 2009-9-8 19:49 | 只看该作者
谢谢大侠指点!~~

使用特权

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

本版积分规则

1

主题

3

帖子

1

粉丝