ESP32 使用 MicroPython:I2C 总线

本文以一个简单的例程帮助大家在 MicroPython 下使用 I2C

快速开始

from machine import Pin, I2C

# 创建一个软I2C总线实例
i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)

# 创建一个硬I2C总线实例
i2c = I2C(0)
i2c = I2C(1, scl=Pin(5), sda=Pin(4), freq=400000)

i2c.scan()              # 扫描从设备

i2c.readfrom(0x3a, 4)   # 从地址为0x3a的从设备读取4字节数据
i2c.writeto(0x3a, '12') # 将'12'写入地址为0x3a的从设备

什么是 I²C

I²C(Inter-integrated Circuit)最早是飞利浦在 1982 年开发设计的一种总线协议。I²C 总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它只需要两根信号线来完成信息交换。

硬件资源

ESP32 本身拥有 2 个 I²C 总线接口,根据用户的配置,总线接口可以用作 I²C 主机或从机模式。

然而遗憾的是,MicroPython ESP32 上的 I²C 是软件模拟的,并没有充分利用到 ESP32 的硬件资源。

理论上来讲,大部分同时支持输入与输出的 GPIO 都能够被配置为 I²C 的管脚资源。

I2C API 文档

class machine.I2C(scl, sda, freq)

scl: I²C 设备时钟引脚对象
sda: I²C 设备数据线引脚对象
freq: SCL 时钟频率 0 <freq≤ 500000(Hz)

定义 I2C

示例:

from machine import I2C, Pin
I2C = I2C(scl=Pin(5), sda=Pin(4), freq=100000)

常用类函数

I2C.init(scl, sda, freq)

函数说明:初始化构造 I²C 总线。

scl:SCL 信号线的 I/O 口
sda:SDA 信号线的 I/O 口
freq:SCL 时钟频率

示例:

I2C.init(scl=Pin(5), sda=Pin(4), freq=100000)

I2C.scan()

函数说明:扫描 0x08 到 0x77 之间的 I²C 地址,并返回设备列表。
示例:

I2C.scan()

I2C.start()

函数说明:在总线上触发 START 状态(SCL 为高电平时,SDA 转为低电平)。
示例:

I2C.start()

I2C.stop()

函数说明:在总线上触发 STOP 状态 (SCL 为高电平时,SDA 转为高电平)。
示例:

I2C.stop()

I2C.write(buf)

函数说明:buf 中的数据写入到总线,并返回写入的字节数。

buf:存储数据的缓冲区

注意:
使用 write () 函数时要与 start 函数一起使用,否则无法返回写入的字节数。
示例:

buf = b'123' 
I2C.start() 
I2C.write(buf)

I2C.readinto(buf, nack=True)

函数说明:从总线上读取数据并存放到 buf,无返回值。

buf:存储数据的缓冲区

注意:
读取的字节数是 buf 的长度。在接收到最后一个字节之前,总线将发送 ACK 信号。在接收到最后一个字节后,如果 nack 为 True,那么将发送一个 NACK 信号,否则将发送一个 ACK 信号。 示例:

buf=bytearray(3) 
I2C.readinto(buf)

标准总线操作 

下面介绍的函数是标准的 I²C 主模式读写操作。

I2C.readfrom(addr, nbytes)

函数说明:从指定地址设备读取数据,返回读取对象,这个对象与 I²C 设备有关。

addr:I²C 设备地址(可由 scan 函数读取出来)
nbytes:要读取数据的大小

示例:

>>> print(I2C.scan()) 
[24] 
>>> data = I2C.readfrom(24, 8) 
>>> print(data) 
b'\x00\x02\x00\x00\xe8\x03\xe8\x03'

I2C.readfrom_into(addr, buf)

函数说明:从指定地址设备读取 buf.len () 个数据到 buf。

addr:I²C 设备地址(可由 scan 函数读取出来)
buf:存储数据的缓冲区

示例:

>>> buf = bytearray(8) 
>>> I2C.readfrom_into(24, buf) 
>>> print(buf) 
bytearray(b'\x00\x02\x00\x00\xe8\x03\xe8\x03')

I2C.writeto(addr, buf)

函数说明:将 buf 中的数据写入设备,并返回写入数据的大小。

addr:I²C 设备地址(可由 scan 函数读取出来)
buf:存储数据的缓冲区

示例:

>>> b = bytearray(3) 
>>> b[0] = 24 
>>> b[1] = 111 
>>> b[2] = 107 
>>> i = I2C.writeto(24,b) 
3

内存操作 

某些 I²C 设备作为存储设备 (或一组寄存器) ,可以读取或者写入。这种情况下,有两个地址和 I²C 事务相关:从设备地址和内存地址。下面方法用于和这些设备进行通信。

I2C.readfrom_mem(addr, memaddr, nbytes, addrsize=8)

函数说明:从 I²C 设备的寄存器中读取并返回数据。

addr:I²C 设备地址(可由 scan 函数读取出来)
memaddr:寄存器地址
nbytes:要读取的字节大小
addrsize:指定地址大小,默认为 8 位(在 ESP8266 上这个参数无效,地址大小总是 8 位)

示例:

b = I2C.readfrom_mem(24, 0x58, 3) 
print(b)

运行结果:

b'\x00\x02\x01'

I2C.readfrom_mem_into(addr, memaddr, buf, addrsize=8)

函数说明:从 I²C 设备的寄存器中读取 buf.len () 个数据到 buf,无返回值。

addr:I²C 设备地址(可由 scan 函数读取出来)
memaddr:寄存器地址
buf:存储数据的缓冲区
addrsize:指定地址大小,默认为 8 位(在 ESP8266 上这个参数无效,地址大小总是 8 位),读取数据数量是 buf 的长度。

示例:

buf=bytearray(8) 
I2C.readfrom_mem_into(24, 0x58, buf)

I2C.writeto_mem(addr, memaddr, buf, addrsize=8)

函数说明: 将 buf 中的数据全部写入到从设备 addr 的内存 memaddr。

addr:I²C 设备地址(可由 scan 函数读取出来)
memaddr:寄存器地址
buf:存储数据的缓冲区
addrsize:指定地址大小,默认为 8 位(在 ESP8266 上这个参数无效,地址大小总是 8 位),读取数据数量是 buf 的长度。

示例:

buf = b'123' 
I2C.writeto_mem(24, 0x58, buf)
- 本文内容来自网络,如有侵权,请联系本站处理。

2024-02   阅读(463)   评论(0)
 标签: 创客 MicroPython I2C

涨知识
图灵测试

图灵测试的方法是:被测试人,和一个待测试的机器。测试时,测试人与被测试人是分开的,测试人只有以纯文本的方式向被测试人问一些问题,这些问题随便是什么问题都可以。问过一些问题后,如果测试人能够正确地分出谁是人谁是机器,那机器就没有通过图灵测试,如果测试人没有分出谁是机器谁是人,那这个机器就是有智能的。

评论:
相关文章
ESP32 MicroPython存储数据到闪存

在MicroPython的ESP32库中,NVS类用于管理非易失性存储,支持 32 位有符号整数和 二进制blob。


MicroPython umqtt库的使用

umqtt 是 MicroPython 的一个轻量级 MQTT 客户端库,使得在微控制器上使用 MQTT 协议变得简单易行。本文将介绍 umqtt 的实用方法,帮助您更好地在项目中应用这一技术。


小鹏物联网 MicroPython 图像采集方案

本方案是一个基于ESP32-CAM + 物联网的图像采集方案。


esp32cam开发板烧录micropython固件

‌ESP32-CAM与MicroPython结合可实现摄像头图像采集、视频流传输等功能,不过Micropython官方没有支持ESP32-CAM的固件,需要烧录第三方的专有固件。


小鹏物联网 MicroPython 智能浇花方案

相信很多人都有把绿植给养死的经历,可能是浇水过多、忘记浇水、较长时间不在家不能浇水等,本文介绍一种可以灵活定制的智能浇花方案。


MicroPython 开发ESP32应用之线程介绍及实例分析

MicroPython 在 ESP32 上支持线程(Thread)功能,通过_thread模块实现。线程允许程序并发执行多个任务,适合处理需要同时运行的场景,例如传感器数据采集和网络通信。


ESP32 MicroPython采集模拟传感器数值

使用了 MicroPython 库,通过 定时器(Timer) 和 ADC(模数转换器) 功能来实时读取传感器数据。使用定时器可以实现高精度、非阻塞、低资源消耗的周期性任务,保证实时性和可靠性,特别适用于嵌入式系统中的多任务处理和低功耗场景。


Raspberry Pi Pico TFT LCD 触摸屏使用教程

本教程将向您展示如何使用micropython脚本设置Pico和TFT触摸显示屏。您将学习如何使用触摸屏控制Pico以及如何在屏幕上显示信息。


ESP32 MicroPython外部引脚中断处理

本文旨在介绍如何在运行MicroPython的ESP32上使用外部引脚中断功能。


ESP32 MicroPython功耗控制

本节内容为大家讲解ESP32使用MicroPython的功耗控制方法。

搜索
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。