IIC通讯详解

IIC通讯详解

首先复习一下IIC基础知识,这部分看不懂的先不要着急,然后我们慢慢分析IIC的协议波形,这些疑问可能就豁然开朗了~

1 IIC是什么

IIC(Inter Integrated Circuit,集成电路总线)是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU (单片机)与IIC模块之间、IIC模块与IIC模块之间进行双向传送。

IIC的一些特点:

  • IIC是半双工,而不是全双工。
  • IC是真正的多主机总线,(对比SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。
  • 起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。
  • 在起始信号后必须发送一个7位从机地址+1位方向位,用“0”表示主机发送数据,“1”表示主机接收数据。
  • 每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。
  • 起始信号是必需的,结束信号和应答信号,都可以不要。
    注:实际使用中,一般是MCU作为主机,其它器件作为从机,MCU先向器件发送信息表示要读取数据,之后转变传输方向,器件发送数据到MCU。

2 IIC物理连接

使用IIC通信的IIC器件有很多,比如陀螺仪加速度计MPU6050,EEPROM存储芯片AT24C02等,通过IIC总线,可以与单片机之间进行数据传输。

  • IIC通信线只有只有两根,数据线SDA的高低电平传输2进制的数据,时钟线SCL通过方波信号提供时钟节拍。
  • 多个IIC器件可以并联在IIC总线上,每个器件必须有特定的地址,分时共享IIC总线。
  • 实际使用IIC当然还要给主机和从机供电。
    在这里插入图片描述

3 IIC时序

看芯片手册的时候总会出现如下的IIC时序图
在这里插入图片描述
接下来我们慢慢分析

3.1 IIC起始结束信号

分开来看:
在这里插入图片描述

  • 起始:时钟线SCL为高时,数据线SDA由高到低。
  • 停止:时钟线SCL为高时,数据线SDA由低到高。
  • 空闲状态:SDA和SCL同时为高时,为IIC总线的空闲状态。

3.2 IIC应答

在这里插入图片描述
IIC的应答机制

  • 下面的波形:SCL,主机产生的时钟脉冲。
  • 上面的波形:SDA,主机发送的8位数据。
  • 中间的波形:SDA,从机在第9个时钟信号进行拉低回应,表示收到了主机发来的数据,拉高则表示不应答。

实际上,上面和中间是同样的SDA线,这里只是分开示意。因为IIC应答是一种相互关系,单片机发数据给IIC器件,IIC器件要进行应答,表示收到了数据,同样,单片机接收IIC器件的数据后,也要给IIC器件一个应答。
既然发送完都需要对方回应,那什么时候使用不应答呢?就是在读取到本次数据后,如果不需要继续读取,则发送非应答,对方以为你没收到这次数据,则就不会继续发送了。

3.3 IIC完整传输时序

在这里插入图片描述

  • 开始标志(S)发出后,主设备会传送一个7 位的Slave 地址,并且后面跟着一个第8位,称为Read/Write 位。
  • R/W 位表示主设备是在接受从设备的数据还是在向其写数据。
  • 然后,主设备释放SDA 线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一个应答位。
  • 应答产生时,从设备将SDA 线拉低并且在SCL 为高电平时保持低。
  • 数据传输以停止标志(P)结束,然后释放总线。但主设备也可以产生重复的开始信号去操作另一台从设备,而不发出结束标志。。
  • 所有的SDA 信号变化都要在SCL 时钟为低电平时进行,除了开始和结束标志。

4 常用的数据收发方式(时序)

在实际使用中,一般是对某个IIC器件的某个寄存器进行读写操作,因此,对于寄存器的读写操作,还要遵循下面的组合时序逻辑。

4.1 写一个字节

用于对IIC器件某个寄存器的配置,如对MPU6050的某些参数进行设置。
在这里插入图片描述

  • 写寄存器时,主设备除了发出开始标志和地址位,还要加一个R/W 位,0 为写,1 为读。
  • 在第9 个时钟周期(高电平时),MPU6050 产生应答信号
  • 主设备开始传送寄存器地址,并接到应答。
  • 然后开始传送寄存器数据,仍然要有应答信号。
  • 最后主设备发送停止信号。

4.2 连续写多个字节

对连续地址的写入,这个用的比较少。
在这里插入图片描述

通信时序与上面的“写一个字节”类似, “写一个字节”是写一个字节后就停止了,若要连续写,则继续写即可,只要可以收到从机Ack。

4.3 读一个字节

用于读取IIC器件某个地址或连续地址的数值。
在这里插入图片描述

  • 首先由主设备产生开始信号,然后发送从设备地址位和一个写数据位,等待应答。
  • 然后发送寄存器地址,才能开始读寄存器。
  • 收到应答信号后,主设备再发一个开始信号,然后发送从设备地址位和一个读数据位。
  • 然后,作为从设备的MPU6050 产生应答信号并开始发送寄存器中的数据。
  • 通信以主设备产生的拒绝应答信号(nACK)和结束标志(Stop)结束。
  • 拒绝应答信号(nACK)产生定义为SDA 数据在第9 个时钟周期一直为高。

4.4 连续读多个字节

也是用于读取IIC器件某个寄存器的数值,当某些数据一位字节不够表示,或有一组连续的数据需要读时,可以使用该模式,比如读取EEPROM时可以连续读数据。
在这里插入图片描述
通信时序与上面的“读一个字节”类似,上面是读一个字节后就nAck叫停,若要连续写,则发送Ack,直到不需要继续读时再回复nAck。

5 IIC的一些其他特性

  • 时钟线SCL是一种间歇性的方波(需要通信时才产生方波)。
  • 数据线SDA根据SCL提供的节拍,高电平代表数据1,低电平代表数据0。
  • 没有数据传输时,SDA和SCL均为高电平状态,即为棕线空闲状态。
  • 起始信号后,数据是9个一组,包括8位的数据和另一方的1位回应。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值