总线—i2c

目录

i2c总线介绍

i2c特点

 i2c框架

        i2c硬件框架

        i2c软件框架

SDA和SCL

SDA(串行数据线)

SCL(串行时钟线)

SDA和SCL工作方式

i2c访问设备

i2cdetect

i2cdump

i2ctransfer


i2c总线介绍

        I2C(Inter-Integrated Circuit)总线是一种串行双向通信总线,由Philips公司在1980年代研发,用于在微控制器(MCU)和周边设备(如EEPROM、LCD显示器、传感器等)之间进行低速通信。I2C总线有两个设备之间的通信,通过两根信号线(SDA和SCL)进行数据传输,支持多主控制器和多从设备通信,具有可靠性、灵活性和低功耗等优点。I2C总线广泛应用于嵌入式系统、消费电子、工业控制等领域。

i2c特点

相比较其他串行总线,比如can,spi,uart,usb,pci,pcie

  •  简单性:I2C总线仅需要两条线——一根串行数据线(SDA)和一根串行时钟线(SCL),从而简化了硬件设计。
  • 双向通信:数据可以在主设备和从设备之间双向传输,这意味着总线上的设备可以同时作为发送器和接收器。
  • 多主控能力:I2C总线支持多个主设备,这使得多个微控制器或处理器可以共存于同一总线上,提高了系统的灵活性。
  • 支持多从设备:总线上的每个从设备都可以被主设备独立地寻址控制,理论上可以支持多达127个从设备。
  • 低速高效:I2C总线的传输速率最高可达100kbps,满足大多数应用场景的需求,特别是在低速数据传输中表现出色。
  • 较远的传输距离:总线长度可以达到25英尺(约7.6米),适用于较广的物理布局。
  • 应答机制:在数据传输过程中,从设备通过发送应答信号来确认数据接收,这有助于提高数据传输的可靠性。
  • 紧凑的芯片管脚:由于只需要两条线,因此大大减少了芯片的管脚数量,有利于降低芯片的体积成本。
  • 易于故障检测:若主设备在通信过程中没有收到从设备的应答信号,可以判断从设备可能出现故障。
  • 灵活性:I2C总线可以用于各种不同的应用,如传感器网络、遥控器、集成电路之间的通信等。

 i2c框架

        i2c硬件框架

        i2c软件框架

当然软件框架也可以分成两部分,主机和从机

主机是发送命令和数据的设备,通常用于控制I2C总线上的其他设备。它可以通过发送I2C协议规定的命令和数据来与从机进行通信。

从机是接收主机命令和数据的设备,并执行相应的操作。从机可以响应主机的请求,发送数据或执行其他操作。

在I2C软件框架中,主机和从机之间的通信通常通过SDA(串行数据线)和SCL(串行时钟线)两根线进行。主机和从机之间通过交换数据来交换信息,从而实现通信。

总之,一个I2C软件框架通常包括主机和从机两个部分,它们通过SDA和SCL两根线进行通信,实现多个设备之间的通信和控制。

画一个简单的软件框架示意图


   +---------------------+
   |                     |
+--|        I2C          |
|  |    Master/Slave     |
|  |     Software        |
|  |                     |
|  +---------------------+
|             |
|        +--|--+
|  SDA   |  |  |  SCL
|        |  |  |
|        +--|--+
|             |
|      Device |
|     (Slave) |
+-------------+

SDA和SCL

I2C通信中,数据是通过两根线传输的:一根是串行数据线(SDA),另一根是串行时钟线(SCL)。下面将详细介绍I2C中的SDA和SCL线:

SDA(串行数据线)

SDA线是I2C通信中用于传输数据的线。它用于在连接的设备之间传输串行数据。在I2C通信中,数据传输是双向的,因此SDA线既用于发送数据,也用于接收数据。

假设您有一个I2C温湿度传感器,您想要读取传感数据。在I2C通信中,您需要通过SDA线发送一个特定的命令到传感器,然后读取传感器返回的数据。

  1. 发送命令:您通过SDA线向传感器发送一个命令字节,告诉传感器进行温度和湿度的读取。
  2.  接收数据:传感器接收到命令后,通过SDA线返回温度和湿度的数据。

在I2C通信中,SDA线用于传输命令、数据以及应答信号

SCL(串行时钟线)

SCL线是I2C通信中用于同步数据传输的线。它用于传输时钟信号,以便在连接的设备之间进行数据同步。SCL线上的信号用于控制数据传输的开始、中间和结束。

 继续上面的例子,当您通过SDA线向传感器发送命令时,您也需要通过SCL线提供时钟信号。传感器在SCL线的上升沿或下降沿时捕获时钟信号,并在正确的时刻发送或接收数据。

  1.  开始条件:在SCL线的下降沿时,您发送一个开始条件(Start Condition),表示数据传输的开始。
  2.  发送命令:在SCL线的上升沿时,您通过SDA线发送命令字节。
  3.  读取应答:传感器在接收到命令后,在SCL线的下降沿时发送一个应答信号(Acknowledge Signal),表示数据已接收。
  4.  传输数据:在SCL线的上升沿时,传感器通过SDA线发送数据。
  5.  停止条件:在SCL线的下降沿时,您发送一个停止条件(Stop Condition),表示数据传输的结束。 在I2C通信中,SCL线用于同步数据传输,确保数据在正确的时刻发送和接收。

总结: I2C通信中的SDA和SCL线是用于在低速外围设备之间进行串行通信的关键线路。SDA线用于传输数据,而SCL线用于同步数据传输。通过理解和使用这两根线,您可以有效地与其他I2C设备进行通信,实现各种外围设备的管理和控制。

SDA和SCL工作方式

  • 开始条件(Start Condition):在开始一个I2C通信传输之前,主设备发送一个低电平的开始条件(Start Condition)信号,即SDA从高电平切换到低电平时,SCL保持高电平。
  • 地址传输和确认(Address Transmission and Acknowledge):主设备发送一个包含目标设备地址和读/写位的7位地址字节,在每个字节传输结束后,接收设备会发送一个应答(Acknowledge)信号。应答信号是一个低电平脉冲,在传输字节之后的第9个SCL周期上升沿时产生。
  • 数据传输:在地址确认后,主设备或从设备都可以发送数据。数据的传输是以字节为单位进行的。发送方将数据位序列化为SDA上的脉冲,并在每个脉冲出现之前,由传输方在收到的SCL上升沿发起。接收方在每个SCL周期的下降沿进行数据读取。
  • 停止条件(Stop Condition):传输结束时,主设备发送一个高电平的停止条件(Stop Condition)信号,即SDA从低电平切换到高电平时,SCL保持高电平。停止条件信号指示I2C通信的结束。

i2c访问设备

在Linux环境下,用i2c-tools工具,下面列举几个常用的工具

  1. i2cdetect:用于探测和显示I2C总线上连接的设备。它可以扫描I2C总线,查找并列出已连接的设备地址。
  2. i2cdump:用于读取和显示I2C设备的寄存器或内存内容。通过指定设备地址范围和寄存器地址,可以读取并显示指定设备的寄存器或内存数据。
  3. i2cget:用于读取和显示I2C设备的寄存器或内存的单个字节。通过指定设备地址和寄存器地址,可以读取并显示指定设备的一个字节数据。
  4. i2cset:用于向I2C设备的寄存器或内存写入单个字节数据。通过指定设备地址、寄存器地址和数据值,可以将一个字节数据写入指定设备的寄存器或内存。
  5. i2ctransfer:用于进行I2C总线上的高级数据传输。可以定义和执行复杂的读写操作序列,包括读取和写入多个字节的数据。
  6. i2cdump-eeprom:用于从I2C EEPROM读取和显示数据。它能够读取和显示I2C EEPROM中保存的数据。

i2cdetect

i2cdetect -y <bus>

i2cdump

格式规范

i2cdump [-f] [-r start-addr [end-addr]] [-y bus] i2c-dev addr [mode]

`-f`:以强制模式运行,即无需检查设备的确认应答信号。

`-r start-addr [end-addr]`:指定要读取的寄存器或内存地址范围。可以指定一个起始地址和一个可选的结束地址。注意:这些地址都是十六进制的。

 `-y bus`:指定要使用的I2C总线号。默认为0。

 `i2c-dev`:指定I2C设备文件的路径。

- `addr`:指定要读取的I2C设备的地址。注意:地址是十六进制的。

- `mode`:选择要采用的读取模式。可以是以下几种模式之一(根据设备支持): - `b`:读取字节(默认模式)。 - `w`:读取字(2字节)。 - `u8`:读取无符号8位整数。 - `s8`:读取有符号8位整数。 - `u16`:读取无符号16位整数。 - `s16`:读取有符号16位整数。

演示

1. 读取I2C设备 0x50 中地址从 0x00 到 0x10 的内存内容:

i2cdump -y 1 i2c-dev 0x50

2. 读取I2C设备 0x68 寄存器 0x10 的值(字节读取模式):

i2cdump -r 0x10 0x10 i2c-dev 0x68

读取I2C设备 0x18 中地址从 0x10 到 0x1F 的内存内容(2字节读取模式):

i2cdump -r 0x10 0x1F i2c-dev 0x18 w

i2ctransfer

i2ctransfer [-r] [-y <bus>] [-a <addr>] [-b <readbytes>] [-w <writebytes>] [<devicename>]
  • `-r`:以读取模式运行,并打印读取到的数据。
  • `-y <bus>`:指定要使用的I2C总线号。默认为0。
  • `-a <addr>`:指定要访问的I2C设备地址。
  • `-b <readbytes>`:指定要读取的字节数。
  • `-w <writebytes>`:指定要写入的字节数。
  • `<devicename>`:可选参数,指定i2c-dev设备文件的路径。如果未指定,将使用默认的i2c-dev设备文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值