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