I2C (一) 协议

博客围绕I2C展开,介绍了I2C协议,包括状态、ACK与NACK、地址等内容,还阐述了I2C物理硬件和电气特性,另外提及了SMbus以及不同线序下的读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I2C协议


两条线 
    2条双向串行线,一条数据线SDA,一条时钟线SCL。
    且两条线都被上拉电阻上拉
// linux代码 Documentation/i2c/i2c-protocol
协议包括START、ACK、NACK、STOP。尽管协议中规定START必须,其他几个非必须,但实际上其他三个仍旧非常重要。 

主发从收:主 START -> 主发地址(+ write bit 0) -> 从 ACK -> (主发数据 -> 从 ACK (循环)) -> 主 STOP 或 主 START 启动下一次传输 
这一过程中,主控SCL线,从只在ACK时控SDA线,其他时刻主控SDA线。 


主收从发:主 START -> 从发地址(+ read bit 1) -> 主 ACK -> (从发数据 -> 主ACK (循环)) -> 接受至最后一个字节时,主 NACK -> 主 STOP 或 主 START 启动下一次传输 


I2C重要时序:
1.读写寄存器的顺序
写
主 START -> 主发地址(+ write bit 0) -> 从 ACK -> 主发寄存器地址 -> 从 ACK -> 主发寄存器值 -> 从 ACK -> 主 STOP
读
主 START -> 主发地址(+ write bit 0) -> 从 ACK -> 主发寄存器地址 -> 从 ACK -> /*主 STOP(中间没有stop)->*/ 主 START -> 从发地址(地址为设备的地址+ read bit 1) -> 主 ACK -> 从发寄存器数据 -> 主 NACK -> 主 STOP


  • 状态
开始 : SCL 高的时候 SDA 从高到低 
停止 : SCL 高的时候 SDA 从低到高
数据 : SCL 高的时候, SDA 不变(01)
ack  :  SCL 高的时候, SDA 不变,且为0
nack  :  SCL 高的时候, SDA 不变,且为1

  • ACK与NACK
每个字节后会跟随一个ACK信号。ACK bit使得接收者通知发送者已经成功接收数据并准备接收下一个数据。所有的时钟脉冲包括ACK信号对应的时钟脉冲都是由master产生的。

ACK信号:发送者在ACK时钟脉冲期间释放SDA线,接收者可以将SDA拉低并在时钟信号为高时保持低电平。

NACK信号:当在第9个时钟脉冲的时候SDA线保持高电平,就被定义为NACK信号。Master要么产生STOP条件来放弃这次传输,或者重复START条件来发起一个新的开始。
  • NACK

出现 NACK 肯定会停止本次传输,然后 不一定开始一次新的传输

该出现的时机
    read 结束, 主master 控制给出 NACK
在不该出现的时候出现,会终止本次传输(一次传输代表一次读写结束)
  • 地址
I2C设备的写地址 = I2C设备地址 << 1
I2C设备的读地址 = (I2C设备地址 << 1) + 1

I2C物理硬件

I2C控制器
	一般集成在SOC中
I2C设备
	一般是一个单独的设备,表示该设备支持I2C协议,有I2C接口
I2C控制器和I2C设备的连接
	也就是SOC和I2C设备的连接,除了要给I2C设备供电,通常只有 SCL和SDA两根线. // Serial Clock 和 Serial Data Line

I2C电气特性

在这里插入图片描述

其他

  • SMbus
Documentation/i2c/smbus-protocol
注意:此文章描述的是i2c标准协议,但是具体怎么控制器件,看器件datasheet支持的协议,可能与此类似,但不尽相同.
  • 线序 100khz 读写字节

在这里插入图片描述

  • 线序 100khz 写读寄存器
写寄存器

写寄存器

读寄存器

读寄存器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值