学习笔记8-I2C协议

article/2025/8/16 21:37:24

目录

  • 一、关于I2C
  • 二、硬件结构
  • 三、I2C协议
    • 3.1、I2C的三种状态
    • 3.2、数据有效性
    • 3.3、应答信号
    • 3.4、总线时序
    • 3.5、读写时序
      • 3.5.1、读
      • 3.5.2、写
    • 3.6、死锁
    • 3.7、仲裁
  • 四、软件I2C&硬件I2C
  • 五、AT24C02
  • 六、代码编写
    • 6.1、I2C初始化
    • 6.2、开始信号
    • 6.3、ACK/NACK信号
    • 6.4、发送1byte数据
    • 6.5、读取1字节
    • 6.5、停止信号


一、关于I2C

I2C通讯协议 (Inter Integrated Circuit) 是由 Phiilps 公司开发的一种简单、双向二线制同步串行总线,只需要两根线即可在连接于总线上的器件之间传送信息。由于它引脚少,硬件实现简单,可扩展性强,不需要 USART 、 CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路 ( IC)间的通讯。I2C是半双工!
在这里插入图片描述
上拉电阻可直接使用经典值4.7kΩ。使用I2C设备的灌电流不得超过3mA。逻辑0电压不得高于0.4V。

I2C相关术语的定义如下。在这里插入图片描述
STM32的 I2C 架构剖析如下图。
在这里插入图片描述

  1. 通讯引脚
  2. 时钟控制逻辑:在快速模式下可选择 SCL 时钟的占空比,可选 T low /T high =2 或
    T low /T high =16/9 模式(随意选即可)。I2C 外设输入时钟源为 PCLK1。
  3. 数据控制逻辑
  4. 整体控制逻辑

为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。(见下)

二、硬件结构

I2C总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。
其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。
在这里插入图片描述
SCLKN1 OUT:串行时钟输出
SCLKN IN:串行时钟输入
DATAN1 OUT:串行数据输出
DATAN1 IN:串行数据输出

(1)由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;
(2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。为 “时钟同步”和“总线仲裁”提供硬件基础。

三、I2C协议

3.1、I2C的三种状态

  • 空闲状态:SCL与SDA同时为高电平。
  • 工作开始状态:SDA由高电平到低电平,SCL由高电平到低电平。(开始信号)
  • 工作停止状态:SDA由低电平到高电平,SCL由高电平到低电平。(结束信号)
    在这里插入图片描述

3.2、数据有效性

  • SCL为高电平时,SDA表示的数据有效。
  • SCL为低电平时,SDA表示的数据无效,此时正在“DATA CHANGE”。

在这里插入图片描述

3.3、应答信号

含“应答(ACK)”与“非应答(NACK)”。
在这里插入图片描述

在第9个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制 SDA ,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。

3.4、总线时序

在这里插入图片描述
每一帧数据由9bit组成,

  • 如果是发送数据,则包含8bit数据+1bit ACK
  • 如果是设备地址数据,则8bit包含7bit设备地址 1bit方向

3.5、读写时序

在这里插入图片描述

  • 主机发送开始信号给从机,唤醒所有主从机
  • 主机发送7位的地址位+1位的读写位给从机
  • 等待地址匹配从机的应答信号
  • 主机发送或接收数据到从机
  • 在传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧
  • 结束之后主机发出停止信号

读写位

  • 0表示主设备向从设备(write)写数据
  • 1表示主设备向从设备(read)读数据

3.5.1、读

在这里插入图片描述

3.5.2、写

在这里插入图片描述

3.6、死锁

I2C总线写操作过程中,主机在产生启动信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为低电平,这时从机输出应答信号,将SDA信号拉为低电平。
如果这时主机异常复位,SCL就会被释放为高电平。此时,如果从机没有复位,就会继续I2C的应答,将SDA一直拉为低电平,直到SCL变为低电平,才会结束应答信号。对于主机来说,复位后检测SCL和SDA信号,如果发现SDA信号为低电平,则会认为I2C总线被占用,会一直等待SCL和SDA信号变为高电平。这样,主机等待从机释放SDA信号,而同时从机又在等待主机将SCL信号拉低以释放应答信号,两者相互等待,I2C总线进人一种死锁状态。同样,当I2C进行读操作时,从机应答后输出数据,如果在这个时刻主机异常复位而此时从机输出的数据位正好为0,也会导致I2C总线进入死锁状态。

解决方法:
(1)从机电源设计为可控,总线死锁时将从机复位。
(2)从机程序添加监测功能,总线长时间被拉低则释放对总线控制。
(3)主机中增加I2C总线恢复程序。每次主机复位后,如果检测到SDA被拉低,则控制SCL产生<=9个时钟脉冲(针对8位数据的情况),每发送一个时钟脉冲就检测SDA是否被释放,如果SDA已经被释放就再模拟产生一个停止信号,这样从机就可以完成被挂起的读写操作,从死锁状态中恢复过来。(有局限性——软件并不能够直接控制SCL信号模拟产生需要时钟脉冲)

3.7、仲裁

当SCL 线是电平时,仲裁在SDA 线发生;在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不相同。
在这里插入图片描述

四、软件I2C&硬件I2C

  • 软件IIC:指用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。
  • 硬件IIC:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,直接调用内部寄存器进行配置。

相对来说,硬件I2C效率更高,软件I2C接口更灵活。

五、AT24C02

基本描述:2k bit串行EEPROM存储器,内含256字节。里面有一个8字节页写缓冲器。

在这里插入图片描述
从器件地址如下图。(前四位固定为1010)
在这里插入图片描述

  1. 芯片寻址:
    A2~A0为由管脚电平(为000),最后一位表示读写操作。所以AT24Cxx的读地址为0xA1,写地址为0xA0。
    也即
    写24C02的时候,从器件地址为10100000(0xA0);
    读24C02的时候,从器件地址为10100001(0xA1)。
  2. 片内地址寻址:
    芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为00~FF,共256个寻址单位。
    对应修改A2A1A0即可。

六、代码编写

6.1、I2C初始化

void IIC_init()//IIC初始化
{SCL=1; //首先把时钟线拉高delay_us(4);//延时函数SDA=1; //在SCL为高的情况下把SDA拉高delay_us(4); //延时函数
}

6.2、开始信号

//产生IIC起始信号
//首先拉高SDA,再拉高SCL,空闲状态
//最后拉低SDA
void IIC_Start()//启动信号
{SDA=1; //确保SDA线为高电平delay_us(5);SCL=1;  //确保SCL高电平delay_us(5);//以下这一步产生了开始信号的脉冲SDA=0; //在SCL为高时拉低SDA线,即为起始信号delay_us(5);
}

6.3、ACK/NACK信号

//CPU产生ACK信号
void I2C_Ack(void)
{I2C_SDA_Low();I2C_Delay();I2C_SCL_High();I2C_Delay();I2C_SCL_Low();I2C_Delay();I2C_SDA_High();
}
//CPU产生NACK信号
void I2C_NoAck(void)
{I2C_SDA_High();I2C_Delay();I2C_SCL_High();I2C_Delay();I2C_SCL_Low();I2C_Delay();
}
//CPU产生一个时钟,并读取器件的ACK应答信号
uint8_t I2C_WaitToAck(void)
{uint8_t redata;I2C_SDA_High();I2C_Delay();I2C_SCL_High();I2C_Delay();if(I2C_SDA_READ()){redata = 1;}else{redata = 0;}I2C_SCL_Low();I2C_Delay();return redata;}   

6.4、发送1byte数据

//IIC发送一个字节
//返回: 从机有无应答
//0,无应答   
//1,有应答         //只有当SCL被拉低后,SDA才能被改变
//总结:在SCL为低电平期间,发送数据,发送8次数据,数据为1,SDA被拉高,数据为0,SDA被拉低。
//传输期间保持传输稳定,所以数据线仅可以在时钟SCL为低电平时改变。
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              //IIC_SDA=(txd&0x80)>>7;   //获取最高位//获取数据的最高位,然后左移7位//如果某位为1,则SDA为1,否则相反if((txd&0x80)>>7)IIC_SDA=1;elseIIC_SDA=0;txd<<=1;       delay_us(2);   IIC_SCL=1;delay_us(2); IIC_SCL=0;    delay_us(2);}     
}       

6.5、读取1字节

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();        //SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++;   delay_us(1); }					 if (!ack)IIC_NAck();        //发送NACK,表示不再接收数据elseIIC_Ack();         //发送ACK   return receive;
}

6.5、停止信号

//产生IIC停止信号
//1.先拉低SDA,再拉低SCL
//2.拉高SCL
//3.拉高SDA
//4.停止接收数据
void IIC_Stop(void)
{IIC_SCL=0;IIC_SDA=0;    //STOP:当SCL高时,数据由低变高delay_us(4);IIC_SCL=1; IIC_SDA=1;    //发送I2C总线结束信号delay_us(4);							   	
}

参考自:1、2、3



http://chatgpt.dhexx.cn/article/LjhsMWci.shtml

相关文章

I2C 协议 代码详解

I2C 协议 最后代码已上传&#xff01;&#xff01;&#xff01;&#xff01;   代码文章链接    github 代码链接在该文章最后 I2C 简要介绍 I2C 总线&#xff08;I2C bus&#xff0c;Inter-IC bus&#xff09;是一个双向的两线连续总线&#xff0c;提供集成电路&#xf…

通俗易懂的I2C协议

关注v-x-公-众-号&#xff1a;【嵌入式基地】 后-台-回-复&#xff1a;【电赛】 即可获资料 回复【编程】即可获取 包括有&#xff1a;C、C、C#、JAVA、Python、JavaScript、PHP、数据库、微信小程序、人工智能、嵌入式、Linux、Unix、QT、物联网、算法导论、大数据等资料 I2C总…

I2C 协议图文解析

转自&#xff1a;https://blog.csdn.net/EastonWoo/article/details/52712826 i2c协议注意几点就很好的使用它&#xff1a; 1&#xff09;由一个主设备&#xff0c;一个或多个从设备组成&#xff0c;所有的信号发起都是由主设备发起&#xff0c;从设备根据这些信号做一些应答。…

I2C协议---I2C时序图解析

一、I2C协议简介 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由 Phiilps 公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要 USART、CAN 等通讯协议的外部收发设备&#xff0c;现在被广泛地 使用在系统内多个集成…

I2C协议——物理层和协议层

I2C协议简介 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)…

I2C协议详解

I2C协议详解 一、I2C协议简介 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主器件用于启动总线传送数据&#xff0c;并产生时钟以开放传送的器件&#xff0c;此时任何被寻址的器件均被认为是从器件…

I2C协议概述

目录 IntroductionFeaturesStandard-mode, Fast-mode and Fast-mode Plus I2C-bus protocols1. SDA and SCL signals2. SDA and SCL logic levels3. Data validity4. START and STOP conditions5. Byte format6. Acknowledge (ACK) and Not Acknowledge (NACK)7. Clock synchro…

I2C协议(详细)

I2C通讯协议(Inter&#xff0d;Integrated Circuit)引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)间的通讯。实现I2C需要两根信号线完成信息交换&#xff…

【总线】I2C 通信协议

目录 I2C 总线协议概述 参数总结 I2C 的工作原理 寻址 读/写位 数据帧 I2C数据传输的步骤 具有多个从机的单个主机 具有多个从机的多个主机 I2C的优缺点 优点 缺点 文章参考 I2C 总线协议概述 I2C 总线广泛应用在 OLED 显示器、气压传感器或陀螺仪/加速度计模块的…

【数字IC】深入浅出理解I2C协议

深入浅出理解I2C协议 一、什么是I2C协议二、I2C,SPI,UART协议的区别三、I2C的信号线四、I2C的连接方式4.1 单主设备&#xff0c;单从设备4.2 单主设备&#xff0c;多从设备4.3 多主设备&#xff0c;多从设备 五、I2C的数据传输格式5.1 空闲位5.2 起始位5.3 地址位与读写控制5.4…

I2C协议靠这16张图彻底搞懂(超详细)

文章目录 背景硬件层数据传输协议实际上如何工作&#xff1f;单个主设备连接多个从机多个主设备连接多个从机如何编程&#xff1f;总结 背景 IC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;中文应该叫集成电路总线&#xff0c;它是一种串行通信总线&#xf…

奇安信SSL VPN详细配置步骤

1、网络接口配置&#xff08;GE2接口配置&#xff0c;GE1调试接口&#xff09; 2、静态路由配置&#xff08;网络配置-网络路由-IPv4路由&#xff09; 3、NC的IP地址池添加&#xff08;SSL-VPN-应用设置-IP地址池-虚拟地址池添加&#xff09; 4、用户和组的添加 5、NC设置 6、…

防火墙之IPSec VPN实验

防火墙IPSec VPN实验 原理概述: 指采用IPSec协议来实现远程接入的一种VPN技术&#xff0c;IPSec全称为Internet Protocol Security&#xff0c;是由Internet Engineering Task Force (IETF) 定义的安全标准框架&#xff0c;在公网上为两个私有网络提供安全通信通道,通过加密通道…

如何使用Xshell7连接学校虚拟机(保姆级)

如何使用Xshell7连接学校虚拟机&#xff08;保姆级&#xff09; 文章目录 如何使用Xshell7连接学校虚拟机&#xff08;保姆级&#xff09;一、前言二、连接学校VPN三、使用学校平台建立虚拟环境四、配置OpenVPN客户端五、使用Xshell连接虚拟机1、新建会话2、设置新建会话属性2、…

密码应用体系建设(政务方向)

一、背景 密码是保障网络与信息安全的核心技术和基础支撑&#xff0c;是解决网络与信息安全问题最有效、最可靠、最经济的手段。《密码法》的颁布实施&#xff0c;从法律层面为开展商用密码应用提供了根本遵循&#xff0c;《国家政务信息化项目建设管理办法》的颁布实施&#…

OSI七层网络协议

在前一篇博客运维往事 一次负载均衡坏点检测事故中我提到了在生产环境中在第四层和第七层做healthCheck&#xff0c;这个第四层和第七层到底是什么意思呢&#xff1f;除了第四层第七层之外&#xff0c;其他的几层到底是什么&#xff1f;这几层到底做了啥&#xff1f;   OSI把…

网络七层协议,五层协议概述

一、七层协议&#xff1a; 1、应用层&#xff1a; 针对特定应用的协议&#xff08;如&#xff1a;电子邮件协议E-mail、远程登录协议SSH&#xff0c;文本传输协议FTP、网络请求协议HTTP&#xff09; 2、表示层&#xff1a; 信息的语法语义以及它们的关联&#xff0c;如加密…

简洁易懂——网络七层协议

国际标准化组织ISO于1984年提出了OSI&#xff08;Open Ssystem Interconnection Reference Model,开放系统互联参考模型&#xff09;。OSI很快成为计算机网络通信的基础模型。 OSI依层次结构来划分&#xff1a;第一层&#xff0c;物理层&#xff1b;第二层&#xff0c;数据链路…

计算机网络七层协议osi

OSI&#xff08;open system interconnect开放系统互联&#xff09;七层模型&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层。 OSI七层模型功能对应的网络协议TCP/IP四层概念模型应用层…

1分钟看懂网络七层协议/OSI七层模型

网络七层协议用一张图表示&#xff0c;大概是这样的&#xff1a; 物理层&#xff1a; 解决两个硬件之间怎么通信的问题&#xff0c;常见的物理媒介有光纤、电缆、中继器等。它主要定义物理设备标准&#xff0c;如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 …