micropython-SPI通讯

  • 1.什么是SPI?
  • 2.SPI通讯原理
  • 3.Micropython中的SPI
  • 4.ZTMR测试SPI
    • 1. ZTMR中SPI引脚
    • 2. ZTMRSPI自测
    • 2. SPI,2板之间通讯测试

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 Pinspi = 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 SPIspi = 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'

micropython-SPI通讯相关推荐

  1. 加密芯片SPI通讯的调试

    SPI是串行外设接口(Serial Peripheral Interface)的缩写.是Motorola公司推出的一种同步串行接口技术,是一种高速的.全双工,同步的通信总线. SPI的通信原理很简单, ...

  2. 详细介绍GPIO、I2C、SPI通讯原理以及物理层原理

    目录 一. GPIO 1. 什么是GPIO? 2. GPIO组成原理 3. GPIO工作原理 二. I2C 1. 什么是I2C? 2. I2C组成原理 3. I2C的特性 4. I2C的通讯模式 5. ...

  3. SPI通讯协议详解 基于STM32

    SPI 协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface),即串行外围设备接口,是 一种高速全双工的通信总线.它被广泛地使用在 ADC.L ...

  4. 咸鱼Micropython—SPI

    咸鱼Micropython-SPI SPI是Serial peripheral interface(串行外设接口)的简称,它也是一个通用的串行通信接口.无论从硬件还是软件上看,SPI和I2C都很类 似 ...

  5. 基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 IC-MU磁绝对值编码器的SPI通讯和码盘数据处理 前言 一.硬件连接 二.STM32 cubmx配置模式 三.软件代码及思路 1.寄 ...

  6. Arduino使用u8g2库函数驱动4线/6线OLED屏幕(I2C/SPI通讯)附带库函数详解

    话不多说,直接入正题: 常见的OLED通常有两种样式,如下图所示,分别是4线和6线控制 本人几乎浏览了网上所有关于控制OLED模块的教程,并都经过了项目实测:大力推荐u8g2这个库函数来控制,文章末尾 ...

  7. 57步进电机驱动板,可以通过编码器调速,支持SPI通讯屏显示,485通讯

    57步进电机驱动板,可以通过编码器调速,支持SPI通讯屏显示,485通讯. 板子上面有电位器可电流设定或者485改电流设定. 最大电流支持4.5A,如果需要更大电流需要改元器件参数. 有启停和方向按键 ...

  8. STM32F103C8T6驱动6线OLED(SPI通讯)

    传送门:Arduino使用u8g2库函数驱动4线/6线OLED屏幕(I2C/SPI通讯)附带库函数详解 [点击进入] 一.0.96寸SSD1306原理图(默认为SPI) 二.OLED硬件介绍及控制方式 ...

  9. STM32Cube学习笔记-SPI通讯

    引言  使用STM32Cube开发东西最怕的就是写的代码太多,为什么呢?因为不会写,我深有体会.SPI通讯是一种常用的常用的通讯方式,同步.串行.同步代表着实时性好,串行代表着接线少,很多的设备愿意采 ...

  10. 串口RS232 RS485最本质的区别!-!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议!

    5分钟看懂!串口RS232 RS485最本质的区别!-4分钟看懂!I2C通讯协议 最简单的总线通讯!-深入理解SPi通讯协议,5分钟看懂! 一.5分钟看懂!串口RS232 RS485最本质的区别! 二 ...

最新文章

  1. 遗传算法主程序(辅助)
  2. c++ 按键暂停继续 程序_CNC操作面板讲解,看看这些按键是什么意思
  3. 用git进行项目搭建
  4. 启明智显分享| 2.4寸旋钮串口屏在健身器材上的应用
  5. 小东《迷路的情人》MV
  6. Android之添加快捷方式(Shortcut)到手机桌面
  7. 【PTA天梯赛CCCC -2017决赛L1-6 】整除光棍 (20 分)(大数模拟除法)
  8. 20145203盖泽双《网络对抗技术》拓展:注入:shellcode及return-into-libc攻击
  9. 深入理解计算及系统 Chapter2 学习笔记
  10. 抓取Crash不让崩溃
  11. java8新日期时间类使用
  12. 7-1 是否同一棵二叉搜索树 (25 分)
  13. 不会真有人觉得聊天机器人难吧——微调BERT模型得到句子间的相似度
  14. Axure9(基础二)
  15. 新浪微博开放平台中的Redis实践
  16. 小柏实战学习Liunx(图文教程二十二)
  17. 提升网页加载速度 | google网站速度测试
  18. Phalloidin——Acti-stain555鬼笔环肽研究
  19. otter异常——zookeeper重新初始化
  20. 智慧城市的发展动力、推动因素、负面影响、挑战与应对

热门文章

  1. haar adaboost matlab,人脸检测算法之Haar-Adaboost分类器原理
  2. 美团校招实习生面试一面
  3. ubuntu执行uci出现 uci: error while loading shared libraries: lib
  4. python作图设置背景颜色_如何在matplotlib中设置绘图的外部背景颜色
  5. android canvas 背景图片,Android更改canvas背景颜色而不会丢失任何图纸
  6. 修正 Newton 公式
  7. 急刹车是否踩离合器?别犹豫,踩。
  8. 【实验技术笔记】Western Blotting 实验操作要点及数据分析
  9. php对接打码平台,好用的打码平台推荐
  10. 立交匝道中边桩坐标放样正反算程序RAMP