I2C是什么
I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在微控制器、传感器、存储器芯片等设备之间进行通信。它是由飞利浦(Philips)公司在1982年开发的,后来成为一种标准。I2C使用两条线(SDA和SCL)进行数据传输,支持多主机和多从机的连接。它具有简单、灵活、低成本等特点,广泛应用于各种电子设备中。通讯格式有点像上世纪的打电话,先说自己要找谁,然后那个人给一个应答,我就说自己的讲话内容。
ESP32的I2C
I2C 使用两条双向开漏线:串行数据线 (SDA) 和串行时钟线 (SCL),通过电阻上拉。ESP32 有 2 个 I2C 控制器(也被称为端口),负责处理 I2C 总线上的通信。
单个 I2C 控制器既可以是主机也可以是从机。
通常,I2C 从机设备具有 7 位地址或 10 位地址。ESP32 支持 I2C 标准模式 (Sm) 和快速模式 (Fm),可分别达到 100 kHz 和 400 kHz。主机模式的 SCL 时钟频率不应大于 400 kHz。
选择哪种模式跟连接的模块有关系。看模块说明书。
MicroPython I2C
硬件和软件 I2C 实现都通过 machine.I2C 和 machine.SoftI2C类存在 。硬件 I2C 使用系统的底层硬件支持来执行读/写,并且通常高效且快速,但可能对可以使用的引脚有限制。软件 I2C 是通过位组合实现的,可以在任何引脚上使用,但效率不高。这些类具有相同的可用方法,主要区别在于它们的构造方式。
软件是指高低电平起伏模拟协议波形,硬件是指对引脚IO的寄存器操作。以后我发个合泰的I2C比较明白。
from machine import I2C
i2c = I2C(freq=400000) # create I2C peripheral at frequency of 400kHz
# depending on the port, extra parameters may be required
# to select the peripheral and/or pins to use
i2c.scan() # scan for slaves, returning a list of 7-bit addresses
i2c.writeto(42, b'123') # write 3 bytes to slave with 7-bit address 42
i2c.readfrom(42, 4) # read 4 bytes from slave with 7-bit address 42
i2c.readfrom_mem(42, 8, 3) # read 3 bytes from memory of slave 42,
# starting at memory-address 8 in the slave
i2c.writeto_mem(42, 2, b'\x10') # write 1 byte to memory of slave 42
# starting at address 2 in the slave