其他分享
首页 > 其他分享> > rk3288 I2C-原理学习

rk3288 I2C-原理学习

作者:互联网

I2C介绍

I2C硬件框架

硬件连接图

I2C软件框架

软件框架图

I2C协议学习

I2C协议

I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。
起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。
I2C起始结束
传输数据流程:数据传输以字节为单位,主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位, 此时才认为一个字节真正的被传输完成
I2C数据流程
主设备在传输有效数据之前需要先指定从设备地址,地址指定过程和上面数据传输过程一样,只不过大多数从设备的地址是7位,协议规定添加一个最低位,用来表示数据传输方向,0表示主设备向从设备写数据1表示主设备向从设备读数据
指定设备发送数据的格式,如下图所示,(每一最小包数据由9bit组成,8bit内容+1bit ACK, 如果是地址数据,则8bit包含1bit方向)
指定设备发送数据

主设备往从设备写数据

在这里插入图片描述

主设备往从设备读数据

在这里插入图片描述

主设备往从设备写数据,重启起始条件,然后往从设备读取数据

在这里插入图片描述

SMBUS协议

SMBus最初的目的是为了智能电池、充电电池、其他微控制器之间的通信链路而定义的。
SMBus为系统和电源管理这样的任务提供了一条控制总线,使用SMBus的系统,设备之间发送和接手消息都是通过SMBus,而不是使用单独的控制线,这样可以节省设备管脚数。SMBus是I2C协议的子集。

I2CSMBus
VDD范围很广,0~12v1.8V~5V
最小时钟频率时钟频率最小值无限制时钟频率最小值是10KHz
最大的Clock Stretching1没有限制有限制
地址回应(Address Acknowledge)没有强制要求必须发出回应信号强制要求必须发出回应信号2
数据的传输格式只定义了如何传输数据,格式由设备定义定义了几种数据格式(后面分析)
重复发出S信号(REPEATED START Condition)需要发送S信号可以不发出P信号,而是直接发出S信号3
低功耗版本( Low Power Version)

1. symbol符号

2. SMBus Quick Command Protocal

在这里插入图片描述
只是用来发送一位数据:R/W#本意是用来表示读或写,但是在SMBus里可以用来表示其他含义。 比如某些开关设备,可以根据这一来决定是打开还是关闭。

Functionality flag4: I2C_FUNC_SMBUS_QUICK

3. SMBus Receive Byte

在这里插入图片描述
I2C-tools中的函数:i2c_smbus_read_byte(),读取一个字节,Host adapter接收到一个字节后不需要发出回应信号(上图中N表示不回应)。
Functionality flag4: I2C_FUNC_SMBUS_READ_BYTE

4. SMBus Send Byte

在这里插入图片描述
I2C-tools中的函数:i2c_smbus_write_byte(), 发送一个字节
Functionality flag4: I2C_FUNC_SMBUS_WRITE_BYTE

5. SMBus Read Byte

在这里插入图片描述I2C-tools中的函数:i2c_smbus_read_byte_data()。 先发出Command Code(它一般表示芯片内部的寄存器地址),再读取1个字节的数据。 上面介绍的SMBus Receive Byte是不发Comand,直接读取数据。
Functionality flag4: I2C_FUNC_SMBUS_READ_BYTE_DATA

6. SMBus Read Word

在这里插入图片描述I2C-tools中的函数:i2c_smbus_read_word_data()。先发出Command Code(它一般表示芯片内部的寄存器地址),再读取2个字节的数据。
Functionality flag4: I2C_FUNC_SMBUS_READ_WORD_DATA

7. SMBus Write Byte

在这里插入图片描述
I2C-tools中的函数:i2c_smbus_write_byte_data()。 先发出Command Code(它一般表示芯片内部的寄存器地址),再发出1个字节的数据。
Functionality flag4: I2C_FUNC_SMBUS_WRITE_BYTE_DATA

8. SMBus Write Word

在这里插入图片描述
I2C-tools中的函数:i2c_smbus_write_word_data()。 先发出Command Code(它一般表示芯片内部的寄存器地址),再发出1个字节的数据。
Functionality flag4: I2C_FUNC_SMBUS_WRITE_WORD_DATA

9. SMBus Block Read

在这里插入图片描述I2C-tools中的函数:i2c_smbus_read_block_data()。
发出Command Code(它一般表示芯片内部的寄存器地址),再发起度操作:

10. SMBus Block Write

在这里插入图片描述
I2C-tools中的函数:i2c_smbus_write_block_data()。 先发出Command Code(它一般表示芯片内部的寄存器地址),再发出1个字节的Byte Conut(表示后续要发出的数据字节数),最后发全部数据
Functionality flag4: I2C_FUNC_SMBUS_WRITE_BLOCK_DATA

11. I2C Block Read

在一般的I2C协议中,也可以连续读出多个字节。 它跟SMBus Block Read的差别在于设备发出的第1个数据不是长度N,如下图
示:
在这里插入图片描述
I2C-tools中的函数:i2c_smbus_read_i2c_block_data()。
先发出Command Code(它一般表示芯片内部的寄存器地址),再接收所有数据
Functionality flag4: I2C_FUNC_SMBUS_READ_I2C_BLOCK

12. I2C Block Write

在一般的I2C协议中,也可以连续发出多个字节。 它跟SMBus Block Write的差别在于发出的第1个数据不是长度N,如下图所示:
在这里插入图片描述
I2C-tools中的函数:i2c_smbus_write_i2c_block_data()。
先发出Command Code(它一般表示芯片内部的寄存器地址),再发全部数据
Functionality flag4: I2C_FUNC_SMBUS_WRITE_I2C_BLOCK

13. SMBus Block Write - Block Read Process Call

在这里插入图片描述先写一块数据,再读一块数据。
Functionality flag4: I2C_FUNC_SMBUS_BLOCK_PROC_CALL

14. Packet Error Checking (PEC)

PEC是一种错误校验码,如果使用PEC,那么在P信号之前,数据发送方要发送一个字节的PEC码(它是CRC-8码)。
以SMBus Send Byte为例,下图中,一个未使用PEC,另一个使用PEC:
在这里插入图片描述
在这里插入图片描述


  1. 某个设备需要更多时间进行内部的处理时,它可以把SCL拉低占住I2C总线 ↩︎

  2. 这样对方才知道该设备的状态:busy,failed,或是被移除了 ↩︎

  3. 这个S信号就是REPEATED START ↩︎

  4. Functionality flag是Linux的某个I2C控制器驱动所支持的功能,比如I2C_FUNC_SMBUS_QUICK,表示需要I2C控制器支持SMBus Quick Command。 ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

标签:SMBus,字节,SMBUS,FUNC,rk3288,原理,I2C,设备
来源: https://blog.csdn.net/ch122633/article/details/116083290