前言
学习永无止境!本篇是嵌入式开发之片上外设I2C,了解基本硬件原理以及通信协议,实现软件模拟通信与硬件外设通信。
注:本文章为学习笔记,部分图片与文字来源于网络/江协科技课程/手册,如侵权请联系!谢谢!
一、I2C通信概述
1.1 I2C基本概念
I2C总线是Philips公司在八十年代初推出的一种串行同步、半双工的总线,主要用于近距离、低速的芯片之间的通信。
I2C总线有两根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步。
I2C通讯总线中可以连接多个设备(有一主多从、多主多从模式),每个设备都有一个独立地址,主机可以利用地址进行不同设备通信。
1.2 I2C物理层
- 信号线:共两条信号线,分别是SCL(时钟线)、SDA(数据线),设备挂在两条总线上;
- 电平:总线通过上拉电阻(一般4.7K),连接到电源,当I2C设备空闲时,会输出高组态,所有设备都空闲时,由上拉电阻将总线拉成高电平。
1.3 I2C协议层
① 基本时序: I2C的协议定义了通信的起始位、数据有效性、响应、仲裁、时钟同步与地址广播等环节。
- 起始条件:SCL处于高电平,SDA由高电平变为低电平(产生下降沿);
- 发送数据:SCL低电平时,主机将数据放在SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间不允许SDA变化,依次循环8次,可发送一个字节数据;
- 接收应答:主机在发送完一个字节后,释放SDA,在下个时钟接收一个数据,判断从机是否应答(0表示应答,1表示非应答);
- 接收数据:SCL低电平时,从机将数据放在SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间不允许SDA变化,依次循环8次,可接收一个字节数据;
- 发送应答:主机接收完一个字节之后,在下个时钟发送一位数据,0表示应答,1表示非应答;
- 终止条件:SCL处于高电平,SDA由低电平变为高电平(产生上升沿)。
② I2C完整时序:主要有指定地址写、当前地址读、指定地址读三种。
注:S(起始信号),RA(接收应答),P(停止信号),R/W(R=1,W=0)。
- 指定地址写:指定设备(Slave Address+W)+指定地址(Reg Address)+写入数据(Data);