概念
I2C总线只有两根双向信号线,一根是数据线 SDA,另一根是时钟线SCL。他是一种同步串行半双工通信总线方式。该总线允许同时连接多个设备(芯片)。每块芯片在总线上拥有特定的地址。其优点是通信速率快,器件封装小。

流程
IIC的发送数据流程如下:
在SCL时钟处于高电平的时候,SDA发送一个低电平(起始位),从而其他设备停止发送数据,进入聆听状态,然后主设备发送7位从机地址以及一位数据方向地址,其中方向地址为1时主机接收数据,为0时发送数据,在时钟位为低电平时,数据线才能产生电位变化(假如发送0010,发送到第二个0时,要发送第三个数字时,必须等到时钟线为低)。发送完一帧数据后(8位数据,先发MSB,再发LSB)必须再发送一位应答位,若应答(0),则可以继续发送或发送一位中止信号停止发送,若无应答(保持1),则发送一位中止信号。中止信号为高电平,必须在SCL高电位下才能更改。
电位变化:
SDA发送内容:

配制
IIC通信是通过主芯片外接AT24C02芯片实现的,AT24C02芯片引脚如图:
不同的开发板使用不同的引脚链接AT24C02的SCL和SDA引脚,按操作手册来配制,以S3C2440ARM为例:
通过看原理图得知SCL的引脚链接的是GPE14引脚:
翻阅S3C2440手册,得知IIC要配制GPE引脚(GPECON寄存器)、IICCON寄存器、INTMOD/INTMSK中断寄存器
GPE引脚使用14、15,按手册给相应的位赋值,
按需要功能配制IICCON:
中断INTMOD为:
中断INTMSK为:
按图表与功能配制代码如下:
功能为:允许ACK应答,中断使能,IIC时钟分频为512,发送时钟分频因子0+1=10,允许IIC中断
编写代码
中断辅助函数
手册要求在每次发送接收完毕后,IICCON第4位必须清零,所以要编写一个手动清零函数:
int a=0;
void icc_handleer(void)//IIC控制器会在收到和发送完ACK之后产生中断,从而引用该函数
{
a=1;
}
......
void do_and_wait_ask()
{
a=0;
IICCON &=~(0x01<<4);
while(a==0)
{
delay(4000);//等待AT24c20写入或输出数据
}
}
写函数
向AT24C20写入数据,从而使其发送给从设备
slvAddr:从设备地址
读函数
向AT24C20读取数据,从而使主设备接收