关于I2C总线的探索初步

现在才知道I2C是一个协议,而不是一种硬件,实现方法除了硬件支持,竟可以软件模拟,这可能与硬件虚拟技术有一些相似点吧,不同的脉冲序列作为指示信号:起始信号,终止信号,应答信号,非应答信号,应答位检查,写数据,读数据。这个协议实现了一主多从控制,就是软件模拟的过程看起来挺复杂的。。。对协议很不熟悉,很多地方只能照抄例程::以下是51单片机读写AT24C02的EEPROM的历程结构,同时也突出感觉到结构化程序设计方法的清晰化帮助,这是解放人的大脑复杂度不足的缺陷的制约:

 

 

 

#include<reg52.h>
#define writedeviceaddress 0xa0
#define readdeviceaddress 0xa1
sbit SCL=P3^7;
sbit SDA=P3^6;
sbit DOG=P0^0;
void delayms(int);

 


void start()
{

SDA=1;
delayms(1);
SCL=1;
delayms(1);
SDA=0;
delayms(1);
SCL=0;
delayms(1);

}

 


void delayms(int number)
{
unsigned char temp;
for(;number!=0;number--,DOG=!DOG);
   {
    for(temp=112;temp!=0;temp--){}
   }
}

 


void stop()
{
SCL=0;
delayms(1);
SDA=0;
delayms(1);
SCL=1;
delayms(1);
SDA=1;
delayms(1);

}

 

 


void ans()
{
SDA=0;
delayms(1);
SCL=1;
delayms(1);
SCL=0;
delayms(1);
SDA=1;
delayms(1);
}

 

 

void no_ans()
{
SDA=1;
delayms(1);
SCL=1;
delayms(1);
SCL=0;
delayms(1);
}

 

 

 

bit test_ans()
{
bit errorbit;
SDA=1;
delayms(1);
SCL=1;
delayms(1);
errorbit=SDA;
delayms(1);
SCL=0;
delayms(1);
return(errorbit);

}

 

 


bit write8(unsigned char input)
{

unsigned char temp;
for(temp=8;temp!=0;temp--)
 {
  SDA=(bit)(input&0x80);
  delayms(1);
  SCL=1;
  delayms(1);
  SCL=0;
  delayms(1);
  input=input<<1;
 }
return 1;
}

 

 

 

unsigned char read8()
{
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp--)
 {
 

  SCL=1;
delayms(1);
rbyte=rbyte<<1;
delayms(1);
rbyte=rbyte|((unsigned char)(SDA));
SCL=0;
delayms(1);

 }

return(rbyte);

}

 

void writei2c(unsigned char *wdata,unsigned char romaddress,unsigned char number)
{

 

 

start();
write8(writedeviceaddress);
test_ans();
write8(romaddress);
test_ans();
for(;number!=0;number--)
{
  write8(*wdata);
  test_ans();
  wdata++;

}

 


stop();
delayms(1);
}

 

 


void readi2c(unsigned char *ramaddress,unsigned char romaddress,unsigned char bytes)
{
start();
write8(writedeviceaddress);
test_ans();
write8(romaddress);
test_ans();
start();
write8(readdeviceaddress);
test_ans();
while(bytes!=1)
{
*ramaddress=read8();
ans();
ramaddress++;
bytes--;
}
*ramaddress=read8();
no_ans();
stop();

 


}

 


void main()
{


unsigned char writebyte[8]={0xc0,0x34,0x12,0x11,0x22,0x01,0x00,0x00};
unsigned char readbyte[8];
unsigned char *addw;
unsigned char *addr;
unsigned char i;
unsigned char ok=0;
bit write=1;
DOG=0;
while(1)
  {
  if(write==1)
   {
    addw=writebyte;
addr=readbyte;
writei2c(addw,0x00,8);
readi2c(addr,0x00,8);
for(i=0;i<8;i++)
     {
      if(writebyte[i]==readbyte[i])
        {
         ok++;      
        }
     }
     if(ok==8)
       {
        DOG=1;
       }
      else
       {
        DOG=0;
       }
      write=0;
   }
  }


}

 

 

 

 

 

 

今天又跟着郭天祥的视频写了一下写入读取AT24C02的存储器程序,利用IIC总线协议,可是没有成功,感到没有时序电路的底子,学起来不理解,很吃力,尤其没有足够的知识根据用法来推断其结构,这大大增加了学习难度。2010年4月27日23:09:09

 

 

 

 

 

2010年5月17日23:58:12,到今天为止,已经学习了触发器的基本原理,结合昨天的该协议内容,基本明白了IIc协议的使用方法,特点就是:接口简单,容易实现。下一步,感觉有了这个较简单协议的基础,学习其他协议内容或者通信方法,就相对容易多了。

 

特别是对AD的时序用法有了明显的促进作用,以便完成电子制作。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值