I2c总线协议详解

文章目录

  • 简介
  • SDA&SCL总线
  • 数据有效时序
  • 数据传输开始与停止时序
  • 串行数据传输格式
  • 确认(ACK)和不确定(NACK)
  • 7位从地址
    • 写操作
    • 读操作
    • 组合传输

系列文章: 《I2C总线(2)–10bit地址读写》; 《I2C总线(3)–时钟同步和仲裁》; 《I2C总线(4)–高速模式》; 《I2C总线(5)–线与和上拉电阻》; 《I2C总线(6)–START BYTE》

简介

  • I2C含有两条总线:串行数据线(SDA)串行时钟线(SCL)
  • 数据传输是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号。在总线空闲状态时,这两根线被所连接的上拉电阻拉高,SCL和SDA线保持为高。
  • 连接到I2C总线的设备地址是唯一的,而且存在主/从关系,主从设备之间通过这个地址来确定与哪个器件进行通信。主设备可以接受数据,也可以发送数据。
  • I2C是一个多主机总线,包含冲突检测和仲裁来应对多主设备同时请求发送数据的情况。
  • I2C总线上的主设备与从设备之间以串行8bit为单位进行双向数据传输,拥有不同的速度模式,如标准模式(100KB/s)、快速模式(400KB/s)、高速模式(3.4MB/s)。一般通过I2C总线接口的可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
  • 连接到总线的设备数量受最大总线电容的限制。

ps:这里解释一下什么是并口协议,什么是串口协议?

  • 所谓并口,通俗的讲是需要很多的线,我能在一个时钟周期内讲清楚很多的事,比如把data、address等等在一个周期就可以表达;
  • 所谓串口,就是用的线很少,比如I2C,它没办法在一个时钟周期就将address、data发送完,它需要8个SCL周期才能将地址和RW位发送,同样,数据也需要8个时钟周期才能发送完。

可以带着这个问题,继续看接下来的协议内容部分。

SDA&SCL总线

  • SDA和SCL都是双向总线。
  • SDA和SCL要通过电流源或上拉电阻连接到正电源
  • 连接到SDA和SCL总线的设备的输出级必须有一个漏极开路(OD)或集电极开路(OC)来执行“线与”的功能。

数据有效时序

  • SDA线上的数据在SCL高电平必须是稳定的。
  • 只有当SCL时钟信号为低时,SDA的数据才可以发生变化
  • 每传输一个数据位,产生一个时钟脉冲。
    I2c总线协议详解_第1张图片

数据传输开始与停止时序

规定:

  • SCL处于高电平,SDA由高变低,为数据传输的开始(START)标识;
  • SCL处于高电平,SDA由低变高,为数据传输的结束(STOP)标识;

注意:

  • 启动和停止条件总是由主设备生成。
  • 在启动后,总线会被置为繁忙状态;在停止条件后的一段时间内,总线被释放,为空闲状态。
  • 如果生成的是重复启动条件(Sr),总线会保持为繁忙状态。
  • 总线在空闲状态时,SCL和SDA线都保持着高电平。
  • 总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件则无法访问总线。
    I2c总线协议详解_第2张图片

串行数据传输格式

  • SDA线上每个字节必须为8bit,每次传输的字节数不限,每个字母后面必须跟一个确认位(ACK)。数据首先从最高有效位(MSB)开始。
  • 如果从端设备需要执行一些其他功能,使得其无法接收或者发送另一个完整字节的数据。这时,可以先拉低SCL线,使得主设备进入等待状态,直到执行完毕其他功能。当从端设备准备好接受另一个字节的数据时,将其SCL线拉高,数据传输继续进行。
    I2c总线协议详解_第3张图片

确认(ACK)和不确定(NACK)

确定(ACK):在第九个确认时钟脉冲期间,发送方将释放SDA总线,从而接收方可以把SDA总线拉低,而且在时钟脉冲高电平期间,SDA需要保持为低,定义为确认信号(ACK)。

不确定(NACK):当在第九个时钟脉冲信号拉高期间,SDA信号保持为高,定义为不确定(NACK)信号。当NACK产生时,主服务器可以生成终止传输的停止条件,或者生成启动新传输的重复启动条件。

基本概念:

  • 主设备产生所有时钟脉冲,第九位是确认(ACK)位时钟脉冲。
  • 确认(ACK)位发生在每个字节之后,确认位跟在最后。
  • 确认位是接收方给发送方的信号,表示传输的字节已经成功接受,可以发送下一个字节。

注意:会反馈NACK位的情况?

  • 总线上没有接受方,因此没有设备响应应答;
  • 接收器无法接收或发送,因为正在执行一些其他的功能,并且还没有准备好开始与主设备通信;
  • 在传输过程中,接收方获取到了它不理解的数据或命令;
  • 在传输过程中,接受方容纳不下更多的数据字节。

7位从地址

  • 在数据传输启动条件满足后,紧跟着会发送一个从地址,这个地址的长度为7位
  • 从地址后紧接着的第八位为R/W位
  • R/W位中:0表示为传输(即写操作),1代表数据请求(即读操作)
  • 第九位为传输确认(ACK)位,是接收方给发送方的反馈信号。
  • 数据传输由主设备生成停止条件(P)终止。如果主设备仍然希望在总线上通信,可以生成重复启动条件Sr,并向另外的从设备寻址,而不需要生成一个停止条件。
    地址结构:
    I2c总线协议详解_第4张图片

总线时序:
I2c总线协议详解_第5张图片

写操作

当RW位为0(写操作)时,主发送设备发送数据给从接受设备,

  • 主设备根据从地址寻址,找到对应的从设备,从设备应答ACK。
  • 从接受设备ACK每一个字节的数据。
  • 停止条件由主设备产生。
    I2c总线协议详解_第6张图片
    如下,以APB_i2c为例,在仿真中:
    先发送从地址,进行寻址
    I2c总线协议详解_第7张图片
    发送数据,每次发送8bit数据,slave要回一个ack信号
    I2c总线协议详解_第8张图片

读操作

当RW位为1(读操作)时,主设备向从设备中读取数据。

  • 主设备根据从地址寻址,找到对应的从设备,从设备应答ACK。
  • 第一个ACK信号由从设备产生,之后主设备立即读取数据。
  • 之后的ACK信号由主设备产生。
  • 在停止前,主设备发送一个NACK信号。
  • 主设备生成停止信号
    I2c总线协议详解_第9张图片
    仿真时,如下:
    I2c总线协议详解_第10张图片

组合传输

在传输中改变方向,由读变写,由写变读的操作。

  • 传输方向转换前,要重新产生开始条件S或者重复开始条件Sr
  • 开始或重复开始条件满足后,要重新发送从地址
  • RW位要倒转,0变1,或者1变0。
  • 如果要转换传输方向,接受设备会在产生重复开始条件前返回一个NACK。
    I2c总线协议详解_第11张图片

你可能感兴趣的:(总线协议,芯片)