首页 > 其他分享 >IIC通信协议

IIC通信协议

时间:2024-07-06 17:26:24浏览次数:16  
标签:SCL 高电平 主机 通信协议 低电平 从机 SDA IIC

一、IIC(Inter-Integrated Circuit)通信的基本概念:

硬件结构:

  • 只需要两根线:SCL(串行时钟线)和SDA(串行数据线)
  • 可以连接多个设备,每个设备都有唯一的地址(7bit)
    iic连接图

通信原理:

  • 主从通信:一个主设备,多个从设备
  • 同步通信:由SCL线提供时钟信号
  • 串行、半双工:数据可以双向传输,但同一时刻只能单向

基本通信过程:

  • 起始条件:主设备发送
  • 地址帧:选择要通信的从设备
  • 数据帧:传输实际数据
  • 停止条件:主设备发送

二、IIC总线的基础知识

  • IIC上的设备既可以作为主机使用,又可以作为从机使用,同一时刻只能有一个主机。
  • 发起通信的设备为主机,接受通信的设备为从机
  • 主机可以发起和结束一次通信,而从机只能被主机呼叫。
  • 总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁功能来防止错误产生。(谁先发起起始信号,谁就拥有总线通信权,直到停止信号发起)
  • IIC总线上的设备都有自己唯一一个地址(7bit)
  • 总线上增加和去除设备,不会影响其他设备工作。
  • 发送数据的设备为发送器,接收数据的器件为接收器。

三、IIC总线的通信过程

  1. 主机发送起始信号启用总线
  静默状态:SDA为高电平、SCL为低电平。
  起始信号的产生:SCL为高电平时、SDA由高变低,即为起始信号。(下降沿)
  
  起始信号产生后,总线处于占用状态,不接受其他的主机发起起始信号。

在这里插入图片描述

  1. 主机发送一个字节数据指明从机地址和数据的传送方向
一个字节8bit
数据格式 = 7bit从机地址 + 1bit读写位(从从机读数据:1,给从机写数据:0)。
可以理解为:  data = 7bit从机地址 | 读写位(0x01:主机读数据。0x00主机发送数据)。

例1:
从机地址为0x78,需要从从机获取数据。
0x78 = 0111 1000
0x01 = 0000 0001
或运算后:
data = 0111 1001
发送的数据为:0x79


例2:
从机地址为0x34,需要给从机发数据。
0x34 = 0011 0100
0x00 = 0000 0000
或运算后:
data = 0011 0100
发送的数据为:0x34

在这里插入图片描述

  1. 被寻址的从机发送应答信号回应主机
从机收到地址后,跟自身的地址进行比对,如果是自己的地址,就会识别最后一个读写位。

从机校验完地址后,向主机发送一个应答信号 0(ACK),表示接收到了主机建立通信的请求。
  1. 发送器发送一个字节数据
IIC总线通信时,每个字节为 8 bit长度,数据传送时,先传最高位,后传低位。

例如:发送的数据为 0x34
0x34  =  0   0   1   1     0   1   0   0
         D7  D6  D5  D4    D3  D2  D1  D0
         
数据从 D7 -> D0  依次发送出去。

逻辑 1 : SCL为高电平时,SDA为高电平,表示逻辑 1。
逻辑 0 : SCL为高电平时,SDA为低电平,表示逻辑 0。


在单片机处理中
当SCL为低电平时,可以对SDA高低电平进行设置。
当SCL为高电平时,不可以对SDA电平进行设置了,因为这个时候在读数据。

在这里插入图片描述

  1. 接收器发送应答信号回应发送器
从机收到数据后,向主机发送1个数据位。(0 / 1)

0 : 表示从机收到信息。(ACK)
1 : 表示从机没有收到信息。(NACK)
  1. 循环步骤4、5。

  2. 通信完成后主机发送停止信号释放总线。

停止信号的产生:SCL为高电平时,SDA由低变高表示停止信号。(上升沿)

停止信号产生后,总线处于空闲状态,允许所有主机发起起始信号,谁最快发起谁占用。

在这里插入图片描述

四、IIC的典型时序

  1. 主机向从机发数据(发送一个数据后停止通信)

例如:从机地址为 0x34,需要发送的数据为0x78。

通信过程如下:

1、主机发送起始信号:0                              //SCL为高电平时,SDA为低电平。
2、主机发送地址和读写位: 0x34 == (0x34 | 0x00)     //0x34是地址   0x00是主机向从机发数据
3、从机收到地址和读写位后向主机回复ACK    ACK == 0  //SCL为高电平时,SDA为低电平
4、主机收到ACK后向从机发送数据:0x78               //从高位向低位发送
5、从机收到数据后回复ACK:               ACK == 0 //SCL为高电平时,SDA为低电平
6、主机收到ACK后停止通信: 主机发送停止位          //SCL为高电平时,SDA为高电平
  1. 从机向主机发数据

例如:从机地址为0x54,主机主动向从机获取数据,数据为0x88。

通信过程如下:

1、主机发送起始信号:0                              //SCL为高电平时,SDA为低电平
2、主机向从机发送地址和读写位:0x55 == (0x54 | 0x01) //0x54是从机地址,0x01是主机向从机读数据
3、从机收到后回复ACK:0                              //SCL为高电平时,SDA为低电平
4、从机向主机发送数据:0x88                         //数据为0x88
5、主机收到后回复ACK                               //SCL为高电平时,SDA为低电平
   如果从机不想继续接收可以恢复NACK                 //SCL为高电平时,SDA为高电平
6、主机发起停止信号:1                             //SCL为高电平时,SDA为高电平
  1. 主机向从机发数据后,从机向主机发数据

例如:主机想要获取从机存储的数据0x88,这个数据存在于从机内存中0x11这个地址中,从机本身的IIC通信地址为0x56。

通信过程如下:

1、主机发送起始信号:0                               //SCL为高电平时,SDA为低电平
2、主机向从机发送地址和读写位:0x56 == (0x56 | 0x00) //0x56是从机地址,0x00是主机向从机发送数据
3、从机收到地址后回复ACK:0                         //SCL为高电平时,SDA为低电平
4、主机向从机发送从机的内存地址:0x11                //从机内容地址为0x11
5、从机收到后回复ACK:0                             //SCL为高电平时,SDA为低电平
6、主机向从机发送地址和读写位:0x57 == (0x56 | 0x01) //从机地址为0x56,从从机读取数据是0x01
7、从机收到后回复ACK:0                             //SCL为高电平时,SDA为低电平
8、从机向主机发送数据:0x88                         //从机地址为0x11这个内容存储的数据为0x88
9、主机收到后回复ACK:0                             //SCL为高电平时,SDA为低电平
   主机如果不想继续接收了可以回复NACK:1             //SCL为高电平时,SDA为高电平
10、主机发起停止信号:1                             //SCL为高电平时,SDA为高电平

标签:SCL,高电平,主机,通信协议,低电平,从机,SDA,IIC
From: https://blog.csdn.net/originab/article/details/140173348

相关文章

  • 树莓派学习笔记18:IIC驱动_PCA9685(16路舵机驱动模块)
    今日继续学习树莓派4B4G:(RaspberryPi,简称RPi或RasPi)本人所用树莓派4B装载的系统与版本如下: 版本可用命令(lsb_release-a)查询:​​ Python版本3.7.3:​​ IIC驱动_PCA9685(16路舵机驱动模块)文章提供测试代码讲解,整体代码贴出、测试效果图目录 开启树......
  • 通信协议 | 一文搞懂SPI通信协议
    SPI的英文全称为SerialPeripheralInterface,顾名思义为串行外设接口。SPI是一种同步串行通信接口规范,主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发,后发展成了行业规范。SPI是一种高速的、全双工的、同步的通信总线,并且至多仅需使用......
  • 悟空派 & 香橙派驱动0.9英寸OLED(IIC)
    悟空派&香橙派驱动0.9寸OLED(IIC)前言​在linux核心板中,一般会引出许多GPIO引脚,方便开发者使用这些GPIO进行额外开发。在本文中使用IIC端口,驱动0.9寸OLED屏幕,显示远程SSH端口,以及CPU当前温度以及更多主板相关信息。1.开启IIC端口​在命令行输入:#具体文件根据自己系......
  • IIC驱动-基于EEPROM存储芯片AT24C02模块和三合一环境传感器AP3216C
    本文将基于IIC协议编写EEPROM芯片AT24C02存储芯片的IIC驱动程序,本文内容将分为三个部分:imx6ull的IIC控制器介绍,AT24C02存储芯片介绍,IIC的Linux驱动程序编写。关于IIC协议的内容与介绍这里不展开,相关资料很多,可以自行去查阅,但是这里需要注意的是,IIC协议本身就是一个协议,只是一些基......
  • HC32L130/HC32L136开发之软件模拟IIC驱动AT24C64
    一、AT24C64电路图二、程序编码1.定义I2C总线连接的GPIO端口/*定义I2C总线连接的GPIO端口,用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚*/#defineRCC_I2C_PORT   SysctrlPeripheralGpio      /*GPIO端口时钟*/#definePORT_I2C_SCL  ......
  • Linux驱动开发笔记(九)IIC子系统及其驱动
    文章目录前言一、IIC驱动框架二、总线驱动2.1iic总线的运行机制2.2重要数据结构2.2.1i2c_driver结构体2.2.2i2c总线结构体2.3匹配规则三、设备树的修改四、设备驱动的编写4.1相关API函数4.1.1i2c_add_adapter()4.1.2i2c_register_driver()4.1.3i2c_transfer......
  • 通讯协议大全(UART,RS485,SPI,IIC)
    参考自: 常见的通讯协议总结(USART、IIC、SPI、485、CAN)-CSDN博客UART那么好用,为什么单片机还需要I2C和SPI?_哔哩哔哩_bilibili5分钟看懂!串口RS232RS485最本质的区别!_哔哩哔哩_bilibili喜欢几位博主老师老师的还请看原贴/原视频数据通信 数据通信是指通过某种传......
  • STM32学习笔记(十)--I2C、IIC总线协议详解
    概述:InterIntegratedCircuit,一组多从多组多从有应答是一种同步(具有时钟线需要同步时钟SCL)、串行(一位一位的往一个方向发送)、半双工(发送接收存在一种)通信总线。(1)硬件电路所有I2C设备的SCL连接在一起,SDA连在一起            设备的SCL和SDA均要......
  • 嵌入式通信协议-----SPI协议详解
    目录一、简介1.概念2.特点3.优缺点 4.应用场景二、通信原理三、通信特性1.时钟频率2.时钟极性(CPOL)3.时钟相位(CPHA)4.四种模式5.多主机模式(1)多片选(2)菊花链四、编程实现五、三种SPI比较1.DualSPI2.QueuedSPI3.三者的区别一、简介1.概念      SP......
  • (11.3)iic串口读写EEPROM实验:程序设计
    一、实验任务二、架构框图其中:i2c驱动模块: bit_ctrl:0代表发送8位字节地址;1代表发送16位字节地址(本实验采用)i2c_addr[15:0]:16位字节地址,当bit_ctrl为0时只有低8位是有效的i2c_data_w[7:0]:向EEPROM写入的8位数据i2c_exec:拉高代表当前进行......