micropython-SPI通讯

1.什么是SPI?

SPI 是英语 Serial Peripheral Interface 的缩写,顾名思义就是串行外围设备接口。
SPI 是一种高速的、全双工、同步通信总线,标准的 SPI 也仅仅使用 4 个引脚,常用于单片机和 EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。
论从硬件还是软件上看,SPI和I2C都很类似,只是它在物理层上需要三根数据线:SCK,MOSI,MISO。因为将 数据的收发信号分开,所以SPI的速度比I2C更快,适合高速通信(普通 I2C设备的速率是100KB/s,高速设备的速率是 400KB/s,少数设备支持 1MB/s;而 SPI 设备的速率一般至少是2MB/s,有些设备的速率可以达 到数十MB/s)。

2.SPI通讯原理

SPI通讯主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的 SPI 是 4 根线,分别是 SSEL(片选,也写作 SCS)、SCLK(时钟,也写作 SCK)、MOSI(主机输出从机输入Master Output/Slave Input)和 MISO(主机输入从机输出 Master Input/Slave Output)。
在这里插入图片描述

SSEL:从设备片选使能信号。如果从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通信。

SCLK:时钟信号,由主机产生,和 I2C通信的 SCL 有点类似。

MOSI:主机给从机发送指令或者数据的通道。

MISO:主机读取从机的状态或者数据的通道。

在某些情况下,我们也可以用 3 根线的 SPI 或者 2 根线的 SPI 进行通信:

  1. 主机只给从机发送命令,从机不需要回复数据的时候,那么 MISO 就可以不要;
  2. 而在主机只读取从机的数据,不需要给从机发送指令的时候,那MOSI 就可以不要;
  3. 当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么 SSEL 就可以不要;
  4. 此时如果再加上主机只给从机发送数据,那么 SSEL 和 MISO 都可以不要;如果主机只读取从机送来的数据,SSEL 和 MOSI 都可以不要。
3.Micropython中的SPI

基本用法
有些微控制器的 SPI 接口支持标准连接方式和半双工连接方式 (MISO 和MOSI信号合二为一),在MicroPython中,目前只支持标准方式。

在MicroPython中,SPI的用法和I2C类似它的主要函数有以下几个。

SPI.init(mode,baudrate=1000000,polarity=0,phase=0,bits=8,
firstbit=SPI.MSB,pins= (CLK,MOSI,MISO)) 

初始化SPI总线:
◆mode,SPI.MASTER,主机模式;SPI.SLAVE,从机模式。
◆baudrate,SCK时钟频率。
◆polarity,可以是0或1,代表空闲时时钟电平。
◆phase,可以是0或1,代表采样数据时在第一或第二时钟沿。
◆bits,是数据位,只能是8,16或32,默认8。 ◆firstbit,目前只能是SPI.MSB,代表传输时高位在前。
◆pins,代表SPI总线使用的GPIO元组。

在STM32控制器中,支持由硬件直接驱动SPI的CS信号,提高运行效率。但是在MicroPython中,不支持这种模式,需要在软件中由用户控制CS信号。这样虽然降低了一点性能,但是可以让 SPI 接口具有更好 的通用性,可以用总线方式连接多个芯片,再由不同的CS信号选择需 要工作的芯片。

使用SPI时要特别注意相位,它由polarity和phase两个参数决定,如 果设置错误将无法正常通信。polarity和phase组合起来有4种可能,也就是SPI的4种工作模式,一般常用模式0和模式3。

deinit() 

关闭SPI。

write(buf)

写入数据,写入数据的数量是buf的长度。

read(nbytes,write=0x00)

读取数据到nbytes中,同时写入设定的数据(默认0),返回参数是 读取数据的数量。
readinto(buf,write=0x00)
和read()函数作用相似,只是读取的数据存放到缓冲区中,同时 写入预定数据,返回读取数据的数量

write_readinto(write_buf,read_buf)

将write_buf的数据写入SPI中,同时从总线上读取数据到read_buf。 两个缓冲区的长度需要相同,返回实际写入数据的数量。

4.ZTMR测试SPI
1. ZTMR中SPI引脚

SPI1,一般STM32都有3组SPI。我们使用SPI1 来做测试,其他SPI2,SP3使用方法相同。
在这里插入图片描述

2. ZTMRSPI自测

自连接测试

from pyb import SPI
buf = bytearray(10)
spi = SPI(1, SPI.MASTER, baudrate=9600000, polarity=1, phase=0, crc=0x07)
data = spi.send_recv(b'0123456789')
spi.send_recv(b'0123456789', buf)
print(repr(buf))

输出结果:未短接MOSI(A7)和MISO(A6)引脚时
在这里插入图片描述

from pyb import SPI
buf = bytearray(10)
spi = SPI(1, SPI.MASTER, baudrate=9600000, polarity=1, phase=0, crc=0x07)
data = spi.send_recv(b'0123456789')
spi.send_recv(b'0123456789', buf)

输出结果:短接MOSI和MISO引脚时
在这里插入图片描述
在这里插入图片描述

2. SPI,2板之间通讯测试

测试说明:
主机CS引脚内部上拉到VCC(3.3),从机CS引脚下拉到GND
timeout 是以毫秒计的等待接收的超时时长。

注意:SPI时钟线未必是符合要求的波特率。硬件仅支持APB总线频率除以预分频器的波特率(见pyb.freq()), 可为2、4、8、16、32、64、128和256。

 pyb.freq()
(168000000, 168000000, 42000000, 84000000)

接角
A5 CLK
A6 MISO
A7 MOSI
GND

A4没接

ZTMR作为主机

from pyb import SPI
from machine import Pin

spi = SPI(1,SPI.MASTER,baudrate=4000000,polarity=0,phase=0) 
cs=Pin('A4')
cs.init(cs.OUT, value=1)

cs(0)
spi.send('hello')  #发送数据
cs(1)

spi.recv(5)         #读取5个字节
spi.send_recv('hello')  #发送并接收5个字节

ZTMS作为从机

from pyb import SPI
spi = SPI(1,SPI.SLAVE,baudrate=4000000,polarity=0,phase=0) 

import time
from machine import Pin
from pyb import SPI

spi = SPI(1,SPI.SLAVE,baudrate=4000000,polarity=0,phase=0) 
#定义 cs A4 引脚拉高无效,拉低是有数据
cs=Pin('A4',Pin.IN)
  
while True:
  time.sleep(3)
  
  if Pin('A4').value()==0:
    aa=spi.recv(5, timeout=50000)
    print(aa)
  print(spi.recv(50))
  print(Pin('A4').value())

串口输出:

>>>from pyb import SPI
>>>spi = SPI(1,SPI.MASTER,baudrate=4000000,polarity=0,phase=0) 
>>>spi.send('hello') 
>>>spi.send('hello') 
from machine import Pin
cs=Pin('A4')
cs.init(cs.OUT, value=0)

>>>from pyb import SPI
>>>spi = SPI(1,SPI.SLAVE,baudrate=4000000,polarity=0,phase=0) 
>>>spi.recv(5) 
b'hello'
>>> spi.recv(5, timeout=50000)
b'hello'
>>> spi.recv(5, timeout=50000)
b'hello'
>>> spi.recv(10, timeout=50000)
b'0hello0hel'
>>> spi.recv(20, timeout=50000)
b'lhellohellohellohell'
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MicroPython-ESP32 是一个专门为 ESP32 设计的 MicroPython 库,它提供了许多 ESP32 的驱动程序和功能模块,可以方便地在 ESP32 上开发 MicroPython 项目。 MicroPython-ESP32 库包含了以下功能模块: - machine:提供了访问 GPIO、ADC、PWM、I2C、SPI、UART 等硬件资源的方法。 - network:提供了访问 WiFi、Ethernet 等网络资源的方法。 - time:提供了时间相关的方法,如获取当前时间、延时等。 - uos:提供了文件系统相关的方法,如创建文件、删除文件等。 - ujson:提供了 JSON 编码和解码的方法。 - urequests:提供了访问 HTTP 网络资源的方法。 - usocket:提供了访问 Socket 网络资源的方法。 - ustruct:提供了字节序列和 C 结构体之间转换的方法。 - utime:提供了时间相关的方法,如获取当前时间、延时等。 使用 MicroPython-ESP32 库很简单,只需要将库文件拷贝到 ESP32 上,并在 MicroPython 代码中引入需要的模块即可。例如,以下代码演示了如何使用 MicroPython-ESP32 库中的 machine 模块控制 ESP32 的 GPIO: ```python import machine # 配置GPIO 2为输出模式 p2 = machine.Pin(2, machine.Pin.OUT) # 将GPIO 2输出高电平 p2.value(1) # 将GPIO 2输出低电平 p2.value(0) ``` 需要注意的是,MicroPython-ESP32 库的使用需要先安装 MicroPython 固件。可以从 MicroPython 官方网站下载 ESP32 的 MicroPython 固件,并使用 esptool.py 工具将固件烧录到 ESP32 上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值