I2C总线协议(2020-8-7)

1. I2C简介

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主设备用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从设备在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。

 

2. 通信引脚

  • SDA:(Serial Data)串行数据,发送到SDA 线上的每个字节必须为8 位,主机/从机都可以通过接收和发送数据。
  • SCL:(Serial Clock)串行时钟

 

3. I2C总线特征

  • I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(可以从I2C器件的数据手册得知),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。
  • I2C总线上可挂接的设备数量受总线的最大电容400pF 限制,每个挂接的期间都是有寄生电容,相加不超过400pF的限制。如果所挂接的是相同型号的器件,则还受器件地址位的限制,不可以挂载相同的期间太多。
  • I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
  • I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输

 

4. I2C电路拓扑图

4.1 I2C上拉电阻的原因

根据I2C总线规范,总线空闲时两根线都必须为高电平。否则,上拉电阻上会有耗电。特别是在上电过程中,IO线上电平也应保持在高电平状态。也就是说:当 Master的I2C使用的是IO软件模拟时,一定要保证该两个IO上电默认均为输入(或高阻)或者输出高电平,切不可默认为输出低电平。IO默认为输入时,可以通过外部上拉电阻将I2C信号线拉至高电平。

由于I2C接口采用Open Drain(开漏)机制,器件本身只能输出低电平,无法主动输出高电平,只能通过外部上拉电阻RP将信号线拉至高电平。因此I2C总线上的上拉电阻是必须的!

*4.2 上拉电阻计算(了解)

(此部分转载自https://blog.csdn.net/github_33678609/article/details/54576040)

I2C的上拉电阻可以是1.5K,2.2K,4.7K, 电阻的大小对时序有一定影响,对信号的上升时间和下降时间也有影响,一般接1.5K或2.2K。

I2C上拉电阻的确定有一个计算公式:

Rp {\tiny min} =\frac{Ucc-0.4V}{3mA}           Rp:上拉电阻,Ucc:上拉电压

Rp{\tiny max} =(\frac{T}{0.874} )\times C         通信速率=100KHz,T=1us;400KHz,T=0.3us,C为总线电容

Rp最大值由总线最大容限(Cmax)决定,Rp最小值由IO口电压Vio与上拉驱动电流(最大取3mA)决定;

于是 Rpmin=5V/3mA≈1.7K(@Vio=5V)或者2.8V/3mA≈1K(@Vio=2.8V)

标准模式,100Kbps总线的负载最大容限<=400pF;快速模式,400Kbps总线的负载最大容限<=200pF

 

5.通信过程

  • 如果主设备要发送数据给从设备,则主设备首先寻址从设备,然后主动发送数据至从设备,最后由主设备终止数据传送;
  • 如果主设备要接收从设备的数据,首先由主设备寻址从设备.然后主设备接收从设备发送的数据,最后由主设备终止接收过程。
  • 在这种情况下。主设备负责产生定时时钟和终止数据传送。

I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。

IIC通信,高位在先,低位在后

5.1通信具体过程

5.1.1  初始化:IIC的初始化为SDA和SCL均为高。

 

5.1. 2 开始信号:在时钟信号线为为高时,拉低SDA

总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件。在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线。如图所示:

 

5.1.3 数据传输:SDA上的数据只能在SCL为低电平期间翻转变化,在SCL为高电平期间必须保持稳定,IIC设备只在SCL为高电平期间采集SDA数据。数据传输以字节为单位。

SCL=0时,SDA=数据电平,主机/从机放数据到SDA;SCL=1时,SDA保持不变,主机/从机从SDA读出数据。

写入器件地址:

设备地址:设备地址为7位,发送的数据中一共八位,前七位是设备地址,最后一位是读写控制位,0是写,1是读

  • 先发送要写入的寄存器高八位的地址,获取从机的应答信号。
  • 再发送要写入的寄存器低八位的地址,获取应答信号
  • 接下来发送要写入的数据,字节数任意

如下图:

 

5.1.4 响应信号(ACK):主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个否定应答位。数据传输的过程。

单片机发完8bit数据后就不再驱动总线了(SDA引脚变输入),而SDA和SDL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低,那么处理器检测到SDA拉低就能知道外接IIC设备数据已经收到。IIC数据从最高位开始传输(小端传输)。如图所示:

数据传输结束后空闲时间,就是在SCL拉高=1,将SDA拉低=0则为应答ACK;

在SCL拉高=1,SDA拉高=1,应答为无应答NACK。

 

5.1.5 结束信号:在时钟信号线为为高时,拉高SDA。

当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。

 

协议心得

I2C协议软件模拟

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值