I2C通信协议详解

这篇具有很好参考价值的文章主要介绍了I2C通信协议详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(一)I2C总线简介

        I2C总线是Philips公司在八十年代初推出的一种同步串行、半双工的总线,主要用于近距离、低速的芯片之间的通信。

        I2C总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步。

        I2C总线是一种多主机总线,连接在I2C总线上的器件分为主机和从机。主机有权发起和结束一次通信,从机只能被动呼叫。

        标准模式下,基本的I2C总线规范的规定的数据传输速率为100kb/s

        快速模式下,数据传输速率为400Kb/s

        高速模式下,数据传输速率为3.4Mb/s        

        当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到I2C总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(但同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器。i2c通信协议,单片机,嵌入式硬件

I2C协议仅需要一个SDA和SCL引脚。SDA是串行数据线的缩写,而SCL是串行时钟线的缩写。

但这两条数据线需要接上拉电阻,一般接2KΩ或4.7KΩ。这是因为I²C总线(SDASCL)内部都使用漏极开路驱动器(开漏驱动),因此SDASCL 可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平;

i2c通信协议,单片机,嵌入式硬件

i2c通信协议,单片机,嵌入式硬件

(二)I2C总线的寻址

每个连接在I2C总线的器件,都具有一个唯一确定的地址。在任何时刻,I2C总线上只能有一个主机对总线实行控制权,分时地实现点对点的数据传送。
器件(从机)的地址由7位组成,它与1位方向位构成了I2C总线数据传输时起始状态Start之后第1个字节。i2c通信协议,单片机,嵌入式硬件

当主机发送了第1个字节后,系统中的每个从机(器件)都在起始状态Start之后把高7位与本机的地址比较,如果与本机地址一样,则该从机被主机选中,是接收数据还是发送数据由R/W确定

从机器件地址由固定位和可编程位组成。固定位由器件出厂时给定,用户不能自行设置,它是器件的标识码。

当系统中使用了多个相同器件时,从机地址中的可编程位,可使这些器件具有不同的地址;这些可编程位也规定了I2C总线上同类芯片的最大个数。如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件即可以有8个同样的器件接入到该I2C总线系统中。
 

(三)I2C总线通信协议使用方法

I2C总线上主设备和从设备进行数据传输时遵循以下协议格式。数据通过一条SDA数据线在主设备和从设备之间传输01的串行数据。

只有在总线空闲时才允许启动数据传送

在数据传送过程中当时钟线为高电平时数据线必须保持稳定状态不允许有跳变,时钟线为高电平时数据线的任何电平变化将被看作总线的起始或停止信号。

i2c通信协议,单片机,嵌入式硬件i2c通信协议,单片机,嵌入式硬件 整个I2C串行通信过程可以分为:起始信号,地址位,读写位,应答位,数据位,停止条件,具体如下所示:i2c通信协议,单片机,嵌入式硬件 1、起始信号

 

i2c通信协议,单片机,嵌入式硬件

起始(START)状态:I2C总线传输过程中,当时钟线SCL为高电平时,数据线SDA出现高电平到低电平跳变时,标志着I2C总线传输数据开始。

当主设备决定开始通讯时,需要发送开始信号,需要执行以下动作;

  • 先将SDA线从高压电平切换到低压电平;
  • 然后将SCL从高电平切换到低电平;

在主设备发送开始条件信号之后,所有从机即使处于睡眠模式也将变为活动状态,并等待接收地址位

/*******************************************
函数:I2C_Start()
功能:I2C总线通信起始信号
参数:无
返回值:无
*******************************************/
void I2C_Start()
{
	I2C_SDA = 1;
	I2C_SCL = 1;	//总线空闲时SDA SCK都为高电平
	//时钟线保持高电平4us之后 数据线电平从高到低的跳变 作为I2C总线的起始信号
	I2CDelay();		//12MHz 延时4us
	I2C_SDA = 0;
	I2CDelay();		//12MHz 延时4us
	I2C_SCL = 0;
}

2、数据传输

I2C总线进行数据传送时,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定只有在时钟信号SCL信号为低电平期间,数据线上的高电平或低电平状态才允许变化。i2c通信协议,单片机,嵌入式硬件

I2C总线上主机与从机之间一次传送的数据成为一帧,由启动信号、若干个数据字节、应答位和停止信号组成,数据传输的基本单元位一位数据。

数据传输时,每一个字节必须保证是8位长度。数据传输先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位。(即一帧数据共有九位)i2c通信协议,单片机,嵌入式硬件

I2C总线数据传送时每成功地传送一个字节数据后,接收器都必须产生一个应答信号,应答的器件在第9个时钟周期时将SDA 线拉低表示其已收到一个8 位数据,必须要跟一个应答信号,否则主机和从机都不知道数据是否传输完毕。

i2c通信协议,单片机,嵌入式硬件

每写8位数据之后要读取一次ACK应答信号。应答位是从机将SDA电平拉低,应答信号为0说明有应答

/*******************************************
函数:I2C_WriteByte(unsigned char dat)
功能:I2C总线通信写入数据
参数:unsigned char dat---一个字节 8位数据
返回值:无
*******************************************/
void I2C_WriteByte(unsigned char dat)
{
	unsigned char temp;
	for(temp = 0x80; temp != 0; temp >>= 1)
	{
		if(temp & dat)
		{
			I2C_SDA = 1;	
		}
		else 
		{
			I2C_SDA = 0;	
		}
		I2CDelay();		//12MHz 延时4us 维持SCK低,写入数据
		I2C_SCL = 1;	//拉高器件读数据位
		I2CDelay();		//12MHz 延时4us	 维持SCK高,器件读取数据
		I2C_SCL = 0;	//SCK拉低,为下次数据位变化做准备
	}	
}
/*******************************************
函数:I2C_RecvAck()
功能:I2C总线通信读取应答位
参数:无
返回值:bit---0 器件有应答 1 器件无应答 
*******************************************/
bit I2C_RecvAck()
{
	bit ack;
	I2C_SDA = 1;//主机主动释放数据总线,为读ack做准备 器件存在是拉低电平
	I2CDelay();	//维持SCL低 4us
	I2C_SCL = 1;//拉高时钟线,主机读取ACK,若ACK存在,从机会将SDA拉低
	ack = I2C_SDA; 
	I2CDelay();	//维持SCL高 4us
	I2C_SCL = 0;
	
	return ack;		
}

I2C总线上传输的数据信号是广义的,既包括地址信号,有包括真正的数据信号。

在起始信号Start之后,必须首先传送的第一个字节必须是是从机的器件地址数据,只有器件地址传送完成之后,才能进行后续操作。i2c通信协议,单片机,嵌入式硬件

 I2C总线的一次数据传输过程可以有几种数据传输的组合方式:

(1)主机向从机发送数据,数据的整个传送方向在整个传送过程中保持不变。i2c通信协议,单片机,嵌入式硬件

 (2)在第一个字节后,主机立刻从从机读取数据i2c通信协议,单片机,嵌入式硬件

 (3)组合格式,在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反向。i2c通信协议,单片机,嵌入式硬件

3、停止信号

i2c通信协议,单片机,嵌入式硬件 停止(STOP)状态:I2C总线传输过程中,当时钟线SCL为高电平时,数据线SDA出现低电平到高电平跳变时,标志着IPC总线传输数据结束。

当主设备决定结束通讯时,需要发送开始信号,需要执行以下动作;

  • 先将SDA线从低电压电平切换到高电压电平;
  • 再将SCL线从高电平拉到低电平;
/*******************************************
函数:I2C_Stop()
功能:I2C总线通信结束信号
参数:无
返回值:无
*******************************************/
void I2C_Stop()
{
	I2C_SDA = 0;
	I2C_SCL = 0;//初始都给低电平	
	//时钟线保持高电平4us之后 数据线电平从低到高的跳变 作为I2C总线的结束信号
	I2CDelay();		//SCL维持4us低
	I2C_SCL = 1;
	I2CDelay();		//SCL维持4us高
	I2C_SDA = 1;	//拉高SDA
	I2CDelay();
}

(四)I2C总线完整工作过程

1、主机发送启动信号

2、主机发送从设备器件地址

        主设备向每个从机发送要与之通信的从机的7位或10位地址,以及相应的读/写位。

3、主机接收应答

        每个从设备将主设备发送的地址与其自己的地址进行比较。如果地址匹配,则从设备通过将SDA线拉低一位以表示返回一个ACK位

        如果来自主设备的地址与从机自身的地址不匹配,则从设备将SDA线拉高,表示返回一个NACK位

4、传输数据

        主设备发送或接收数据到从设备;

5、接收应答

        在传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:

6、结束信号

        为了停止数据传输,主设备将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件;文章来源地址https://www.toymoban.com/news/detail-639303.html

到了这里,关于I2C通信协议详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十三、51单片机之EEPROM(I2C)

    (1)存储设备类型:ROM、RAM、PROM(可编程ROM)、EPROM(可擦除ROM)、EEPROM(电可擦除ROM)。 (2)为什么需要EEPROM? 某些数据内容我们需要掉电不丢失且在程序运行中可以修改这些数据内容,这就需要用到EEPROM。 (3)EEPROM和flash(闪存)的区别。 EEPROM是按功能分类的一种存储设备类型;flash是存

    2023年04月27日
    浏览(53)
  • 【【STM32----I2C通信协议】】

    我们会发现I2C有两根通信线: SCL和SDA 同步 半双工 带数据应答 支持总线挂载多设备(一主多从,多主多从) 硬件电路 所有I2C设备的SCL连在一起,SDA连在一起 设备的SCL和SDA均要配置成开漏输出模式 SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右 左边的CPU就是主机,他的权

    2024年02月12日
    浏览(48)
  • 【STM32学习】——I2C通信协议&MPU6050姿态传感器&软件I2C读写MPU6050

    ​   目录 前言 一、I2C通信协议 1.简介 2.硬件电路设计 3.I2C时序(软件)

    2024年02月16日
    浏览(52)
  • GD32 单片机 硬件I2C死锁解决方法

    在I2C恢复函数下个断点(检测到I2C多次超时之后,应该能跳转到I2C恢复函数) 使用镊子,将SCL与SDA短接,很快就能看到程序停到恢复函数的断点上,此时再执行恢复函数,看能否正常走出(可在回复函数中写个死循环,只有I2C正常才跳出,检测I2C正常的办法,可以读从设备的

    2024年02月05日
    浏览(60)
  • 单片机第一季:零基础12——I2C和EEPROM

    目录 1,EEPROM 2,I2C  2.1,I2C物理层  2.2,I2C协议层  3,AT24C02介绍  4,代码  为什么需要EEPROM? 单片机内部的ROM只能在程序下载时进行擦除和改写,但是程序运行本身是不能改写的。单片机内部的RAM中的数据程序运行时可以改,但是掉电就丢失了。有时候我们有一些数据要

    2024年02月14日
    浏览(43)
  • 【GD32】从0开始学GD32单片机(8)—— I2C外设详解+主机从机发送和接收例程

    I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。 I2C总线是一个真正的多主机总线,如果两个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据破坏,每个连接到总线上的器件都有

    2024年02月02日
    浏览(83)
  • 【51单片机】AT24C20数据帧(I2C总线)

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 小吉先向大家道个歉,因为最近在期末突击,所以文章久久没有更新,也请大家多多见谅😥 目录   🎁I2C总线 🏳️‍🌈

    2024年02月08日
    浏览(67)
  • 【STM32】STM32学习笔记-I2C通信协议(31)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月23日
    浏览(71)
  • 串行通信协议(I2C、SPI、UART、SCCB、CAN)

    推荐一部书,在这本书里面介绍了I2C、SPI、UART和CAN等通信协议,写的蛮不错的。 串行通信 :设备与设备之间,传输数据按顺序依次1bit位接1bit位进行传输。 并行通信 :设备与设备之间,通过多条传输线,可以同时传输多个bit位的信号。 1.简单的双向两线制总线协议标准、半

    2024年02月14日
    浏览(61)
  • 【STM32 CubeMX】I2C层次结构、I2C协议

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于连接各种外设和传感器。理解I2C的层次结构、协议和硬件结构对于STM32微控制器的开发至关重要。通过STM32 CubeMX提供的图形化配置工具,我们能够更轻松地理解和配置I2C通信,同时深入了解

    2024年02月22日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包