add: 04_I2C/01_I2C视频介绍, 02_I2C协议

This commit is contained in:
weidongshan
2021-02-22 14:01:48 +08:00
parent 7a4d88f8be
commit 44caf0038d
31 changed files with 455 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
## I2C视频介绍
参考资料:
* I2CToolshttps://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
### 1. I2C硬件框架
![image-20210208125100022](pic/04_I2C/001_i2c_hardware_block.png)
* 在一个芯片(SoC)内部有一个或多个I2C控制器
* 在一个I2C控制器上可以连接一个或多个I2C设备
* I2C总线只需要2条线时钟线SCL、数据线SDA
* 在I2C总线的SCL、SDA线上都有上拉电阻
### 2. I2C软件框架
![image-20210219173533929](pic/04_I2C/002_i2c_software_block.png)
以I2C接口的存储设备AT24C02为例
* APP
* 提出要求:把字符串"www.100ask.net"写入AT24C02地址16开始的地方
* 它是大爷,不关心底层实现的细节
* 它只需要调用设备驱动程序提供的接口
* AT24C02驱动
* 它知道AT24C02要求的地址、数据格式
* 它知道发出什么信号才能让AT24C02执行擦除、烧写工作
* 它知道怎么判断数据是否烧写成功
* 它构造好一系列的数据发给I2C控制器
* I2C控制器驱动
* 它根据I2C协议发出各类信号I2C设备地址、I2C存储地址、数据
* 它根据I2C协议判断
### 3. 我们讲什么
#### 3.1 对于Linux
![image-20210219173436295](pic/04_I2C/003_linux_i2c_software_block.png)
从上到下:
* 先讲I2C协议
* APP可以通过两类驱动程序访问设备
* I2C设备自己的驱动程序
* 内核自带的i2c-dev.c驱动程序它是i2c控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c)
* I2C Device Driver
* I2C设备自己的驱动程序
* 内核自带的i2c-dev.c驱动程序它是i2c控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c)
* I2C Controller Driver
* 芯片I2C控制器的驱动程序(称为adapter)
* 使用GPIO模拟的I2C控制器驱动程序(i2c-gpio.c)
#### 3.2 对于单片机/裸机
![image-20210219175747702](pic/04_I2C/004_noos_i2c_software_block.png)
从上到下:
* 先讲I2C协议
* APP
* I2C Device Driver
* I2C Controller Driver(也被称为adapter)

View File

@@ -0,0 +1,153 @@
## I2C协议
参考资料:
* i2c_spec.pdf
### 1. 硬件连接
I2C在硬件上的接法如下所示主控芯片引出两条线SCL,SDA线在一条I2C总线上可以接很多I2C设备我们还会放一个上拉电阻放一个上拉电阻的原因以后我们再说
![image-20210220144722044](pic/04_I2C/005_i2c_hardware_connect.png)
### 2. 传输数据类比
怎么通过I2C传输数据我们需要把数据从主设备发送到从设备上去也需要把数据从从设备传送到主设备上去数据涉及到双向传输。
举个例子:
![image-20210220145618978](pic/04_I2C/006_teacher_and_student.png)
体育老师:可以把球发给学生,也可以把球从学生中接过来。
* 发球:
* 老师:开始了(start)
* 老师A我要发球给你(地址/方向)
* 学生A(回应)
* 老师把球发出去(传输)
* A收到球之后应该告诉老师一声回应
* 老师:结束(停止)
* 接球:
* 老师:开始了(start)
* 老师B把球发给我(地址/方向)
* 学生B
* B把球发给老师传输
* 老师收到球之后给B说一声表示收到球了回应
* 老师:结束(停止)
我们就使用这个简单的例子来解释一下IIC的传输协议
* 老师说开始了,表示开始信号(start)
* 老师提醒某个学生要发球,表示发送地址和方向(address/read/write)
* 老师发球/接球,表示数据的传输
* 收到球要回应:回应信号(ACK)
* 老师说结束表示IIC传输结束(P)
### 3. IIC传输数据的格式
#### 3.1 写操作
流程如下:
* 主芯片要发出一个start信号
* 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写0表示写1表示读)
* 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
* 主设备发送一个字节数据给从设备,并等待回应
* 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
* 数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
![image-20210220150757825](pic/04_I2C/007_i2c_write.png)
#### 3.2 读操作
流程如下:
* 主芯片要发出一个start信号
* 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写0表示写1表示读)
* 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
* 从设备发送一个字节数据给主设备,并等待回应
* 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
* 数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
![image-20210220150954993](pic/04_I2C/008_i2c_read.png)
#### 3.3 I2C信号
I2C协议中数据传输的单位是字节也就是8位。但是要用到9个时钟前面8个时钟用来传输8数据第9个时钟用来传输回应信号。传输时先传输最高位(MSB)。
* 开始信号SSCL为高电平时SDA山高电平向低电平跳变开始传送数据。
* 结束信号PSCL为高电平时SDA由低电平向高电平跳变结束传送数据。
* 响应信号(ACK)接收器在接收到8位数据后在第9个时钟周期拉低SDA
* SDA上传输的数据必须在SCL为高电平期间保持稳定SDA上的数据只能在SCL为低电平期间变化
I2C协议信号如下
![image-20210220151524099](pic/04_I2C/009_i2c_signal.png)
#### 3.4 协议细节
* 如何在SDA上实现双向传输
主芯片通过一根SDA线既可以把数据发给从设备也可以从SDA上读取数据连接SDA线的引脚里面必然有两个引脚发送引脚/接受引脚)。
* 主、从设备都可以通过SDA发送数据肯定不能同时发送数据怎么错开时间
在9个时钟里
前8个时钟由主设备发送数据的话第9个时钟就由从设备发送数据
前8个时钟由从设备发送数据的话第9个时钟就由主设备发送数据。
* 双方设备中某个设备发送数据时另一方怎样才能不影响SDA上的数据
设备的SDA中有一个三极管使用开极(极电集开发出去作为输出)电路,如下图:
![image-20210220152057547](pic/04_I2C/010_i2c_signal_internal.png)
真值表如下:
![image-20210220152134970](pic/04_I2C/011_true_value_table.png)
从真值表和电路图我们可以知道:
* 当某一个芯片不想影响SDA线时那就不驱动这个三极管
* 想让SDA输出高电平双方都不驱动三极管(SDA通过上拉电阻变为高电平)
* 想让SDA输出低电平就驱动三极管
从下面的例子可以看看数据是怎么传的(实现双向传输)。
举例主设备发送8bit给从设备
* 前8个clk
* 从设备不要影响SDA从设备不驱动三极管
* 主设备决定数据主设备要发送1时不驱动三极管要发送0时驱动三极管
* 第9个clk由从设备决定数据
* 主设备不驱动三极管
* 从设备决定数据要发出回应信号的话就驱动三极管让SDA变为0
* 从这里也可以知道ACK信号是低电平
从上面的例子就可以知道怎样在一条线上实现双向传输这就是SDA上要使用上拉电阻的原因。
为何SCL也要使用上拉电阻
在第9个时钟之后如果有某一方需要更多的时间来处理数据它可以一直驱动三极管把SCL拉低。
当SCL为低电平时候大家都不应该使用IIC总线只有当SCL从低电平变为高电平的时候IIC总线才能被使用。
当它就绪后就可以不再驱动三极管这是上拉电阻把SCL变为高电平其他设备就可以继续使用I2C总线了。
对于IIC协议它只能规定怎么传输数据数据是什么含义由从设备决定。

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -76,6 +76,9 @@ git clone https://e.coding.net/weidongshan/doc_and_source_for_drivers.git
* 16\_上机实验\_基于STM32MP157
* 18\_STM32MP157内核自带的LCD驱动不支持多buffer
* 2021.02.20 发布"I2C系统"01_I2C视频介绍
* 2021.02.22 发布"I2C系统"02_I2C协议
## 6. 联系方式

View File

@@ -0,0 +1,73 @@
## I2C视频介绍
参考资料:
* I2CToolshttps://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
### 1. I2C硬件框架
![image-20210208125100022](pic/04_I2C/001_i2c_hardware_block.png)
* 在一个芯片(SoC)内部有一个或多个I2C控制器
* 在一个I2C控制器上可以连接一个或多个I2C设备
* I2C总线只需要2条线时钟线SCL、数据线SDA
* 在I2C总线的SCL、SDA线上都有上拉电阻
### 2. I2C软件框架
![image-20210219173533929](pic/04_I2C/002_i2c_software_block.png)
以I2C接口的存储设备AT24C02为例
* APP
* 提出要求:把字符串"www.100ask.net"写入AT24C02地址16开始的地方
* 它是大爷,不关心底层实现的细节
* 它只需要调用设备驱动程序提供的接口
* AT24C02驱动
* 它知道AT24C02要求的地址、数据格式
* 它知道发出什么信号才能让AT24C02执行擦除、烧写工作
* 它知道怎么判断数据是否烧写成功
* 它构造好一系列的数据发给I2C控制器
* I2C控制器驱动
* 它根据I2C协议发出各类信号I2C设备地址、I2C存储地址、数据
* 它根据I2C协议判断
### 3. 我们讲什么
#### 3.1 对于Linux
![image-20210219173436295](pic/04_I2C/003_linux_i2c_software_block.png)
从上到下:
* 先讲I2C协议
* APP可以通过两类驱动程序访问设备
* I2C设备自己的驱动程序
* 内核自带的i2c-dev.c驱动程序它是i2c控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c)
* I2C Device Driver
* I2C设备自己的驱动程序
* 内核自带的i2c-dev.c驱动程序它是i2c控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c)
* I2C Controller Driver
* 芯片I2C控制器的驱动程序(称为adapter)
* 使用GPIO模拟的I2C控制器驱动程序(i2c-gpio.c)
#### 3.2 对于单片机/裸机
![image-20210219175747702](pic/04_I2C/004_noos_i2c_software_block.png)
从上到下:
* 先讲I2C协议
* APP
* I2C Device Driver
* I2C Controller Driver(也被称为adapter)

View File

@@ -0,0 +1,153 @@
## I2C协议
参考资料:
* i2c_spec.pdf
### 1. 硬件连接
I2C在硬件上的接法如下所示主控芯片引出两条线SCL,SDA线在一条I2C总线上可以接很多I2C设备我们还会放一个上拉电阻放一个上拉电阻的原因以后我们再说
![image-20210220144722044](pic/04_I2C/005_i2c_hardware_connect.png)
### 2. 传输数据类比
怎么通过I2C传输数据我们需要把数据从主设备发送到从设备上去也需要把数据从从设备传送到主设备上去数据涉及到双向传输。
举个例子:
![image-20210220145618978](pic/04_I2C/006_teacher_and_student.png)
体育老师:可以把球发给学生,也可以把球从学生中接过来。
* 发球:
* 老师:开始了(start)
* 老师A我要发球给你(地址/方向)
* 学生A(回应)
* 老师把球发出去(传输)
* A收到球之后应该告诉老师一声回应
* 老师:结束(停止)
* 接球:
* 老师:开始了(start)
* 老师B把球发给我(地址/方向)
* 学生B
* B把球发给老师传输
* 老师收到球之后给B说一声表示收到球了回应
* 老师:结束(停止)
我们就使用这个简单的例子来解释一下IIC的传输协议
* 老师说开始了,表示开始信号(start)
* 老师提醒某个学生要发球,表示发送地址和方向(address/read/write)
* 老师发球/接球,表示数据的传输
* 收到球要回应:回应信号(ACK)
* 老师说结束表示IIC传输结束(P)
### 3. IIC传输数据的格式
#### 3.1 写操作
流程如下:
* 主芯片要发出一个start信号
* 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写0表示写1表示读)
* 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
* 主设备发送一个字节数据给从设备,并等待回应
* 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
* 数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
![image-20210220150757825](pic/04_I2C/007_i2c_write.png)
#### 3.2 读操作
流程如下:
* 主芯片要发出一个start信号
* 然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写0表示写1表示读)
* 从设备回应(用来确定这个设备是否存在),然后就可以传输数据
* 从设备发送一个字节数据给主设备,并等待回应
* 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。
* 数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示"主→从",灰色背景表示"从→主"
![image-20210220150954993](pic/04_I2C/008_i2c_read.png)
#### 3.3 I2C信号
I2C协议中数据传输的单位是字节也就是8位。但是要用到9个时钟前面8个时钟用来传输8数据第9个时钟用来传输回应信号。传输时先传输最高位(MSB)。
* 开始信号SSCL为高电平时SDA山高电平向低电平跳变开始传送数据。
* 结束信号PSCL为高电平时SDA由低电平向高电平跳变结束传送数据。
* 响应信号(ACK)接收器在接收到8位数据后在第9个时钟周期拉低SDA
* SDA上传输的数据必须在SCL为高电平期间保持稳定SDA上的数据只能在SCL为低电平期间变化
I2C协议信号如下
![image-20210220151524099](pic/04_I2C/009_i2c_signal.png)
#### 3.4 协议细节
* 如何在SDA上实现双向传输
主芯片通过一根SDA线既可以把数据发给从设备也可以从SDA上读取数据连接SDA线的引脚里面必然有两个引脚发送引脚/接受引脚)。
* 主、从设备都可以通过SDA发送数据肯定不能同时发送数据怎么错开时间
在9个时钟里
前8个时钟由主设备发送数据的话第9个时钟就由从设备发送数据
前8个时钟由从设备发送数据的话第9个时钟就由主设备发送数据。
* 双方设备中某个设备发送数据时另一方怎样才能不影响SDA上的数据
设备的SDA中有一个三极管使用开极(极电集开发出去作为输出)电路,如下图:
![image-20210220152057547](pic/04_I2C/010_i2c_signal_internal.png)
真值表如下:
![image-20210220152134970](pic/04_I2C/011_true_value_table.png)
从真值表和电路图我们可以知道:
* 当某一个芯片不想影响SDA线时那就不驱动这个三极管
* 想让SDA输出高电平双方都不驱动三极管(SDA通过上拉电阻变为高电平)
* 想让SDA输出低电平就驱动三极管
从下面的例子可以看看数据是怎么传的(实现双向传输)。
举例主设备发送8bit给从设备
* 前8个clk
* 从设备不要影响SDA从设备不驱动三极管
* 主设备决定数据主设备要发送1时不驱动三极管要发送0时驱动三极管
* 第9个clk由从设备决定数据
* 主设备不驱动三极管
* 从设备决定数据要发出回应信号的话就驱动三极管让SDA变为0
* 从这里也可以知道ACK信号是低电平
从上面的例子就可以知道怎样在一条线上实现双向传输这就是SDA上要使用上拉电阻的原因。
为何SCL也要使用上拉电阻
在第9个时钟之后如果有某一方需要更多的时间来处理数据它可以一直驱动三极管把SCL拉低。
当SCL为低电平时候大家都不应该使用IIC总线只有当SCL从低电平变为高电平的时候IIC总线才能被使用。
当它就绪后就可以不再驱动三极管这是上拉电阻把SCL变为高电平其他设备就可以继续使用I2C总线了。
对于IIC协议它只能规定怎么传输数据数据是什么含义由从设备决定。

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB