【雕爷学编程】MicroPython手册之 SAMD21 硬件I2C总线

在这里插入图片描述
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、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
SAMD21是一系列使用32位ARM® Cortex®-M0+处理器的低功耗微控制器,由Microchip Technology公司开发。SAMD21的技术参数如下:

1、处理器:32位ARM® Cortex®-M0+,最高工作频率为48MHz,每兆赫兹可达2.46 Coremark。
2、存储器:闪存容量从32KB到256KB不等,SRAM容量从4KB到32KB不等。
3、电源管理:支持多种低功耗模式,如空闲和待机模式,最低功耗为3.5μA/MHz。
4、外设:拥有丰富的智能和灵活的外设,如直接内存访问控制器(DMAC)、事件系统、定时器/计数器(TC/TCC)、实时时钟(RTC)、看门狗定时器(WDT)、CRC-32生成器、通用串行总线(USB)2.0接口、串行通信接口(SERCOM)、Inter-IC Sound(I2S)接口、模数转换器(ADC/DAC)、模拟比较器(AC)和外设触摸控制器(PTC)。
5、封装:支持多种封装形式,从32引脚到64引脚不等,包括TQFP、QFN、UFBGA和WLCSP。
6、标准:符合AEC-Q100 Grade 1的汽车级标准,工作温度范围为-40°C到+125°C。

在这里插入图片描述

MicroPython的SAMD21硬件I2C总线是指在MicroPython环境中使用SAMD21微控制器的硬件外设实现的I2C(Inter-Integrated Circuit)总线。

主要特点:

硬件加速:SAMD21硬件I2C总线通过专门的I2C外设实现,具有硬件加速的特点。硬件加速可以提供更高的数据传输速率和更低的处理器负载,使得I2C通信更高效。
多主从支持:SAMD21硬件I2C总线通常支持多主从模式,可以同时连接多个I2C设备。每个设备可以作为主设备或从设备,并通过I2C总线进行数据交换。这种多主从支持使得连接复杂的I2C设备网络成为可能。
时钟同步:SAMD21硬件I2C总线提供时钟同步功能,可以确保I2C总线上的所有设备在数据传输时保持同步。这对于实现准确的时序和避免数据冲突非常重要。
错误检测与纠正:SAMD21硬件I2C总线通常内置错误检测和纠正机制,可以自动检测并修正传输过程中的错误。这提高了数据传输的可靠性和稳定性。

应用场景:

外设通信:SAMD21硬件I2C总线可用于与外部I2C设备进行通信,如传感器、存储器、扩展模块等。通过硬件加速和多主从支持,可以实现高效和可靠的数据交换。
外部扩展模块:SAMD21硬件I2C总线适用于连接外部扩展模块,如通信模块、显示屏、扩展存储等。通过硬件I2C总线的灵活性和多主从支持,可以实现与这些模块的可靠和高效的数据交互。
嵌入式系统控制:在嵌入式系统中,SAMD21硬件I2C总线可以用于系统控制和通信。通过连接各种外设,如控制器、开关、传感器等,可以实现系统的监控和控制功能。

注意事项:

引脚配置:在使用SAMD21硬件I2C总线之前,需要正确配置相关的GPIO引脚。确保所选的引脚与硬件I2C外设的连接正确,并满足引脚的电压和功能要求。
时钟同步:SAMD21硬件I2C总线的时钟同步对于I2C通信的正确性非常重要。需要根据I2C设备的要求进行适当的时钟频率和时序配置,以确保数据传输的准确性。
设备地址管理:在使用SAMD21硬件I2C总线时,需要正确管理和配置每个连接的I2C设备的地址。确保每个设备的地址不冲突,并与总线上的其他设备正确通信。

综上所述,MicroPython的SAMD21硬件I2C总线通过SAMD21微控制器的硬件外设实现,具有硬件加速、多主从支持、时钟同步和错误检测与纠正等特点。适用于外设通信、外部扩展模块和嵌入式系统控制等应用场景。在使用SAMD21硬件I2C总线时,需要注意正确配置GPIO引脚、适当设置时钟同步和设备地址管理,以确保I2C通信的稳定性和可靠性。

在这里插入图片描述
以下是几个实际运用程序参考代码案例,分别演示了如何使用MicroPython的SAMD21硬件I2C总线进行数据传输:

案例一:使用machine.Pin(sda, Pin.OUT)设置SDA引脚为输出模式

import machine
i2c = machine.I2C(scl=machine.Pin(1), sda=machine.Pin(4))  # 创建一个I2C对象,SCL引脚为1号引脚,SDA引脚为4号引脚
i2c.sda.value(1)  # 将SDA引脚设置为高电平

重点解读:这个程序使用machine.Pin()函数将SDA引脚设置为输出模式。在这个例子中,我们将SDA引脚设置为4号引脚。然后,我们使用i2c.sda.value()方法将SDA引脚设置为高电平。

案例二:使用i2c.writeto_mem(address, data)向I2C设备写入数据

i2c = machine.I2C(scl=machine.Pin(1), sda=machine.Pin(4))  # 创建一个I2C对象,SCL引脚为1号引脚,SDA引脚为4号引脚
address = 0x50  # I2C设备的地址
data = [0x01, 0x02, 0x03]  # 要写入的数据
i2c.writeto_mem(address, data)  # 将数据写入到I2C设备中

重点解读:这个程序使用I2C对象的writeto_mem()方法向I2C设备写入数据。在这个例子中,我们首先创建一个I2C对象,然后将要写入的地址和数据存储在两个变量中,使用writeto_mem()方法将数据写入到I2C设备中。

案例三:使用i2c.readfrom_mem(address, length)从I2C设备读取数据

i2c = machine.I2C(scl=machine.Pin(1), sda=machine.Pin(4))  # 创建一个I2C对象,SCL引脚为1号引脚,SDA引脚为4号引脚
address = 0x50  # I2C设备的地址
length = 3  # 要读取的数据长度
data = i2c.readfrom_mem(address, length)  # 从I2C设备中读取数据
print("从I2C设备中读取的数据为:", data)

重点解读:这个程序使用I2C对象的readfrom_mem()方法从I2C设备中读取数据。在这个例子中,我们首先创建一个I2C对象,然后将要读取的地址和长度存储在两个变量中,使用readfrom_mem()方法从I2C设备中读取数据,并将其打印出来。

案例四:使用硬件I2C总线读取另一个设备的寄存器值

import machine  
i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(20), freq=100000)  # 创建I2C对象,设置SCL和SDA引脚,设置通信频率为100KHz  
while True:  
    # 向从设备发送读取寄存器命令和寄存器地址  
    i2c.writeto_mem(0x50, 0x00, b'\x03\x01')  
    # 从从设备读取寄存器值  
    data = i2c.readfrom_mem(0x50, 0x02, 2)  
    print(data)  # 打印从设备返回的寄存器值

这个代码用于使用硬件I2C总线读取另一个设备的寄存器值。它创建了一个I2C对象,并设置了SCL和SDA引脚以及通信频率。然后,它使用writeto_mem()方法向从设备发送读取寄存器命令和寄存器地址,并使用readfrom_mem()方法从从设备读取寄存器值。需要注意的是,要使用这个代码,你需要将从设备的寄存器地址和命令编码为字节数组,并将其发送到从设备的相应寄存器。同时,你还需要将从设备的I2C地址设置为0x50。最后,你需要将SCL和SDA引脚配置为硬件I2C模式。

案例五:使用硬件I2C总线控制LED灯的亮度

import machine  
i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(20), freq=100000)  # 创建I2C对象,设置SCL和SDA引脚,设置通信频率为100KHz  
led = machine.Pin(24, machine.Pin.OUT)  # 创建GPIO对象,控制LED灯的亮度  
while True:  
    # 设置LED灯的亮度为50%  
    led.value(512)  
    # 向从设备发送控制LED灯亮度的命令和亮度值  
    i2c.writeto_mem(0x50, 0x00, b'\x04\x80\x02')  
    utime.sleep(1)  # 延时1秒  
    # 设置LED灯的亮度为100%  
    led.value(1024)  
    # 向从设备发送控制LED灯亮度的命令和亮度值  
    i2c.writeto_mem(0x50, 0x00, b'\x04\xFF\x03')  
    utime.sleep(1)  # 延时1秒

这个代码用于使用硬件I2C总线控制LED灯的亮度。它创建了一个I2C对象和一个GPIO对象,并设置了SCL和SDA引脚以及通信频率。然后,它使用writeto_mem()方法向从设备发送控制LED灯亮度的命令和亮度值,并使用GPIO对象控制LED灯的亮度。需要注意的是,要使用这个代码,你需要将从设备的命令和亮度值编码为字节数组,并将其发送到从设备的相应寄存器。同时,你还需要将从设备的I2C地址设置为0x50。最后,你需要将SCL和SDA引脚配置为硬件I2C模式。最后,你还需要将LED灯连接到具有数字输出能力的GPIO引脚。

案例六:使用硬件I2C总线与多个设备通信

import machine  
i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(20), freq=100000)  # 创建I2C对象,设置SCL和SDA引脚,设置通信频率为100KHz  
  
while True:  
    # 向从设备1发送数据  
    i2c.writeto_mem(0x51, 0x00, b'Hello, device 1!')  
    # 向从设备2发送数据  
    i2c.writeto_mem(0x52, 0x00, b'Hello, device 2!')  
      
    # 从从设备1读取数据  
    data1 = i2c.readfrom_mem(0x51, 0x00, 16)  
    # 从从设备2读取数据  
    data2 = i2c.readfrom_mem(0x52, 0x00, 16)  
      
    # 打印从设备1返回的数据  
    print('Data from device 1:', data1)  
    # 打印从设备2返回的数据  
    print('Data from device 2:', data2)

在这个程序中,我们首先创建了一个I2C对象,并设置了SCL和SDA引脚以及通信频率。然后,在循环中,我们使用writeto_mem()方法向两个从设备发送数据,使用readfrom_mem()方法从两个从设备读取数据,并将读取到的数据打印出来。需要注意的是,我们将从设备的I2C地址分别设置为0x51和0x52。最后,我们需要将SCL和SDA引脚配置为硬件I2C模式。

案例七:使用SAMD21的硬件I2C总线与BMP280温度压力传感器通信

BMP280是一种可以通过I2C总线输出温度和气压值的传感器。以下是一个使用MicroPython的代码示例,它可以使用硬件I2C总线从BMP280读取温度和气压值,并打印出来:

from machine import I2C, Pin
import bmp280

# 创建硬件I2C总线对象,使用SERCOM0,引脚为PA04(SCL),PA05(SDA)
i2c = I2C(0, scl=Pin('PA04'), sda=Pin('PA05'))

# 创建BMP280对象,使用默认地址0x76
bmp = bmp280.BMP280(i2c)

# 读取温度和气压值,并打印出来
temp = bmp.temperature # 获取温度,单位为摄氏度
press = bmp.pressure # 获取气压,单位为帕斯卡
print(temp, press)

要点解读:
I2C类可以用来创建一个硬件I2C总线对象,它可以实现两线串行协议。
bmp280模块可以用来读取BMP280温度压力传感器的输出值,它提供了一个类和一些属性来获取温度和气压值。
BMP280对象需要一个I2C对象作为参数。
BMP280对象的temperature属性可以用来获取温度值,单位为摄氏度。
BMP280对象的pressure属性可以用来获取气压值,单位为帕斯卡。

案例八:使用SAMD21的硬件I2C总线与PCF8574 I/O扩展器通信

PCF8574是一种可以通过I2C总线控制8个GPIO引脚的I/O扩展器。以下是一个使用MicroPython的代码示例,它可以使用硬件I2C总线向PCF8574写入和读取数据:

from machine import I2C, Pin

# 创建硬件I2C总线对象,使用SERCOM1,引脚为PA16(SCL),PA17(SDA)
i2c = I2C(1, scl=Pin('PA16'), sda=Pin('PA17'))

# 设置PCF8574的地址为0x20
addr = 0x20

# 向PCF8574写入一个字节,将所有引脚设置为高电平
i2c.writeto(addr, b'\xFF')

# 从PCF8574读取一个字节,获取所有引脚的状态
data = i2c.readfrom(addr, 1)
print(data)

要点解读:

I2C类可以用来创建一个硬件I2C总线对象,它可以实现两线串行协议。
I2C对象的writeto方法可以用来向指定地址的从设备写入一个字节串。
I2C对象的readfrom方法可以用来从指定地址的从设备读取指定长度的字节串。
PCF8574的地址可以通过其引脚A0-A2来设置,范围为0x20-0x27。
PCF8574的每一位对应一个GPIO引脚,0表示低电平,1表示高电平。

案例九:使用SAMD21的硬件I2C总线与SSD1306 OLED显示屏通信

SSD1306是一种可以显示图形和文本的OLED显示屏,它可以通过I2C总线接收命令和数据。以下是一个使用MicroPython的代码示例,它可以使用硬件I2C总线在SSD1306上显示一些文本:

from machine import I2C, Pin
import ssd1306

# 创建硬件I2C总线对象,使用SERCOM2,引脚为PA12(SCL),PA13(SDA)
i2c = I2C(2, scl=Pin('PA12'), sda=Pin('PA13'))

# 创建SSD1306对象,使用默认地址0x3c,分辨率为128x64
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# 初始化SSD1306
oled.init_display()

# 在第一行显示"Hello, World!"
oled.text("Hello, World!", 0, 0)

# 在第二行显示"MicroPython"
oled.text("MicroPython", 0, 8)

# 更新显示屏
oled.show()

要点解读:
I2C类可以用来创建一个硬件I2C总线对象,它可以实现两线串行协议。
ssd1306模块可以用来控制SSD1306 OLED显示屏,它提供了一个类和一些方法来初始化、清屏、写入命令和数据等。
SSD1306_I2C对象需要一个I2C对象和分辨率作为参数。
SSD1306_I2C对象的text方法可以用来在指定的位置显示一段文本。
SSD1306_I2C对象的show方法可以用来更新显示屏的内容。

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/133440928