本帖最后由 李俊韬 于 2014-12-10 20:06 编辑
1、总线数据传送的模拟:主机可以采用不带I2C总线接口的单片机,如80C51、AT89C2051等单片机,利用软件实现I2C总线的数据传送,即软件与硬件结合的信号模拟。
典型信号模拟:
为了保证数据传送的可靠性,标准的I2C总线的数据传送有严格的时序要求。I2C总线的起始信号、终止信号、发送“0”及发送“1”的模拟时序 :
典型信号模拟子程序:
初始化IIC
void init_IIC()
{
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 ack()
{
uchar i=0;
SCL=1;
delay();
while((SDA==1)&&(i<250)) {
i++;
}
SCL=0;
delay();
}
非应答信号
void noack()
{
SDA=1;
delay();
SCL=1;
delay();
SCL=0;
delay();
}
写一个字节
void Write_Byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0;
delay();
if(dat&0x80)
{
SDA=1;
}
else
{
SDA=0;
}
dat=dat<<1;
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
读一个字节
uchar Read_Byte()
{
uchar i,dat;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
SCL=1;
delay();
dat=dat<<1;
if(SDA)
{
dat++;
}
SCL=0;
delay();
}
return dat;
}
写EEPROM
void Write_IIC(uchar add,uchar dat)
{
start();
Write_Byte(0xa0);
ack();
Write_Byte(add);
ack();
Write_Byte(dat);
ack();
stop();
}
读EEPROM
uchar Read_IIC(uchar add)
{
uchar temp;
start();
Write_Byte(0xa0);
ack();
Write_Byte(add);
ack();
start();
Write_Byte(0xa1);
ack();
temp=Read_Byte();
noack();
stop();
return temp;
}
8uS延时
void delay()
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
2、I2C总线器件的扩展:
(1)、扩展电路:
(2)、串行E2PROM的扩展:
串行E2PROM典型产品:
ATMEL公司的AT24C系列:
AT24C01:128字节(128×8位)
AT24C02:256字节(256×8位)
AT24C04:512字节(512×8位)
AT24C08:1K字节(1K×8位);
AT24C16:2K字节(2K×8位);
写入过程:
AT24C系列E2PROM芯片地址的固定部分为1010,A2、A1、A0引脚接高、低电平后得到确定的3位编码。形成的7位编码即为该器件的地址码。单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为相应,单片机收到应答后就可以传送数据了。传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。
AT24C系列器件片内地址在接收到每一个数据字节地址后自动加1,在芯片的“一次装载字节数”(不同芯片字节数不同)限度内,只需输入首地址。装载字节数超过芯片的“一次装载字节数”时,数据地址将“上卷”,前面的数据将被覆盖。
当要写入的数据传送完后,单片机应发出终止信号以结束写入操作。写入n个字节的数据格式 :
读出过程:
单片机先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。然后,再发一个字节的要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以“非应答”(高电平),并发出终止信号以结束读出操作。
|