IIC 概述
IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,
用于连接微控制器以及其外围设备,IIC也被称为I2C,其实两者是完全相同的,只是名词不一样而已。它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。IIC 接口使用主机和从机的概念,通常一个主机会搭配一个或多个从机,主机负责启动和结束通信会话,QuecPython 支持的蜂窝通信模组目前仅做主机。
IIC拓扑结构如下:
-
数据线SDA:用来传输数据;时钟线SCL:用来同步数据收发。
-
总线上每一个器件都有一个唯一的地址识别,所以我们只需要知道器件的地址,根据时序就可以实现微控制器与器件之间的通信。
-
数据线SDA和时钟线SCL都是双向线路,都通过一个电流源或上拉电阻连接到正的电压,所以当总线空闲的时候,这两条线路都是高电平。
-
总线上数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s
IIC 通信时序介绍
-
空闲电平:SCL和SDA均为高电平
-
起始信号时序:SCL为高电平(空闲)时,SDA由高电平到低电平的跳变
-
结束信号时序:SCL为高电平(空闲)时,SDA由低电平到高电平的跳变
-
应答信号时序:接收端收到有效数据后向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。
当SDA是低电平为有效应答(ACK),表示对方接收成功;当SDA是高电平为无效应答(NACK),表示对方没有接收成功。
-
数据传输时序:SCL低电平时,允许数据位变化。每8Bits数据传输完成后,从机将拉低SDA线,回传主机一位ACK信号;或拉高SDA线,回传主机一位NACK信号。
软件模拟IIC
软件模拟IIC是一种使用普通的GPIO引脚,通过软件控制引脚的电平变化,来模拟IIC协议的通信方式。
当芯片自带的IIC个数无法满足需求或者所用引脚被其他功能占用时,可以使用软件模拟IIC接口来实现功能。
功能概述
主要介绍如何使用 IIC 驱动程序的功能和数据类型在 QuecPython系列模组 与其他 IIC 设备之间建立通信。典型的编程工作流程分为以下几节:
-
创建对象
-
发送数据
-
接收数据
详细API介绍请参考machine.IIC
创建对象
创建IIC对象时,需要设置IIC通道和工作模式。
class machine.I2C(I2Cn, MODE)
参数介绍以及引脚对应关系请参考machine.IIC
创建对象时,需注意以下几点:
-
在一个项目中,一个通道只能创建一次对象,当使用一个通道的IIC与多个IIC外设芯片通信时只需在其中一个外设驱动中进行创建IIC对象。
-
标准模式下IIC通信波特率为100k,快速模式下IIC通信波特率为400k,注意设置波特率不能高于IIC外设芯片最高能支持波特率。
发送数据
I2C.write(slaveaddress, addr, addr_len, data, datalen)
发送IIC数据时,需注意以下几点:
-
slaveaddress为从机地址,是一个7bit的数值。在主机发送从机地址时会将slaveaddress值左移一位,当向从机写入数据时最低位补0,当读取从机数据时最低位补1。例如某IIC外设芯片从机地址为0x23,当向外设芯片发送数据时主机应发送0x46,当读取外设芯片数据时主机应发送0x47。
-
addr_len为寄存器地址长度,寄存器地址长度可从外设芯片数据手册中确认,目前经常用到的IIC外设芯片的寄存器地址长度一般是一个字节,如QMA7981三轴传感器芯片。
API介绍请参考machine.UART.write
接收数据
I2C.read(slaveaddress, addr, addr_len, r_data, datalen, delay)
接收数据,需要注意以下几点:
1. 缓冲区管理: 正确管理接收缓冲区是非常重要的。如果在数据还没有读取完成就被新的数据覆盖,可能会导致数据丢失。因此,需要确保在数据被新的数据覆盖前能够及时读取和处理。
2. delay参数设置: 由于部分IIC外设芯片收到主机写数据指令后需要延时才能正常返回数据,所以在模组(主机)发送完写指令后延时一段时间再读取IIC外设芯片数据,如图:





