极速赛车手机官网

一文了解I2C总线工作原理、优缺点和应用

2019-08-05来源: EEWORLD关键字:I2C  总线

如果您正在使用OLED显示器,气压传感器或陀螺仪/加速度计模块的项目,您可能会发现正在使用I2C总线。

I2C总线简介

I2C结合了SPI和UART的优点。使用I2C,您可以将多个从设备连接到单个主设备上(如SPI),并且可以让多个主器件控制单个或多个从器件。当您希望有多个微控制器记录数据到单个存储卡或将文本显示到单个LCD时,这非常有用。

与UART通信一样,I2C仅使用两条线在设备之间传输数据:

图片.png

SDA(串行数据) - 主站和从站发送和接收数据的线路。

SCL(串行时钟) - 承载时钟信号的线路。

I2C是一种串行通信协议,因此数据沿着单线(SDA线)逐位传输。

与SPI一样,I2C是同步的,因此位输出通过主机和从机之间共享的时钟信号与位采样同步。时钟信号始终由主机控制。

图片.png


I2C如何工作

使用I2C时,数据被转换成messages,messages则被分解为数据帧。每条messages都有一个地址帧,其中包含从站的二进制地址,以及一个或多个包含正在传输的数据的数据帧。该消息还包括每个数据帧之间的启动和停止条件,读/写位和ACK / NACK位:

图片.png


启动条件:在SCL线路从高电平切换到低电平之前,SDA线路从高电平切换到低电平。

停止条件:SCL线路从低电平切换到高电平后,SDA线路从低电平切换到高电平。

地址帧:每个从站唯一的7或10位序列,用于在主站想与之通信时识别从站。

读/写位:单个位,指定主器件是向从器件发送数据(低电压电平)还是从器件请求数据(高电压电平)。

ACK / NACK位:消息中的每个帧后跟一个应答/不应答位。如果成功接收到地址帧或数据帧,则从接收设备向发送方返回ACK位。

地址

I2C没有像SPI这样的从选择线,因此它需要另一种方法让从器件知道数据正在发送给它,而不是另一个从器件。它通过地址来做到这一点。地址帧始终是新消息中起始位之后的第一帧。

主设备将与其通信的从设备的地址发送给与其连接的每个从设备。然后,每个从设备将从主设备发送的地址与其自己的地址进行比较。如果地址匹配,则将低电压ACK位发送回主机。如果地址不匹配,则从器件不执行任何操作,SDA线保持高电平。

读/写位

地址帧在末尾包括一个位,用于通知从设备,主设备是想要向其写入数据还是从主设备接收数据。如果主设备想要向从设备发送数据,则读/写位是低电平。如果主设备向从设备请求数据,则该位是高电平。

数据框架

在主设备检测到来自从设备的ACK位之后,准备好发送第一个数据帧。

数据帧始终为8位长,并以最高有效位先发送。紧接着每个数据帧的ACK / NACK位以验证帧已被成功接收。在发送下一个数据帧之前,主机或从机必须接收ACK位(取决于发送数据的人)。

在发送了所有数据帧之后,主设备可以向从设备发送停止条件以停止传输。停止条件是SCL线上从低电平到高电平转换后,SDA线上从低电平变为高电平,SCL线保持高电平。

I2C数据传输步骤

1.主机向每一个连接的从设备发送数据,然后将SDA信号从高切换到低,之后在将SCL从高切换到低电平。

图片.png


2.主设备向每个从设备发送它想要与之通信的从设备的7或10位地址,以及读/写位:

图片.png


3.每个从设备将主设备发送的地址与其自己的地址进行比较。如果地址匹配,则从器件通过将SDA线拉低一位来返回ACK位。如果主设备的地址与从设备的地址不匹配,则从设备将SDA线保持为高电平。

图片.png


4.主设备发送或接收数据帧:

图片.png


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

图片.png


6.要停止数据传输,主机通过在将SDA切换为高电平之前切换SCL为高电平来向从机发送停止条件:

图片.png


有多个从设备的单一主设备

由于I2C使用寻址,因此可以从单个主设备控制多个从设备。使用7位地址,可以使用128(27)个唯一地址。使用10位地址并不常见,但提供1,024(210)个唯一地址。要将多个从器件连接到单个主器件,请像这样连接它们,使用4.7K欧姆上拉电阻将SDA和SCL线连接到Vcc:

图片.png


有多个从设备及多个主设备

多个主设备可以连接到单个从设备或多个从设备。当两个主设备尝试通过SDA线同时发送或接收数据时,同一系统中出现多个主设备的问题。为了解决这个问题,每个主设备需要在发送消息之前检测SDA线路是低还是高。如果SDA线为低电平,则表示另一个主控制器已控制总线,主控制器应等待发送消息。如果SDA线路很高,那么传输信息是安全的。要将多个主设备连接到多个从设备,请使用下图,使用4.7K欧姆上拉电阻将SDA和SCL线路连接到Vcc:

图片.png


I2C的优点和缺点

与其他协议相比,I2C听起来很复杂,不容易在程序中实现而导致数据丢失、无应答、“死等”等问题。但却有很多优点:

优点

只使用两根电线
支持多个主服务器和多个从服务器
ACK / NACK位确认每个帧都已成功传输
硬件没有UART那么复杂
众所周知且广泛使用的协议

缺点

数据传输速率比SPI慢
数据帧的大小限制为8位
实现比SPI更复杂的硬件

关键字:I2C  总线

编辑:冀凯 引用地址:http://news.1900222.com/qrs/ic470045.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:一文了解UART总线工作原理、优缺点和应用
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

14-HAL库之I2C通信

1.I2C协议介绍I2C是一个支持多设备的总线,可连接多个I2C通讯设备,每个总线包括一条双向串行数据线(SDA)和一条串行时钟线(SCL)。数据线用来表示数据,时钟线用来数据收发同步。通讯过程如下:S:主机的I2C接口产生的传输开始信号,连接在I2C总线上的所有从机都会接收到。SLAVE_ADDRESS:主机广播的从机地址信号,I2C总线上每个从机地址唯一。R/W:读写方向,置1为读,置0为写。A/A-:从机接收到匹配的地址后,主机或从机会返回一个应答信号或非应答信号,只有接收到应答信号主机才继续发送接收数据。写数据的时候,每次发送一个字节数据(DATA:8位)后,都要等待应答信号,重复这个过程可以发送N个数据。数据传输结束
发表于 2019-08-16
14-HAL库之I2C通信

关于stm32硬件I2C BUSY锁死的一点说法

首先在上一篇文章中我们搞出来了在没有外界干扰情况下的硬件i2c不卡死的一个办法但是考虑到工程可靠性,我在后来又不断的对四个管脚进行了反复插拔测试,终于又发现了问题在vcc和gnd两个脚上不论如何变化,硬件i2c均不存在太大的问题对SDA管脚进行蹂躏,也未发现较大问题,硬件i2c可以继续工作但是SCL管脚一旦受到较大电磁冲击,甚至是接上或者拔出示波器这么小的冲击,均会导致scl管脚不再输出方波信号作为时钟经过调试发现,产生这一问题的关键原因在于,i2c1_SR2这一寄存器中的BUSY位会被置位,而且stop位不论如何操作均不可将此位置零,scl失效我们注意到在user guide中对于这种情况是有描述的所以解决这个问题的关键就在于
发表于 2019-08-15
关于stm32硬件I2C BUSY锁死的一点说法

STM32CubeMX GPIO模拟I2C读写M24C64

一、先了解一下硬件的连接,I2C_SDA和I2C_SCL分别接STM32的PB9、PB6二、粗阅一下M24C64的数据手册,得知器件地址和存储器地址,器件地址是8bit,而存储器地址是16bit三、下面是M24C64的写时序四、下面是M24C64的读时序五、下面是程序编写流程六、看看时序参数七、好啦!需要的知识点差不多都提到了开始搬砖1、用STM32CubeMX配置生成工程,并打开工程。(具体怎么用这个软件这里不讲)2、在我的工程里是这样配置的《1》配置USART3,用打印读出来的数据与写入的是否一致《2》配置PB6、PB9为开漏输出模式,配置如下:void MX_GPIO_Init(void) {  
发表于 2019-08-14
STM32CubeMX GPIO模拟I2C读写M24C64

【STM32CubeMX】9,STM32之I2C,EEPROM

if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_SET)         { HAL_Delay(500); testarr[0]+=3; if(HAL_I2C_Mem_Write(&hi2c1,0xa0,60,I2C_MEMADD_SIZE_8BIT,&testarr[0],1,3000)==HAL_OK) { printf (" testarr[0]=%drn",testarr[0]); printf ("write OK !!!rn"
发表于 2019-08-14

STM32:I2C接口读写EEPROM(AT24C02)试验例程

硬件平台:stm32f10xZET6开发环境:keil MDK uVisionv4.10开发语言:C、ST_lib_3.5固件库EEPROM:电可擦可编程只读存储器。【stm32f10xZET6开发板的I2C外设物理层特点】(1)两条串行总线:一条双向数据线(SDA),一条时钟线(SCL);(2)从设备地址唯一;(3)支持总线仲裁;(4)三种速率传输模式:    标准模式100kbit/s    快速模式400kbit/s    高速模式3.4Mbit/s (目前大多I2C设备尚不支持高速模式)(5)片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整;(6)连接到相同
发表于 2019-08-14

极速赛车手机官网STM32 IO口模拟I2C+驱动MPU6050

接 VDD 即可。AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制 IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地址是: 0X68,如果接 VDD,则是 0X69,注意:这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!!3.3 MPU6050 传感器的检测轴及方向二、I2C1. I2C简介IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接 微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。 在 CPU 与被控 IC 之间、 IC
发表于 2019-08-14
STM32 IO口模拟I2C+驱动MPU6050

小广播

何立民专栏

单片机及嵌入式宝典

极速赛车手机官网北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 1900222.com, Inc. All rights reserved
极速赛车手机官网 极速赛车APP 极速赛车APP下载 极速赛车手机官网 极速赛车APP下载 极速赛车APP 极速赛车双面盘 极速赛车手机官网 极速赛车APP下载 极速赛车手机版下载