【雕爷学编程】MicroPython手册之 ESP32-C3 Hardware I2C bus

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

在这里插入图片描述
ESP32-C3是一款由乐鑫科技开发的物联网芯片,它具有以下主要特性:

搭载 RISC-V 32 位单核处理器,时钟频率高达 160 MHz,支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE)。
内置 400 KB SRAM,384 KB ROM,支持最大 16 MB 的外置 Flash。
集成了天线开关、射频巴伦、功率放大器、接收低噪声放大器、滤波器、电源管理模块等功能,仅需要 20 余个外围元件。
具有 22 个可编程 GPIO 管脚,支持 ADC、SPI、UART、I2C、I2S、RMT、TWAI 和 PWM。
具有完善的安全机制,包括安全启动、Flash 加密、数字签名和 HMAC 外设、世界控制器模块等。
沿用乐鑫成熟的物联网开发框架 ESP-IDF,支持 Arduino 和 MicroPython 等开源平台。

在这里插入图片描述

MicroPython的ESP32-C3支持硬件I2C(I²C)总线,下面是对ESP32-C3 Hardware I2C总线的主要特点、应用场景以及需要注意的事项的详细解释:

主要特点:

硬件支持:ESP32-C3的Hardware I2C总线是通过硬件模块来实现的,具有专用的I2C控制器。相较于软件I2C总线,硬件I2C总线可以提供更高的性能和更可靠的通信。

高速传输:硬件I2C总线支持高速数据传输,可以达到几百kHz甚至几兆Hz的速度。这使得它适用于需要高速数据传输的应用场景。

硬件缓冲区:硬件I2C总线具有专用的硬件缓冲区,可以在数据传输过程中自动处理数据的接收和发送,减轻了CPU的负担。

多设备支持:硬件I2C总线支持多个I2C设备的连接。每个设备都有独立的地址,通过硬件I2C总线可以与这些设备进行并行通信和控制。

应用场景:

外设接口:硬件I2C总线适用于连接各种I2C外设设备,如传感器、存储器、显示器、扩展模块等。通过与这些设备进行高速通信,可以实现数据采集、控制和交互等功能。

实时应用:硬件I2C总线的高速传输和硬件支持使其在实时应用中非常有用。例如,控制系统或实时监测系统可以使用硬件I2C总线与多个外设设备进行快速而可靠的通信。

物联网应用:硬件I2C总线广泛应用于物联网设备中,如智能家居、传感器网络和物联网网关等。它可以用于与各种I2C设备进行数据传输和通信,实现数据采集、控制和互联。

嵌入式系统:由于硬件I2C总线的高性能和可靠性,它常常用于嵌入式系统中,尤其是对实时性能和稳定性要求较高的应用。例如,嵌入式控制器、工业自动化设备等。

需要注意的事项:

引脚选择:在使用Hardware I2C总线时,需要仔细选择和配置用于SCL(时钟线)和SDA(数据线)的GPIO引脚。确保这些引脚没有冲突,并与所连接的外设设备兼容。

电平转换:在与其他设备进行通信时,需要注意电平转换的问题。某些设备可能需要使用电平转换器来匹配不同的电平标准,以确保数据传输的正确性和稳定性。

I2C地址冲突:由于硬件I2C总线支持多个设备连接,需要确保每个设备都有唯一的I2C地址。避免I2C地址冲突可以通过调整设备的地址或使用可编程的I2C设备来实现。

时钟速度和数据传输模式:根据所连接的外设设备的要求,需要选择合适的时钟速度和数据传输模式。不同的设备可能对时钟速度和传输模式有特定的要求,需要进行适当的配置。

总结:MicroPython的ESP32-C3 Hardware I2C总线主要特点包括硬件支持、高速传输、硬件缓冲区和多设备支持。它适用于外设接口、实时应用、物联网应用和嵌入式系统。在使用Hardware I2C总线时,需要注意引脚选择、电平转换、I2C地址冲突以及时钟速度和数据传输模式的配置。

案例一:读取温度传感器数据

from machine import I2C, Pin
import time

# 初始化I2C总线
i2c = I2C(scl=Pin(22), sda=Pin(21))

# 温度传感器的I2C地址
TEMP_SENSOR_ADDR = 0x40

# 读取温度数据的寄存器地址
TEMP_REG_ADDR = 0x00

# 读取温度数据的函数
def read_temperature():
    data = i2c.readfrom_mem(TEMP_SENSOR_ADDR, TEMP_REG_ADDR, 2)
    temp = (data[0] << 8 | data[1]) * 0.0625
    return temp

while True:
    temp = read_temperature()
    print("Temperature: {:.2f}°C".format(temp))
    time.sleep(1)

要点解读:
导入所需的库,包括machine、time。
初始化I2C总线,设置时钟和数据线引脚。
定义温度传感器的I2C地址和读取温度数据的寄存器地址。
编写一个函数read_temperature(),用于从温度传感器读取数据。
在主循环中,调用read_temperature()函数获取温度值,并打印出来。
每隔1秒读取一次温度数据。

案例二:控制LED灯

from machine import Pin
import time

# 初始化LED灯引脚
led = Pin(2, Pin.OUT)

while True:
    led.value(not led.value())  # 切换LED灯的状态
    time.sleep(1)

要点解读:
导入所需的库,包括machine和time。
初始化LED灯引脚,设置为输出模式。
在主循环中,通过改变LED灯引脚的值来切换LED灯的状态。
每隔1秒切换一次LED灯的状态。

案例三:读取加速度计数据

from machine import I2C, Pin
import time

# 初始化I2C总线
i2c = I2C(scl=Pin(22), sda=Pin(21))

# 加速度计的I2C地址
ACCEL_SENSOR_ADDR = 0x68

# 读取加速度计数据的寄存器地址
ACCEL_REG_ADDR = 0x3B

# 读取加速度计数据的函数
def read_acceleration():
    data = i2c.readfrom_mem(ACCEL_SENSOR_ADDR, ACCEL_REG_ADDR, 6)
    x = (data[0] << 8 | data[1]) / 16384.0
    y = (data[2] << 8 | data[3]) / 16384.0
    z = (data[4] << 8 | data[5]) / 16384.0
    return x, y, z

while True:
    accel_x, accel_y, accel_z = read_acceleration()
    print("Acceleration: X={:.2f}, Y={:.2f}, Z={:.2f}".format(accel_x, accel_y, accel_z))
    time.sleep(1)

要点解读:
导入所需的库,包括machine和time。
初始化I2C总线,设置时钟和数据线引脚。
定义加速度计的I2C地址和读取加速度计数据的寄存器地址。
编写一个函数read_acceleration(),用于从加速度计读取数据。
在主循环中,调用read_acceleration()函数获取加速度计的数据,并打印出来。
每隔1秒读取一次加速度计的数据。

案例四:使用I2C总线进行设备通信

import machine  
  
# 初始化I2C总线  
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=100000)  
  
# 发送从设备地址和要读取的寄存器地址  
i2c.writeto_mem(0x70, bytearray([0x00, 0x01]))  
  
# 读取从设备数据  
data = i2c.readfrom_mem(0x70, 2)  
  
# 解析读取的数据  
value = (data[0] << 8) | data[1]  
print(value)

要点解读:这个例子展示了如何使用I2C总线与其他设备进行通信。首先,我们初始化了I2C总线并设置了SCL和SDA引脚以及频率。然后,我们通过writeto_mem方法向从设备发送地址和要读取的寄存器地址。接着,我们使用readfrom_mem方法从从设备读取两个字节的数据,并将其解析为一个整数。最后,我们打印出读取的值。

案例五:使用I2C总线控制LED灯

import machine  
import time  
  
# 初始化I2C总线  
i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21), freq=100000)  
  
# 定义LED灯的地址和寄存器地址  
LED_ADDR = 0x39  
LED_REG = 0x01  
  
# 设置LED灯的亮度(0-255)  
brightness = 128  
  
# 发送控制命令到LED灯  
i2c.writeto_mem(LED_ADDR, bytearray([brightness]))  
  
# 等待一段时间,然后关闭LED灯  
time.sleep(5)  
i2c.writeto_mem(LED_ADDR, bytearray([0]))

要点解读:这个例子展示了如何使用I2C总线控制LED灯。首先,我们初始化了I2C总线并定义了LED灯的地址和寄存器地址。然后,我们设置了LED灯的亮度,通过向指定的寄存器地址写入一个字节的值来实现。最后,我们等待一段时间后关闭LED灯。注意,具体的LED灯控制方式取决于其硬件电路设计。本例中的代码仅供参考,需要根据实际情况进行调整。

案例六:读取加速度计数据

from machine import I2C, Pin
import time

# 初始化I2C总线
i2c = I2C(scl=Pin(22), sda=Pin(21))

# 加速度计的I2C地址
ACCEL_SENSOR_ADDR = 0x68

# 读取加速度计数据的寄存器地址
ACCEL_REG_ADDR = 0x3B

# 读取加速度计数据的函数
def read_acceleration():
    data = i2c.readfrom_mem(ACCEL_SENSOR_ADDR, ACCEL_REG_ADDR, 6)
    x = (data[0] << 8 | data[1]) / 16384.0
    y = (data[2] << 8 | data[3]) / 16384.0
    z = (data[4] << 8 | data[5]) / 16384.0
    return x, y, z

while True:
    accel_x, accel_y, accel_z = read_acceleration()
    print("Acceleration: X={:.2f}, Y={:.2f}, Z={:.2f}".format(accel_x, accel_y, accel_z))
    time.sleep(1)

要点解读:
导入所需的库,包括machine和time。
初始化I2C总线,设置时钟和数据线引脚。
定义加速度计的I2C地址和读取加速度计数据的寄存器地址。
编写一个函数read_acceleration(),用于从加速度计读取数据。
在主循环中,调用read_acceleration()函数获取加速度计的数据,并打印出来。
每隔1秒读取一次加速度计的数据。

案例七:与I2C设备通信

import machine

i2c = machine.I2C(0, scl=machine.Pin(3), sda=machine.Pin(2), freq=100000)

while True:
    i2c.writeto(0x50, b"Hello, I2C!")
    machine.delay(1000)

要点解读:
代码使用machine.I2C创建一个硬件I2C对象,并指定硬件I2C总线的编号以及引脚连接和频率。
在循环中,使用i2c.writeto()向I2C设备发送数据,这里发送了字符串"Hello, I2C!"。
使用machine.delay()进行延迟,这里延迟1秒钟。

案例八:读取I2C设备数据

import machine

i2c = machine.I2C(0, scl=machine.Pin(3), sda=machine.Pin(2), freq=100000)

while True:
    i2c.writeto(0x50, b"\x01")
    data = i2c.readfrom(0x50, 4)
    print("Received data:", data)
    machine.delay(1000)

要点解读:
代码与前一个示例类似,使用machine.I2C创建一个硬件I2C对象,并指定硬件I2C总线的编号以及引脚连接和频率。
在循环中,首先使用i2c.writeto()向I2C设备发送命令字节\x01,然后使用i2c.readfrom()从I2C设备读取4个字节的数据。
将接收到的数据打印输出,并使用machine.delay()延迟1秒钟。

案例九:I2C设备数据传输

import machine

i2c = machine.I2C(0, scl=machine.Pin(3), sda=machine.Pin(2), freq=100000)

while True:
    tx_data = b"\x01\x02\x03\x04"
    rx_data = bytearray(4)
    i2c.writeto(0x50, tx_data)
    i2c.readfrom_into(0x50, rx_data)
    print("Received data:", rx_data)
    machine.delay(1000)

要点解读:
代码与前一个示例类似,使用machine.I2C创建一个硬件I2C对象,并指定硬件I2C总线的编号以及引脚连接和频率。
在循环中,定义一个发送数据的字节序列tx_data,并创建一个长度为4的字节数组rx_data用于接收数据。
使用i2c.writeto()将发送数据写入到I2C设备,使用i2c.readfrom_into()从I2C设备读取数据并存储到接收数据的字节数组中。
将接收到的数据打印输出,并使用machine.delay()延迟1秒钟。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值