I2C通信
•
I2C
(
Inter IC Bus
)是由
Philips
公司开发的一种通用数据总线
•
两根通信线:
SCL
(
Serial Clock
)、
SDA
(
Serial Data
)
•
同步,半双工
•
带数据应答
•
支持总线挂载多设备(一主多从、多主多从)
第一个图片是MPU6050模块(进行姿态测量)
第二个图片是OLED模块,可以显示图片字符
第三个图片是AT24C02,存储器模块
第四个图片DS3231(实时时钟模块)
第一块就是介绍协议规则,然后用软件模拟的形式来实现协议啊。
第二块就是介绍s三二的I2C外设,然后用硬件来实现协议
第二块就是介绍s三二的I2C外设,然后用硬件来实现协议
要求一:把全双工变为半双工
要求二:增加应答机制
要求三:要求这一根线上能同时接多个模块。
单面积可以指定和任意一个模块通信,同时,单面积在跟某个模块进行通信时,其他模块不能对正常通信产生干扰
单面积可以指定和任意一个模块通信,同时,单面积在跟某个模块进行通信时,其他模块不能对正常通信产生干扰
要求四:同步时序,加一条时钟线来知道对方读写(对传输时间要求不高,单片机可以随时暂停传输,去处理其他事情)
硬件电路
•
所有
I2C
设备的
SCL
连在一起,
SDA
连在一起
•
设备的
SCL
和
SDA
均要配置成开漏输出模式(下端接地,上端断开,这是为了避免总线没协调好导致电源短路这个问题,禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构)
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
I2C时序基本单元
•
起始条件:
SCL
高电平期间,
SDA
从高电平切换到低电平
•
终止条件:
SCL
高电平期间,
SDA
从低电平切换到高电平
起始和终止都是由主机产生的,从机不允许产生,所以在主线空闲时,从机必须始终双手放开,不允许主动跳出,触碰主线
•
发送一个字节:
SCL
低电平期间,主机将数据位依次放到
SDA
线上(高位先行),然后释放
SCL
,从机将在
SCL
高电平期间读取数据位,所以
SCL
高电平期间
SDA
不允许有数据变化,依次循环上述过程
8
次,即可发送一个字节
•
接收一个字节:
SCL
低电平期间,从机将数据位依次放到
SDA
线上(高位先行),然后释放
SCL
,主机将在
SCL
高电平期间读取数据位,所以
SCL
高电平期间
SDA
不允许有数据变化,依次循环上述过程
8
次,即可接收一个字节(主机在接收之前,需要释放
SDA
)
应答机制
•
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据
0
表示应答,数据
1
表示非应答
•
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据
0
表示应答,数据
1
表示非应答(主机在接收之前,需要释放
SDA
)
I2C时序
•
指定地址写
•
对于指定设备(
Slave Address
),在指定地址(
Reg Address
)下,写入指定数据(
Data
)
第一个寻找从机地址
第二个寻找存储数据的地址
第三个寻找存储数据
•
当前地址读
•
对于指定设备(
Slave Address
),在当前地址指针(指针上电默认)指示的地址下,读取从机数据(
Data
)
第一个寻找从机地址
第二个(无指定地址环节)
指针上电默认零地址,每写入一个字节和读出一个字节后,指针就会自动自增一次移动到下一个位置,当主机没有要求读取哪个地址,从机就会返回当前指针指向的寄存器的值,
指定地址读
•
指定地址读
•
对于指定设备(
Slave Address
),在指定地址(
Reg Address
)下,读取从机数据(
Data
)
把指定地址写后面写的部分去掉,然后把前面追加到当前地址读时序的前面(复合时序)。
1寻址
2用来指定地址
3再来一个起始条件(先起始,再重复起始再终止)。