iic协议

本文深入解析了IIC总线通信原理,包括其物理拓扑结构、通信协议、数据传输方式及操作流程。介绍了IIC总线如何通过SCL和SDA线控制时序进行数据传递,并详细阐述了起始、结束信号、数据传输和地址指定的过程。同时,提供了实用的代码示例,帮助读者理解IIC总线的编程实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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项目实践平台

### IIC协议的工作原理 IIC(Inter-Integrated Circuit)是一种用于于短距离通信的同步串行总线协议,广泛应用于嵌入式系统中的芯片间通信。以下是其工作原理的关键点: #### 1. 总线结构 IIC协议使用两条主要线路进行通信: - **SCL (Serial Clock Line)**:时钟信号线,由主设备控制,用于同步数据传输。 - **SDA (Serial Data Line)**:数据信号线,用于在主设备和从设备之间传递数据。 这两条线均需上拉电阻连接至电源电压,以确保默认状态为高电平[^4]。 --- #### 2. 数据帧格式 每个字节的数据传输遵循固定的格式: - 每次传输一个字节(8位),高位优先。 - 字节之后跟随一个应答位(ACK/NACK)。 具体流程如下: - 主设备发起START条件,通知从设备即将开始通信。 - 发送地址帧(7位地址+1位读/写标志)并等待从设备返回ACK。 - 进行数据交换(单向或多向)。 - 结束时发送STOP条件,释放总线[^3]。 --- #### 3. 应答机制 - **ACK**:当接收方成功接收到数据后,会将SDA线拉低作为确认信号。 - **NACK**:如果接收方无法处理当前数据或无需进一步操作,则保持SDA为高电平。 这种机制可以有效检测错误并协调双方的速度差异[^3]。 --- #### 4. 通信模式 根据速率和支持功能的不同,IIC定义了几种传输模式: | 模式名称 | 最大波特率 | 方向 | |------------------|--------------|------------| | 标准模式 | 100 kbps | 双向 | | 快速模式 | 400 kbps | 双向 | | 快速模式 Plus | 1 Mbps | 双向 | | 超级快速模式 | 5 Mbps | 单向 | 不同模式之间的兼容性取决于具体的实现需求[^5]。 --- #### 5. 实现细节 以下是一个典型的主机接收过程代码示例,展示了如何利用IIC协议完成数据获取: ```c u8 IIC_Read_Byte(u8 ack) { u8 i, receive = 0; // 将SDA设置为输入模式 IIC_SDA_IN(); for (i = 0; i < 8; i++) { SCL = 0; // 下降沿触发 delay_us(2); SCL = 1; // 上升沿采样 delay_us(2); receive <<= 1; // 移动已接收位 if (Read_Sda()) { // 如果SDA为高电平 receive++; } } if (!ack) { IIC_NAck(); // 不发送应答 } else { IIC_Ack(); // 发送应答 } return receive; } ``` 此函数实现了逐位读取的功能,并依据参数决定是否发出应答信号[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值