QuecPython+llC使用介绍

IIC 概述

IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,

用于连接微控制器以及其外围设备,IIC也被称为I2C,其实两者是完全相同的,只是名词不一样而已。它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。IIC 接口使用主机和从机的概念,通常一个主机会搭配一个或多个从机,主机负责启动和结束通信会话,QuecPython 支持的蜂窝通信模组目前仅做主机。

IIC拓扑结构如下:

  • 数据线SDA:用来传输数据;时钟线SCL:用来同步数据收发。

  • 总线上每一个器件都有一个唯一的地址识别,所以我们只需要知道器件的地址,根据时序就可以实现微控制器与器件之间的通信。

  • 数据线SDA和时钟线SCL都是双向线路,都通过一个电流源或上拉电阻连接到正的电压,所以当总线空闲的时候,这两条线路都是高电平。

  • 总线上数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s

IIC 通信时序介绍

当SDA是低电平为有效应答(ACK),表示对方接收成功;当SDA是高电平为无效应答(NACK),表示对方没有接收成功。

  • 数据传输时序:SCL低电平时,允许数据位变化。每8Bits数据传输完成后,从机将拉低SDA线,回传主机一位ACK信号;或拉高SDA线,回传主机一位NACK信号。

软件模拟IIC

软件模拟IIC是一种使用普通的GPIO引脚,通过软件控制引脚的电平变化,来模拟IIC协议的通信方式。
当芯片自带的IIC个数无法满足需求或者所用引脚被其他功能占用时,可以使用软件模拟IIC接口来实现功能。

功能概述

主要介绍如何使用 IIC 驱动程序的功能和数据类型在 QuecPython系列模组 与其他 IIC 设备之间建立通信。典型的编程工作流程分为以下几节:

  1. 创建对象

  2. 发送数据

  3. 接收数据

详细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外设芯片数据,如图:

API及参数含义介绍请参考machine.UART.read