STM32 - I2C 通信协议

起源:

       由飞利浦公司在1980年代初开发的一种简单、双线双向的同步串行总线,它利用一根时钟线和一根数据线在连接总线的两个器件之间进行信息的传递,为设备之间数据交换提供了一种简单高效的方法。

特点:
  • 只需要SDA、SCL两条总线;
  • 支持总线挂载多设备(一主多从、多主多从)。连接到总线的每个设备均可通过唯一地址进行软件寻址;
  • 可提供仲裁和冲突检测;
  • 同步,半双工
  • SCL只能主机控制,SDA看情况控制
传输速度:
  • 标准模式(Standard Mode):100 Kbps
  • 快速模式(Fast Mode):400 Kbps
  • 高速模式(High speed mode):3.4 Mbps
  • 超快速模式(Ultra fast mode):5 Mbps

通讯协议

一个完整的I2C通信过程包括以下 6 部分:

  • 起始条件
  • 地址传送
  • 应答位
  • 数据传送
  • 应答位
  • 终止条件

       当总线上的主机都不驱动总线,总线进入空闲状态, SCL 和 SDA 都为高电平。总线空闲状态下总线上设备都可以通过发送开始条件启动通信。

起始条件:

拉低SDA启动通信,SCL高电平期间,SDA从高电平切换到低电平

终止条件:

SCL高电平期间,SDA从低电平切换到高电平

字节传输:

SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

主机发送数据,主机控制SCL ,主机控制SDA,从机读。

主机接收数据,主机控制SCL ,从机控制SDA,主机读。

 应答位

  • 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
  • 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

地址传送 

I2C通讯支持:7 位寻址和10 位寻址两种模式。

7 位寻址模式:

地址帧(8bit)的高 7 位为从机地址(注意:从机地址高四位固定,低三位是可以自己配置的

地址帧第 8 位来决定数据帧传送的方向

7 位从机地址 + 1位 读/写位,读/写位控制从机的数据传输方向(0:写; 1:读) 

10 位寻址模式:

10位地址(那就两个字节)两个字节16位 — 1位读写位 = 15位。15位前5位固定11110(头序列),以此表示是10位寻址模式 。

主机发送帧,第一帧 发送头序列(11110XX0,其中 XX 表示 10 位地址的 高 两位),然后第二帧发送低八位从机地址。

主机接收帧 ,第一帧发送头序列(11110XX0,其中 XX 表示 10 位地址的高两位),然后第二帧发送低八位从机地址。

接下来会发送一个重新开始条件,然后再发送一帧头序列(11110XX1 ,其中 XX 表示 10 位地址的高两位)

I2C时序详解

指定地址写

对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

当前地址读

对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

注意:

主机控制SDA线 指定设备后,应答位之后变成 从机控制SDA线,且当发完一个字节不想再发时,应答位应该置1,这样表示主机接收字节但不回复,从机没有收到回复就会放开SDA线的控制权,如果主机回复,那么从机接收应答便会接着发送字节。

指定地址读

对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)

将指定地址写前部分(指定设备+寻址)+ 当前地址读 (全部)= 指定 地址 读 

第一步做好其实指针已经指向指定地址了,第二步在当前读,就可以实现指定地址读。

参考博文 :一文搞懂I2C通信总线

                   江科大STM32视频

  • 49
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I2C通信协议是一种串行总线协议,它允许多个设备在同一条总线上进行通信。在I2C总线上,每个设备都有一个唯一的地址,可以通过这个地址与其他设备进行通信。下面是I2C通信协议的详细讲解: 1. 总线结构 I2C总线结构包括两根信号线:SCL和SDA。SCL是时钟线,由主设备负责产生;SDA是数据线,用于传输数据。 2. 通信方式 I2C通信协议主要分为两种方式:传输数据和发送命令。在传输数据时,从设备首先向主设备发送一个应答信号(ACK),主设备接收到应答信号后,才会继续发送数据。在发送命令时,主设备向从设备发送命令并等待从设备的应答信号。 3. 传输数据 在I2C总线上传输数据时,每个字节都由8位二进制数字组成。在传输一个字节之前,主设备必须向从设备发送一个起始信号(Start Bit),表示一个新的传输过程开始了。然后主设备会先发送从设备的地址(包括读/写位),然后等待从设备的应答信号。如果从设备存在,并且它的地址与主设备发送的地址匹配,那么它会发送一个应答信号。接下来主设备会开始发送数据,每发送一个字节就等待从设备的应答信号。当主设备发送完最后一个字节后,它会发送一个停止信号(Stop Bit),表示这次传输已经结束了。 4. 发送命令 在I2C总线上发送命令时,主设备首先向从设备发送命令,并等待从设备的应答信号。如果从设备存在,并且它的地址与主设备发送的地址匹配,那么它会发送一个应答信号。接下来主设备可以向从设备发送一个或多个字节的数据,然后等待从设备的应答信号。当主设备完成数据传输后,它会向从设备发送停止信号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值