I2C总线(一)——协议

前言

        i2c总线对于嵌入式开发人员来说是必不可少需要掌握的一种通讯方式,跟UART、SPI相比,I2C只需要使用两根线(SDA 、SCL线)就能完成数据通讯。

该笔记参考韦东山驱动大全
   

  一、i2c主要特点

 1、i2c采用主从模式,在一条i2c总线上一个主设备(主控设备)可以连接很多i2C从设备(以下简称设备),每个i2C设备都有一个对应的设备地址,用来确保数据主设备能够正确找到具体对象设备。

  2、i2c设备地址为7位从机地址,第8位为“方向地址”(方向读/写,0表示读,1表示写)。

  3、i2c设备理论上最多支持2^7个设备,  128个地址,0x00不用,所以理论上是127个设备。

  4、i2c的读写只能是主设备发起,从设备始终被动状态。

i2c硬件连接图 

二、i2c传输数据格式

2.1写操作

  • 主芯片要发出一个start信号

  • 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)

  • 从设备回应(用来确定这个设备是否存在),然后就可以传输数据

  • 主设备发送一个字节数据给从设备,并等待回应

  • 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

  • 数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

2.2,读操作

流程如下:

  • 主芯片要发出一个start信号

  • 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)

  • 从设备回应(用来确定这个设备是否存在),然后就可以传输数据

  • 从设备发送一个字节数据给主设备,并等待回应

  • 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

  • 数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

三、i2c信号

       

I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。

  • 开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。

  • 结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

  • 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA

  • SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化

例如主设备要往从设备中写入数据该怎样操作呢?

例如写入地址为0x0b 对应二进制为1010100  0

        在SCL为低电平时改变SDA的值,并且SCL为高电平时SDA保持不变,其中前7bit为地址位,第8bit为读写位,0为写。当主设备写完后会释放i2c总线,这时上拉电阻会将总线拉高,如果存在该地址值的从设备,那么从设备就会返回一个回应信号将i2c总线拉低(第9位信号由从设备驱动),这样主设备就能判断从设备存在,然后再进行后面的数据传输,后面数据传输跟地址传输一样。

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino的I2C通信是一种串行通信协议,用于在多个设备之间进行数据传输。在Arduino板上,I2C总线的两个引脚是SDA和SCL。根据不同的Arduino电路板,这些引脚的编号可能会有所不同。例如,在Arduino UNO中,引脚A4对应SDA,引脚A5对应SCL;在Arduino Mega2560中,引脚20对应SDA,引脚21对应SCL。\[2\]\[3\] 在I2C通信中,可以有一个主设备和多个从设备。主设备负责协调总线上的其他设备之间的信息传输。通常情况下,Arduino作为主设备控制连接到它的其他I2C通信模块。为了建立I2C连接,需要将主Arduino的SDA引脚和SCL引脚连接到从设备Arduino的对应引脚上,并通过共享接地来建立连接。在连接建立后,可以将主站和从站的代码上传到Arduino板上,实现I2C通信。\[1\] 需要注意的是,大多数Arduino相关的I2C模块已经添加了上拉电阻,因此只需要将I2C设备连接到Arduino的I2C接口上即可。\[2\] #### 引用[.reference_title] - *1* *3* [arduino——I2C通讯](https://blog.csdn.net/m0_46152804/article/details/125130186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Arduino成长日记7 - I2C通讯](https://blog.csdn.net/qq_36955622/article/details/106898840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值