I2C通信协议详细讲解

实验准备

一块STM32最小系统板,BH1750模块,一块PCB转换板模块、串口TTL转USB模块
图片:
在这里插入图片描述
在这里插入图片描述

PCB转换板原理图及PCB电路图

在这里插入图片描述
在这里插入图片描述

讲解流程

我们为什么要学习I2C通信

Stm32的最常用的板间通信有很多,有I2C、SPI、CAN;I2C通信协议是我们stm32板间通信比较常用的、也是比较简单的。

I2C协议简介:

I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、 CAN 等通讯协议的外部收发设备,所以被广泛使用。

I2C物理层特点

(1)它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2)一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
(3)每一个连接总线的设备都有一个独立的地址,主机可以通过这个地址进行选择连接总线的设备与之通信。
(4)总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
(5)多个主机同时使用总线时,为了防止多个设备发送数据冲突,会利用仲裁方式决定由哪个设备占用总线。
(6) 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
(7) 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。
备注:
仲裁:SDA线的仲裁也是建立在总线具有线“与”逻辑功能(线与逻辑,即两个以上的输出端直接互连就可以实现“AND”的逻辑功能。两个一出一,一个一出零、没有一出零)的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,进行比较,输出低电平进行发送,输出高电平退出。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线。

在这里插入图片描述

I2C协议层

在这里插入图片描述

S:由主机的 I2C 接口产生的传输起始信号(S),这时连接到 I2C 总线上的所有从机都会接收到这个信号。
SLAVE ADDRESS:从机地址信号。 在 I2C 总线上,每个设备的地址都是唯一的, 当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。从机地址一般是 7 位或 10 位。
R/W:是传输方向的选择位,该位为 0 时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1 时,则相反,即主机由从机读数据。
A | A/:一个应答(ACK)或非应答(NACK)信号。
P:停止传输信。
图中背景有填充的矩形表示 数据由主机传输至从机

写数据

讲得简单一点,即主机发送信息、从机阅读信息。配置为方向为“写数据”方向,接受的数据包大小为8位(一个byte),主机每发送完一个字节数据,都要等待从机的应答信号(ACK),重复这个过程,数据的多少可以理论是可以随便的。当数据传输结束时,主机向从机发送一个停止传输信号§,表示不再传输数据。

读数据

讲得简单一点,即主机阅读信息、从机发送信息。若配置的方向传输位为“读数据”方向,发送的数据包大小也为 8 位,从机每发送完一个数据,都会等待主机的应答信号(ACK),重复这个过程,数据的多少可以理论也是可以随便的。当主机希望停止接收数据时,就向从机返回一个非应答信号(NACK),则从机自动停止数据传输。

读和写数据

除了基本的读写,I2C 通讯更常用的是复合格式,该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过 SLAVE_ADDRESS 寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址(注意区分它与 SLAVE_ADDRESS 的区别);在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。

通讯的起始和停止信号

在这里插入图片描述

当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。当 SCL 是高电平时 SDA线由低电平向高电平切换,表示通讯的停止。起始和停止信号一般由主机产生。
在这里插入图片描述

I2C 使用 SDA 信号线来传输数据,使用 SCL 信号线进行数据同步。见图 24-6。 SDA数据线在 SCL 的每个时钟周期传输一位数据。传输时, SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL为低电平时, SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。
每次数据传输都以字节为单位,每次传输的字节数不受限制。

地址及数据方向

I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信号线发送设备地址(SLAVE_ADDRESS)来查找从机。 I2C 协议规定设备地址可以是 7 位或 10 位,实际中 7 位的地址应用比较广泛。紧跟设备地址的一个数据位用来表示数据传输方向,它是数据方向位(R/),第 8 位或第 11 位。数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。
在这里插入图片描述

再提一嘴,读数据方向时,主机会释放对 SDA 信号线的控制,由从机控制 SDA 信号线,主机接收信号,写数据方向时, SDA 由主机控制,从机接收信号。切记,不要混淆。

时钟控制逻辑

SCL 线的时钟信号,由 I2C 接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时
钟频率。配置 I2C 的 CCR 寄存器可修改通讯速率相关的参数:

  • 可选择 I2C 通讯的“标准/快速”模式,这两个模式分别 I2C 对应 100/400Kbit/s 的
    通讯速率。

  • 在快速模式下可选择 SCL 时钟的占空比,可选 Tlow/Thigh=2 或 Tlow/Thigh=16/9
    模式,我们知道 I2C 协议在 SCL 高电平时对 SDA 信号采样, SCL 低电平时 SDA
    准备下一个数据,修改 SCL 的高低电平比会影响数据采样,但其实这两个模式的
    比例差别并不大,若不是要求非常严格,这里随便选就可以了。

  • CCR 寄存器中还有一个 12 位的配置因子 CCR,它与 I2C 外设的输入时钟源共同
    作用,产生 SCL 时钟, STM32 的 I2C 外设都挂载在 APB1 总线上,使用 APB1 的
    时钟源 PCLK1, SCL 信号线的输出时钟公式如下:

     	标准模式:
     	Thigh=CCR*TPCKL1
     	Tlow=CCR*TPCLK1
     	 
     	快速模式中 Tlow/Thigh=2 时:
     	Thigh = CCR*TPCKL1 
     	Tlow = 2*CCR*TPCKL1
     	
     	快速模式中 Tlow/Thigh=16/9 时:
     	Thigh = 9*CCR*TPCKL1 
     	Tlow = 16*CCR*TPCKL1
    

例如,我们的 PCLK1=36MHz,想要配置 400Kbit/s 的速率,计算方式如下:
PCLK 时钟周期: TPCLK1 = 1/36000000
目标 SCL 时钟周期: TSCL = 1/400000
SCL 时钟周期内的高电平时间: THIGH = TSCL/3
SCL 时钟周期内的低电平时间: TLOW = 2*TSCL/3
计算 CCR 的值: C C R = T H I G H T P C L K 1 = T S C L 3 1 36000000 = 1 400000 3 1 36000000 = 36000000 1200000 = 30 CCR ={THIGH\over TPCLK1} ={ {TSCL\over 3}\over {1\over 36000000} }={ { {1\over 400000}\over 3}\over {1\over 36000000} }={36000000\over 1200000}=30 CCR=TPCLK1THIGH=3600000013TSCL=

  • 61
    点赞
  • 381
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: i2c通信(I2C:Inter-Integrated Circuit)是一种串行通信总线协议,用于在电子设备之间进行数据传输。它由飞利浦公司(现在的NXP半导体)开发,主要用于连接集成电路芯片。以下是对i2c通信的详细讲解,更多内容可以在相关的PDF文档中找到。 i2c通信使用两根传输线(SDA和SCL线)进行数据传输,允许多个设备连接在同一总线上。其中一个设备充当主设备,其他设备充当从设备。主设备用于初始化通信、发送起始和停止条件,并控制总线传输速度。从设备则接受主设备的指令并提供响应。 i2c通信的基本过程如下: 1. 主设备发送起始条件,即发送一个低电平脉冲到SCL线,然后发送一个高电平脉冲到SDA线。 2. 主设备发送从设备地址和读/写位。从设备地址告诉总线上的设备是哪个设备需要通信,读/写位指示是读取数据还是发送数据。 3. 从设备接收地址,并发送一个应答位指示地址接收的成功与否。 4. 主设备根据应答位发送数据,或者发送读取数据的请求。 5. 从设备接收并处理数据。 6. 主设备发送停止条件,即发送一个高电平脉冲到SCL线,然后发送一个低电平脉冲到SDA线。 使用i2c通信的优点包括总线只需要两根线、支持多个设备连接、灵活性高等。但也有一些限制,如通信速率相对较慢、总线上的设备数量限制等。 在i2c通信的PDF文档中,你可以找到更详细的介绍和示例,包括通信协议的细节、数据传输的过程、地址和命令的使用、信号波形图以及一些实际应用的案例等。这些资料将帮助你更好地理解和应用i2c通信协议。 ### 回答2: I2C通信是一种常用的串行总线通信协议,用于连接微控制器与外围设备。该协议由Philips公司(现在的NXP公司)提出,并广泛应用于各种电子设备中。 I2C通信是基于主从模式工作的,通信中包含一个主设备(Master)和一个或多个从设备(Slave)。主设备负责发起通信请求和控制总线的时序,而从设备则响应主设备的请求并提供所需的数据或执行相应的操作。 I2C通信使用了两条线进行数据传输,分别是时钟线(SCL)和数据线(SDA)。时钟线由主设备控制,用于同步数据传输的时序。数据线用于传输实际的数据和控制信号。 在I2C通信中,主设备通过发送起始信号(Start)来启动通信,然后发送从设备的地址和读写控制位,选择要与之通信的从设备。之后,主设备发送数据或读取从设备提供的数据。 当主设备发送一个字节的数据时,从设备需要发送一个应答信号(ACK)来确认数据已被接收。相反,如果从设备不能接收或处理数据,则发送非应答信号(NACK)。 在I2C通信中,数据的传输是基于字节的。主设备发送或读取多个字节的数据时,每个字节之间都需要接收方发送一个应答信号来确认数据的传输。 通信结束时,主设备发送停止信号(Stop),用于标志通信的结束。 I2C通信协议详细讲解PDF可以提供更多关于I2C通信的细节和应用,包括时序图、命令格式、地址选择等内容。这些资料对于学习和使用I2C通信协议的人来说非常有用,可以帮助他们理解和实现I2C通信的各个方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值