I
1 I
1.1 I
I
I
每个接到I
1.2 I
一、数据位的有效性规定
I
二、起始和终止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。连接到I
三、数据传送格式
(1)字节传送与应答
每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
(2)数据帧格式
I
a、主机向从机发送数据,数据传送方向在整个传送过程中不变:
b、主机在第一个字节后,立即从从机读数据
c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。
注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。
A表示应答, A非表示非应答(高电平)。S表示起始信号,P表示终止信号。
四、总线的寻址
I
(1)寻址字节的位定义
D7~D1位组成从机的地址。D0位是数据传送方向位,为“
2
2.1 总线数据传送的模拟
主机可以采用不带I
一、典型信号模拟
为了保证数据传送的可靠性,标准的I
初始化IIC
void init_IIC()
{ SDA=1;
delay();
SCL=1;
delay();
}(1)起始信号
void start()
{ SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}(2)终止信号
void stop()
{ SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
(3)应答信号
void ack()
{ uchar i=0;
SCL=1;
delay();
while((SDA==1)&&(i<250)) {
i++;
}
SCL=0;
delay();
}
(4)非应答信号
void noack()
{ SDA=1;
delay();
SCL=1;
delay();
SCL=0;
delay();
}
(5)写一个字节
void Write_Byte(uchar dat)
{ uchar i;
for(i=0;i<8;i++)
{ SCL=0;
delay();
if(dat&0x80)
else
dat=dat<<1;
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
(6)读一个字节
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;
}
(7)写EEPROM
void Write_IIC(uchar add,uchar dat)
{ start();
Write_Byte(0xa0);
ack();
Write_Byte(add);
ack();
Write_Byte(dat);
ack();
stop();
}
(8)读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;
}
(9)8uS延时
void delay()
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
2.2 I
一、扩展电路
二、串行E2PROM的扩展 (1)写入过程
AT
单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为相应,单片机收到应答后就可以传送数据了。
传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。
AT
当要写入的数据传送完后,单片机应发出终止信号以结束写入操作。写入n个字节的数据格式 :
(3)读出过程 单片机先发送该器件的7位地址码和写方向位“
移位操作
联系客服