文章目录
- 前言
- 一、I2C的使用
- 1.1 分析一种情况
- 1.2 初始化I2C总线
- 1.3 扫描可用的I2C设备
- 1.4 向指定地址写入数据
- 1.5 读取指定地址的数据
- 1.6 关闭I2C总线
- 二、示例代码
- 总结
前言
MicroPython 是一种精简的 Python 实现,旨在运行在微控制器和嵌入式系统上。在嵌入式开发中,与外部设备进行通信是一项常见任务。而 I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,适用于连接各种传感器、显示器和其他外设。在 MicroPython 中,通过 machine 模块提供的 I2C 类,可以轻松地实现对硬件 I2C 总线的控制,并与外部设备进行通信。本教程将介绍如何在 MicroPython 中使用 I2C,包括初始化 I2C 总线、发送数据、接收数据等操作,帮助初学者快速上手。
一、I2C的使用
1.1 分析一种情况
如果我去读一个存储空间使用I2C,我先要发送我要读的地址,然后从设备把我要读的内容给我返回过来,这样就完成了一次I2C的操作了
我们可以实现两个函数,一个发送地址,一个读地址上的内容。
或者实现一个函数实现了发送地址和读地址上的内容。
对于STM32 HAL库帮我们实现了这几个函数:
- 一个发送一个接收这种叫做Master模式
- 一个函数实现发送地址和接收地址叫做Mem模式
但是我们的Micropython为了简化理解,他直接实现的是Mem模式,所以我们不需要过多去纠结他。
1.2 初始化I2C总线
我们可以使用下面这个来构造一个I2C对象:
machine.I2C(scl,sda,[,freq])
其中freq为可选参数,他为I2C的速度
import machine
# 初始化 I2C 总线
i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
1.3 扫描可用的I2C设备
我们可以使用下面这个函数扫描I2C总线上是否有设备存在
他会返回一个列表:
i2c.scan()
# 扫描连接的 I2C 设备
devices = i2c.scan()
print("Connected I2C devices:", devices)
1.4 向指定地址写入数据
我们可以使用下面这个函数进行数据的写入:
i2c.writeto_mem(device_address, mem_address, data)
参数1为设备的地址,参数2为你要写入该设备的哪个地方,data为写入的数据
# 写入数据到指定设备的指定内存地址
device_address = 0x68 # 假设设备地址为 0x68
mem_address = 0x00 # 假设内存地址为 0x00
data = b'data_to_write'
i2c.writeto_mem(device_address, mem_address, data)
1.5 读取指定地址的数据
我们可以使用下面这个函数读取数据:
i2c.readfrom_mem(device_address, mem_address, 4) # 读取4个字节的数据
参数3为你要读取的字节个数,他会通过返回值返回数据
# 从指定设备的指定内存地址读取数据
device_address = 0x68 # 假设设备地址为 0x68
mem_address = 0x00 # 假设内存地址为 0x00
data = i2c.readfrom_mem(device_address, mem_address, 4) # 读取4个字节的数据
print("Data read from memory:", data)
1.6 关闭I2C总线
我们可以向下面这样关闭一个I2C总线:
# 关闭 I2C 总线
i2c.deinit()
二、示例代码
使用硬件 I2C 总线与 DS3231 实时时钟模块进行通信,读取当前时间并打印出来:
import machine
import utime
# 初始化 I2C 总线
i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
# DS3231 设备地址
device_address = 0x68
# 读取 DS3231 的时间数据
data = i2c.readfrom_mem(device_address, 0, 7)
# 解析时间数据
second = data[0]
minute = data[1]
hour = data[2]
day = data[4]
month = data[5]
year = data[6]
# 打印时间数据
print("Current time: %02d:%02d:%02d %02d/%02d/%04d" % (hour, minute, second, day, month, year + 2000))
# 关闭 I2C 总线
i2c.deinit()
总结
通过本教程,我们学习了如何在 MicroPython 中使用 I2C 进行串行通信。首先,我们介绍了 I2C 的基本原理和工作方式,包括总线、主从设备、时钟信号和数据信号等概念。然后,我们学习了如何在 MicroPython 中初始化 I2C 总线,并通过 writeto() 和 readfrom() 方法向外部设备发送数据和接收数据。最后,我们通过实际示例演示了如何与传感器等外部设备进行通信,以及如何处理可能遇到的错误和异常情况。通过本教程的学习,读者可以掌握在 MicroPython 中使用 I2C 进行通信的基本技能,为嵌入式开发项目打下良好的基础。