IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器以及其外围设备,IIC也被称为I2C,其实两者是完全相同的,只是名词不一样而已。 它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。IIC 接口使用主机和从机的概念,通常一个主机会搭配一个或多个从机,主机负责启动和结束通信会话,QuecPython 支持的蜂窝通信模组目前仅做主机。
IIC拓扑结构如下:
应答信号时序:接收端收到有效数据后向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。 当SDA是低电平为有效应答(ACK),表示对方接收成功;当SDA是高电平为无效应答(NACK),表示对方没有接收成功。
数据传输时序:SCL低电平时,允许数据位变化。每8Bits数据传输完成后,从机将拉低SDA线,回传主机一位ACK信号;或拉高SDA线,回传主机一位NACK信号。
所有模组都支持硬件IIC,且都支持100k和400k两种频率;
软件模拟IIC是一种使用普通的GPIO引脚,通过软件控制引脚的电平变化,来模拟IIC协议的通信方式。 当芯片自带的IIC个数无法满足需求或者所用引脚被其他功能占用时,可以使用软件模拟IIC接口来实现功能。
当前部分模组可支持模拟IIC,频率可在1~100k范围内设置,具体设置频率方法见WIKI-I2C_simulation。 支持模拟IIC模组如下:
主要介绍如何使用 IIC 驱动程序的功能和数据类型在 QuecPython系列模组 与其他 IIC 设备之间建立通信。典型的编程工作流程分为以下几节:
详细API介绍请参考machine.IIC
创建IIC对象时,需要设置IIC通道和工作模式。
class machine.I2C(I2Cn, MODE)
参数介绍以及引脚对应关系请参考machine.IIC
创建对象时,需注意以下几点:
I2C.write(slaveaddress, addr, addr_len, data, datalen)
发送IIC数据时,需注意以下几点:
API介绍请参考machine.UART.write
I2C.read(slaveaddress, addr, addr_len, r_data, datalen, delay)
接收数据,需要注意以下几点:
1. 缓冲区管理: 正确管理接收缓冲区是非常重要的。如果在数据还没有读取完成就被新的数据覆盖,可能会导致数据丢失。因此,需要确保在数据被新的数据覆盖前能够及时读取和处理。
2. delay参数设置: 由于部分IIC外设芯片收到主机写数据指令后需要延时才能正常返回数据,所以在模组(主机)发送完写指令后延时一段时间再读取IIC外设芯片数据,如图:
API及参数含义介绍请参考machine.UART.read
QMA7981是一款单芯片三轴加速度计,集成了加速度传感器与信号调理ASIC,可以检测倾斜,运动,冲击和振动。 可应用于检测屏幕旋转,步数计数,睡眠质量,移动和可穿戴智能设备中的游戏和个人导航等。 QMA7981有以下特点:
QMA7981使用时需注意如下几点:
self.extint = ExtInt(INT1, ExtInt.IRQ_RISING, ExtInt.PULL_PD, self.ext_cb)
data = self._read([self.INTPIN_CONF_ADDR], 1)
# set logic high as active level for INT1 pin
data[0] |= 0x01
print('INTPIN_CONF_ADDR: {}'.format(data))
self._write([self.INTPIN_CONF_ADDR], [data[0]])
AHT10 配有一个全新设计的 ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件。主要引用场景有: 暖通空调 、除湿器、测试及检测设备、消费品、汽车 、自动控制、数据记录器、气象站、家电、湿度调节、医疗及其他相关温湿度检测控制。
AHT10工作流程如下:
下表为从机返回的状态位说明。
def Trigger_measurement(self):
# Trigger data conversion
self.write_data([self.AHT10_START_MEASURMENT_CMD, 0x33, 0x00])
time.sleep_ms(200) # at last delay 75ms
# check has success
r_data = self.read_data(6)
# check bit7
if (r_data[0] >> 7) != 0x0:
print("Conversion has error")
else:
self.aht10_transformation_temperature(r_data[1:6])
温度 T可以通过将温度输出信号 ST 代入到下面的公式计算得到
def aht10_transformation_temperature(self, data):
r_data = data
# Convert raw data into temperature and humidity
humidity = (r_data[0] << 12) | (
r_data[1] << 4) | ((r_data[2] & 0xF0) >> 4)
humidity = (humidity/(1 << 20)) * 100.0
print("current humidity is {0}%".format(humidity))
temperature = ((r_data[2] & 0xf) << 16) | (
r_data[3] << 8) | r_data[4]
temperature = (temperature * 200.0 / (1 << 20)) - 50
print("current temperature is {0}°C".format(temperature))
AHT10详细驱动可参考AHT10驱动
IIC是一种非常简单和直接的通信协议,在实际应用中遇到的问题也比较少。
1. 数据接收或者接收一直失败
这可能是由于几种原因引起的,包括:波特率设置错误、硬件连接问题等。故障排查步骤可能包括:
2. 可以正常进行收发,但是有错误数据
可能是以下几个原因:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。