作者:潇洒嘉新 | 来源:互联网 | 2024-09-29 16:54
IIC简介IIC,Inter-IntegratedCircuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。I2C总线物理拓扑结构IIC通信原理: 通过对S
IIC简介
- IIC,Inter-Integrated Circuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。
I2C总线物理拓扑结构
IIC通信原理:
通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。
IIC总线特征
IIC总线上的每一个设II备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址,主从设备之间通过这个地址来确定与哪个器件进行通信。通常把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。
IIC总线上可挂接的设备数量受总线的最大电容400pF限制,如果所挂接的是相同型号的器件,还受器件地址位的限制。
C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
IIC总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输.
IIC总线协议
a.起始和结束信号
IIC协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。
起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。
b.数据传输
数据传输以字节为单位。主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,此时才认为一个字节真正的被传输完成。
c.地址指定
IIC总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址基础上的。主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和数据传输的过程一样。大多数从设备的地址是7位的,协议规定再给地址添加一个最低位用来表示数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。
IIC的协议层才是掌握IIC的关键。现在简单概括如下:
a.数据的有效性
在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。
b.起始和结束条件
起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件,结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件,要注意起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。
c.应答
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答
IIC总线操作
大致可分为以下三种操作情况:
a.主设备往从设备中写数据
数据传输格式如下:(数据包括从机寄存器地址和需要写入寄存器的数据data)
(1)主机发起开始信号;
(2)主机发送I2C地址(7位)和写操作0(1位),等待确认;
(3)从机发送确认;
(4)主机发送寄存器地址(8位),等待确认;
(5)从机发送确认;
(6)主机发送数据(8位),即要向寄存器中写入的数据,等待确认;从机发送确认;
(7)主机发起停止。
b.主设备从从设备中读数据
(1)主机发送I2C地址(7位)和写操作0(1位),等待确认;
(2)从机发送确认;主机发送寄存器地址(8位),等待确认;
(3)主机发送开始;主机发送I2C地址(7位)和读操作(1位),等待确认;
(4)从机发送确认;从机发送数据(8位)。
(5)主机发送确认。
c.主设备连续往从设备读写
主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。这种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率
常用代码
任一地址读取数据格式
void init() //初始化
{
SCL=1;
delay();
SDA=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 respons() //回应信号
{
uchar i=0;SCL=1;delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}
void writebyte(uchar date)// 写一个字节
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
任一地址写入数据格式
uchar readbyte()
//读一个字节
{
uchar i,j,k;
SCL=0;
delay();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay();
if(SDA==1)
j=1;
else
j=0;
k=(k<<1)|j;
SCL=0;
delay();
}
delay();
return k;
}
Void write_add(uchar address,
uchar info)
//指定地址写一个字节数据
{
start();
writebyte(0xa0);
respons();
writebyte(address);
respons();
writebyte(info);
respons();
stop();
}
uchar read_add(uchar address)
//指定地址读一个字节数据
{
uchar dd;
start();
writebyte(0xa0);
respons();
writebyte(address);
respons();
start();
writebyte(0xa1);
respons();
dd=readbyte();
stop();
return dd;
}
南昌理工学院人工智能学院特种机器人研发中心实验室workshop项目实践平台