【雕爷学编程】MicroPython手册之 pyboard 特定端口库 pyb.SPI()

在这里插入图片描述

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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述

pyboard是一个紧凑而强大的电子开发板,运行MicroPython。它通过USB连接到您的PC,为您提供一个USB闪存驱动器来保存Python脚本,以及用于即时编程的串行Python提示符(REPL)。需要微型 USB 电缆。适用于 Windows、Mac 和 Linux。

MicroPython是对Python(版本3.4)编程语言的完全重写,因此它适合并在微控制器上运行。它包括许多优化,因此它可以高效运行并使用很少的 RAM。

MicroPython在pyboard上运行裸机,本质上是一个Python操作系统。内置 pyb 模块包含用于控制板上可用外设的函数和类,例如 UART、I2C、SPI、ADC 和 DAC。观看此视频,了解 pyboard 的概述。

在这里插入图片描述
MicroPython 的 pyb.SPI() 是一个用于创建和操作 SPI(串行外设接口)总线协议的函数。SPI 是一种由主机驱动的同步串行协议,可以在一条总线上连接多个外部设备或传感器。SPI 总线由三条线路组成:SCK(时钟线)、MOSI(主机输出从机输入线)和 MISO(主机输入从机输出线)。每个外部设备还需要一个单独的 SS(从机选择)信号,用于选择要通信的特定设备。SS 信号的管理应该在用户代码中通过 machine.Pin 类来实现。

使用 pyb.SPI() 函数,可以指定一个总线编号(1 或 2),并返回一个 SPI 对象,该对象提供了一些方法来发送或接收数据。例如,如果想在 X1 引脚上创建一个 SPI 对象,并向其发送一个字节 b’123’,可以这样写:

import pyb # 导入 pyb 模块
spi = pyb.SPI(1) # 创建一个 SPI 对象,表示 X1 引脚上的 SPI 总线
spi.send(b'123') # 向 SPI 总线发送一个字节 b'123'

pyb.SPI() 的主要特点是:

它是一种简单而方便的 SPI 对象创建方式,可以用 pyb.SPI() 的形式来创建一个 SPI 对象,不需要指定任何参数。
它是一种灵活而强大的 SPI 对象操作方式,可以用 send、recv、send_recv 等方法来发送或接收数据,可以用 init 方法来设置 SPI 总线的参数,如波特率、极性、相位等。
它是一种兼容而可扩展的 SPI 对象接口方式,可以用其他模块或函数来访问或修改 SPI 对象的属性和方法,可以用其他硬件或软件来同步或校准 SPI 总线的时钟。

pyb.SPI() 的应用场景有:

用于连接和控制各种支持 SPI 协议的外部设备或传感器,如 LCD 屏幕、DAC 模块、MPU6050 陀螺仪加速度计等。
用于实现高速和可靠的数据传输和交换,如在两个微控制器之间通过 SPI 总线进行通信。
用于实现创意和艺术的表达,如用 SPI 总线控制一些装置或装饰品,实现有趣或美观的动态效果。

pyb.SPI() 的需注意事项有:

在使用 pyb.SPI() 之前,需要确保 pyboard 已经正确地连接到电源和电脑,并且已经安装了 MicroPython 的固件。
在使用 pyb.SPI() 时,需要注意 SPI 总线的电压范围和电流限制,避免造成硬件损坏或故障。
在使用 pyb.SPI() 时,需要注意 SPI 总线的功能冲突和共享问题,避免造成功能失效或干扰。

以下是几个使用 pyb.SPI() 的实际运用程序案例:

案例一:使用 X1 引脚上的 SPI 总线连接一个 LCD160CR 屏幕,显示一些文本和图形。代码如下:

import pyb # 导入 pyb 模块
import lcd160cr # 导入 lcd160cr 模块
spi = pyb.SPI(1) # 创建一个 SPI 对象,表示 X1 引脚上的 SPI 总线
lcd = lcd160cr.LCD160CR('X') # 创建一个 LCD160CR 对象,表示 X 口连接的 LCD 屏幕
lcd.set_orient(lcd160cr.LANDSCAPE) # 设置 LCD 屏幕的方向为横向
lcd.set_font(1) # 设置 LCD 屏幕的字体为 1
lcd.erase() # 清除 LCD 屏幕
lcd.set_pos(0, 0) # 设置 LCD 屏幕的位置为 (0, 0)
lcd.write('Hello, MicroPython!') # 写入一些文本
lcd.set_pen(255, 0, 0) # 设置画笔的颜色为红色
lcd.draw_circle(80, 60, 50) # 画一个圆形

这个程序可以让 LCD160CR 屏幕显示一些文本和图形。你可以用其他方法来修改 LCD 屏幕的内容和样式。如果你想了解更多关于 LCD160CR 屏幕的信息,你可以参考以下链接 。

案例二:使用 X1 引脚上的 SPI 总线连接一个 DAC8552 数模转换模块,输出一些模拟信号。代码如下:

import pyb # 导入 pyb 模块
import math # 导入 math 模块
spi = pyb.SPI(1) # 创建一个 SPI 对象,表示 X1 引脚上的 SPI 总线
dac8552_addr = 0x30 # DAC8552 的 SPI 地址
dac8552_cmd_a = b'\x10' # DAC8552 的 A 输出通道命令字节
dac8552_cmd_b = b'\x24' # DAC8552 的 B 输出通道命令字节
angle = 0 # 定义一个角度变量,初始值为 0
while True: # 无限循环
    value_a = int((math.sin(math.radians(angle)) + 1) * 2047.5) # 根据角度计算 A 输出通道的值,范围为 [0,4095]
    value_b = int((math.cos(math.radians(angle)) + 1) * 2047.5) # 根据角度计算 B 输出通道的值,范围为 [0,4095]
    data_a = dac8552_cmd_a + value_a.to_bytes(2, 'big') # 组合 A 输出通道的命令字节和数据字节
    data_b = dac8552_cmd_b + value_b.to_bytes(2, 'big') # 组合 B 输出通道的命令字节和数据字节
    spi.send_recv(data_a, addr=dac8552_addr) # 向 DAC8552 发送 A 输出通道的数据
    spi.send_recv(data_b, addr=dac8552_addr) # 向 DAC8552 发送 B 输出通道的数据
    angle += 10 # 角度增加 10 度
    if angle >= 360: # 如果角度大于等于 360 度
        angle = 0 # 角度归零
    pyb.delay(100) # 延时 100 毫秒

这个程序可以让 DAC8552 模块输出两个相位差为 90 度的正弦波信号,频率为 10 Hz。你可以用示波器或其他设备来观察和测量这些信号。如果你想了解更多关于 DAC8552 模块的信息,你可以参考以下链接 。

案例三:使用 X1 引脚上的 SPI 总线连接一个 MPU6050 陀螺仪加速度计模块,读取其数据,并打印在终端上。代码如下:

import pyb # 导入 pyb 模块
import machine # 导入 machine 模块
spi = pyb.SPI(1) # 创建一个 SPI 对象,表示 X1 引脚上的 SPI 总线
mpu6050_addr = 0x68 # MPU6050 的 SPI 地址
mpu6050_cmd_r = b'\x80' # MPU6050 的读取命令字节
mpu6050_cmd_w = b'\x00' # MPU6050 的写入命令字节
spi.send_recv(mpu6050_cmd_w + b'\x6B' + b'\x00', addr=mpu6050_addr) # 向 MPU6050 的 0x6B 寄存器写入 0x00,使其退出休眠模式
while True: # 无限循环
    data = spi.send_recv(mpu6050_cmd_r + b'\x3B', addr=mpu6050_addr, recv=14) # 从 MPU6050 的 0x3B 寄存器开始,读取 14 个字节的数据
    accel_x = (data[1] << 8 | data[2]) - 32768 # 解析加速度计 X 轴的数据,转换为有符号整数
    accel_y = (data[3] << 8 | data[4]) - 32768 # 解析加速度计 Y 轴的数据,转换为有符号整数
    accel_z = (data[5] << 8 | data[6]) - 32768 # 解析加速度计 Z 轴的数据,转换为有符号整数
    gyro_x = (data[9] << 8 | data[10]) - 32768 # 解析陀螺仪 X 轴的数据,转换为有符号整数
    gyro_y = (data[11] << 8 | data[12]) - 32768 # 解析陀螺仪 Y 轴的数据,转换为有符号整数
    gyro_z = (data[13] << 8 | data[14]) - 32768 # 解析陀螺仪 Z 轴的数据,转换为有符号整数
    print('accel_x:', accel_x, 'accel_y:', accel_y, 'accel_z:', accel_z) # 打印加速度计的数据
    print('gyro_x:', gyro_x, 'gyro_y:', gyro_y, 'gyro_z:', gyro_z) # 打印陀螺仪的数据
    pyb.delay(100) # 延时 100 毫秒

这个程序可以让 MPU6050 模块通过 SPI 总线发送其陀螺仪和加速度计的数据,并打印在终端上。你可以用其他方法来处理或显示这些数据。

案例四:与外部设备通信:

import pyb

# 初始化SPI对象
spi = pyb.SPI(1)

# 与外部设备进行通信
data_out = b'\x01\x02\x03\x04'  # 发送的数据
data_in = spi.send_recv(data_out)  # 发送数据并接收返回数据

print("接收到的数据:", data_in)

在这个例子中,我们使用pyb.SPI()函数初始化SPI对象,并指定使用的SPI接口号(在这里是1)。我们定义了要发送的数据data_out,并使用send_recv()方法将其发送给外部设备,并同时接收返回的数据。最后,我们打印出接收到的数据。

案例五:控制外部设备的芯片选择信号:

import pyb

# 初始化SPI对象
spi = pyb.SPI(1, pyb.SPI.MASTER, baudrate=1000000, polarity=0, phase=0)

# 控制芯片选择信号
cs_pin = pyb.Pin('X1', pyb.Pin.OUT_PP)  # 使用X1引脚作为芯片选择信号
cs_pin.high()  # 置高,禁用设备
pyb.delay(10)
cs_pin.low()  # 置低,使能设备

# 与外部设备进行通信
data_out = b'\x01\x02\x03\x04'  # 发送的数据
data_in = spi.send_recv(data_out)  # 发送数据并接收返回数据

cs_pin.high()  # 禁用设备

print("接收到的数据:", data_in)

在这个例子中,我们使用pyb.SPI()函数初始化SPI对象,并指定使用的SPI接口号(在这里是1)。我们还通过设置参数指定SPI的工作模式(MASTER)、波特率(baudrate)、极性(polarity)和相位(phase)。我们使用pyb.Pin()函数初始化一个引脚对象,将其用作芯片选择信号。通过设置引脚状态(high或low),我们可以控制芯片选择信号的状态,以使能或禁用外部设备。然后,我们使用send_recv()方法与外部设备进行通信,并接收返回的数据。最后,我们禁用设备,打印出接收到的数据。

案例六:读取传感器数据:

import pyb

# 初始化SPI对象
spi = pyb.SPI(1, pyb.SPI.MASTER, baudrate=1000000, polarity=0, phase=0)

# 读取传感器数据
command = 0x80  # 读取传感器的命令
data_out = bytearray([command])  # 发送的命令
data_in = spi.send_recv(data_out)  # 发送命令并接收传感器数据

sensor_data = data_in[1:]  # 传感器数据从第二个字节开始

print("传感器数据:", sensor_data)

在这个例子中,我们使用pyb.SPI()函数初始化SPI对象,并指定使用的SPI接口号(在这里是1)。我们还通过设置参数指定SPI的工作模式(MASTER)、波特率(baudrate)、极性(polarity)和相位(phase)。我们定义了要发送的命令command,并将其放入一个字节数组data_out中。通过调用send_recv()方法,我们发送命令并从传感器接收数据。最后,我们从接收到的数据中提取传感器数据,并打印出来。

案例七:SPI主设备发送数据

import pyb

# 创建SPI对象
spi = pyb.SPI(1, pyb.SPI.MASTER)

# 发送数据
data = b"Hello, SPI!"
spi.send(data)

这个示例程序使用pyb.SPI()创建一个SPI对象spi,设置为主设备模式。通过调用spi.send()方法,可以向从设备发送数据。在这个示例中,发送了一个字节串数据"Hello, SPI!"。

示例8:SPI主设备接收数据

import pyb

# 创建SPI对象
spi = pyb.SPI(1, pyb.SPI.MASTER)

# 接收数据
data = spi.recv(10)
print("Received data:", data)

这个示例程序使用pyb.SPI()创建一个SPI对象spi,设置为主设备模式。通过调用spi.recv()方法,可以从从设备接收数据。在这个示例中,接收了10个字节的数据,并将其打印出来。

示例9:SPI主设备发送和接收数据

import pyb

# 创建SPI对象
spi = pyb.SPI(1, pyb.SPI.MASTER)

# 发送和接收数据
send_data = b"Hello, SPI!"
recv_data = spi.send_recv(send_data)
print("Received data:", recv_data)

这个示例程序使用pyb.SPI()创建一个SPI对象spi,设置为主设备模式。通过调用spi.send_recv()方法,可以同时发送和接收数据。在这个示例中,发送了一个字节串数据"Hello, SPI!",并从从设备接收相同长度的数据,并将其打印出来。

这些示例程序展示了使用pyb.SPI()的用法,可以用于SPI主设备发送数据、接收数据以及发送和接收数据等功能。具体的应用场景和使用方式可能会根据实际需求而有所不同。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值