内容目录:
一、SPI总线接口介绍
二、树莓派Pico与ADXL345加速度传感器SPI总线接口
三、树莓派Pico与ADXL345加速度传感器MicroPython通信程序示例

一、SPI总线接口介绍
SPI(Serial Peripheral Interface)总线是Motorola公司推出的一种串行接口标准总线,允许微控制器(MCU)与不同厂家的标准外围设备直接相连,以串行通信方式交换信息。通过SPI接口可方便地与多种拥有SPI的外围器件或外设进行通信。
SPI采用主从方式传送数据,主机控制传输的启动。SPI接口使用了SCLK、MOSI和MOSI三条信号线,另有一条选择通信从机的/SS从机选择信号线。在SCLK信号同步下,数据在MOSI和MOSI两根信号线上进行传输;/SS则是主机发出的选择进行数据传输的从机控制线,低电平有效,只有被主机发送的/SS选中的从机,才能和主机交换数据。SPI主要支持一主多从机的连接方式。
SPI接口信号功能说明如下:
(1)SCLK(SPI Clock,串行时钟信号):该信号由主机输出到从机,用于同步主机和从机之间在MOSI和MISO线上的串行数据传输;当主机启动一次数据传输时,自动产生SCLK时钟信号给从机,在SCLK的每个跳变处(上升沿或下降沿)移出一位数据,以此同步数据的发送或接收,因此,SCLK信号的频率决定了SPI数据传送的速率。
(2)MOSI(Master Out Slave In,主机输出/从机输入,简称主出从入):主机的输出和从机的输入,用于从主机到从机的串行传输;当SPI接口作为主机时,该信号是输出;当SPI接口为从器件时,该信号是输入;根据SPI规范,多个从机可以挂在这一信号线上共享一根MOSI信号线。
(3)MISO (Master In Slave Out,主机输入/从机输出,简称主入从出):从机的输出和主机的输入,用于从机到主机的串行数据传输;当SPI接口作为主机时,该信号是输入;当SPI接口为从器件时,该信号是输出;同样在SPI规范下,多个从机共享一根MISO信号线。当主机与一个从机通信时,其他从机应将其MISO引脚驱动置为高阻状态。
(4)/SS或/CS(Slave Select或Chip Select,从机选择信号或片选信号):对从机而言,该信号是输入信号,由主机输出来选择处于从机工作方式的模块,低电平有效;对主机而言,其/SS引脚可通过10k电阻上拉至高电平;每一个从机的/SS可接到主机的I/O口,由主机控制电平的高低,以便主机选择从机;对于从机,只有在/SS信号有效的情况下才能进行发送或者接收;SPI主机可以使用本信号选择一个SPI器件作为当前的从机。
应用微控制器的SPI接口可组成如下几种数据通信方式:单主机-单从机方式、双器件方式(器件互为主机和从机)和单主机-多从机方式。
二、树莓派Pico与ADXL345加速度传感器SPI总线接口
树莓派Pico开发板GPIO扩展接口见图1所示,Pico开发板拥有两个SPI控制器,它可提供SPI0和SPI1两个SPI接口,从GPIO扩展接口引脚上看,它们都是GPIO复用的多功能引脚。

图1
这里采用Pico开发板SPI0接口并使用图1扩展接口右下角区域引脚编号的SPI0接口信号:SPI0 RX(GP16, Pin21物理引脚)、SPI0 CSn(GP17,Pin22物理引脚)、SPI0 SCK(GP18,Pin24物理引脚)、SPI0 TX(GP19,Pin25物理引脚),Pico开发板与ADXL345加速度传感器4线SPI接口连接原理图见2所示。

图2
图2所示的Pico与ADXL345加速度传感器4线SPI数据通信方式为单主机-单从机方式,Pico为主机(Master),ADXL345为从机(Slave),由GPIO17口线程控从机片选。以SPI字节读写为例,当主机程序向SPI接口的数据缓冲器写入字节数据时,立即启动一个连续的8位移位通信过程:主机的SCLK引脚向从机引脚发出一串脉冲,在该串脉冲驱动下,主机SPI接口的8位移位寄存器中的数据移动到从机SPI的8位移位寄存器中;与此同时,从机SPI的8位移位寄存器中的数据也可移动到主机的8位移位寄存器中。由此,主机既可向从机发送数据,又可读取从机中的数据。
图3为一款从X东某工业品店购买的ADXL345三轴加速度传感器模块拍照图,该模块电路原理图见图4所示。

图3

图4
从图4可以看出, R4为0Ω电阻直接接地,SDO保持为低电平,只能进行3线SPI通信,而本文采用的是4线SPI通信,必须将R4电阻从图3中的ADXL345电路模块中焊接取下来(若无电烙铁等焊接工具,可找相关的硬件人员将该电阻取下来),否则不能进行4线SPI通信。
下面对ADXL345三轴加速度传感器器件作简要说明,ADXL345为一款超低功耗加速度传感器,其分辨率为13位,测量范围达±16g(可选±2、±4、±8g),输出数据格式为16位二进制补码,可通过SPI接口(三线/四线)或者I2C接口访问;同时,它还支持32级的FIFO数据存储,以满足快速读取数据的要求。SPI时钟要求:在设置读取速率时,要和SPI的时钟匹配,否则可能读到错误的数据,比如设置1600Hz,SPI时钟要大于2MHz。SPI读取数据时钟最大为5MHz。SPI总线的理解:SCLK下降沿时进行数据更新,SCLK上升沿时进行采样。SPI要读取一个数据,必须先写入一个数据;在写入数据时,时钟线才会启动。ADXL345器件读写时序图见图5所示。

图5
从图5 的4线SPI读写时序图可知:在读取字节数据时,要读取的字节数据的地址最高位为1;在写入字节数据时,要写入的字节数据的地址最高位为0;在进行多字节读取时,要读取的次高位字节数据的地址为1,这样才可以进行多字节读取。
要在单次传输内读取或写入多个字节,必须设置位于第一个字节传输(MB,图3(a)和(b))R/W位后的多个字节位。当寄存器寻址数据的第一个字节后,时钟脉冲随后的每次设置(8个时钟脉冲)会导致ADXL345指向下一个字节数据寄存器的读取/写入。时钟脉冲停止后,移位才随之中止,/CS失效。要执行不同不连续寄存器的读取或写入,传输之间/CS必须失效,新寄存器另行处理。
三、树莓派Pico与ADXL345加速度传感器MicroPython通信程序示例
图6为拍照的Pico开发板与ADXL345加速度传感器4线SPI接口通信连接实物图。

图6
Pico通过4线SPI通信接口读取ADXL345三轴加速度传感器数据MicroPython程序清单如下(按图2和图6所示的4线SPI接口连接,本程序运行通过):

Filename: ADXL345.py
import machine
import utime
import ustruct
import sys
# ADXL345常量
# ADXL345寄存器常量
REG_DEVID = 0x00  #0x00-器件ID寄存器, 用于获得器件ID
REG_POWER_CTL = 0x2D  #0x2D-节电控制寄存器
#0x32-X轴数据0寄存器,0x33-X轴数据1寄存器,...
REG_DATAX0 = 0x32
# 其它常量
DEVID = 0xE5  #0xE5-ADXL345器件ID
SENSITIVITY_2G = 1.0/256    # (g/LSB)
EARTH_GRAVITY = 9.80665     # 重力加速度[m/(s*s)]# 指定PIO17口线为程控从机片选CS
cs = machine.Pin(17, machine.Pin.OUT)# 初始化SPI
spi = machine.SPI(0,baudrate=1000000,polarity=1,phase=1,bits=8,firstbit=machine.SPI.MSB,sck=machine.Pin(18),mosi=machine.Pin(19),miso=machine.Pin(16))# 函数定义
def reg_write(spi, cs, reg, data):"""写入字节到指定的寄存器"""msg = bytearray()msg.append(0x00|reg)msg.append(data)cs.value(0)spi.write(msg)cs.value(1)def reg_read(spi, cs, reg, nbytes=1):"""从指定的寄存器中读取字节; 如果nbytes>1, 则从连续的寄存器中读取。"""if nbytes < 1:return bytearray()elif nbytes == 1:mb = 0else:mb = 1msg = bytearray()msg.append(0x80|(mb<<6)|reg)cs.value(0)spi.write(msg)data = spi.read(nbytes)cs.value(1)return data# 主程序
cs.value(1)
reg_read(spi, cs, REG_DEVID)
# 读取器件ID以判断是否能与ADXL345进行SPI通信
data = reg_read(spi, cs, REG_DEVID)test=bytearray((DEVID,))
if (data != bytearray((DEVID,))):print("出错: Pico不能与ADXL345进行SPI通信!")sys.exit()
data = reg_read(spi, cs, REG_POWER_CTL)
print(data)
data = int.from_bytes(data, "big")|(1<<3)
reg_write(spi, cs, REG_POWER_CTL, data)
data = reg_read(spi, cs, REG_POWER_CTL)
print(data)
utime.sleep(2.0)
while True:data = reg_read(spi, cs, REG_DATAX0, 6)acc_x = ustruct.unpack_from("<h", data, 0)[0]acc_y = ustruct.unpack_from("<h", data, 2)[0]acc_z = ustruct.unpack_from("<h", data, 4)[0]acc_x = acc_x * SENSITIVITY_2G * EARTH_GRAVITYacc_y = acc_y * SENSITIVITY_2G * EARTH_GRAVITYacc_z = acc_z * SENSITIVITY_2G * EARTH_GRAVITYprint("X=", "{:.2f}".format(acc_x), \", Y=", "{:.2f}".format(acc_y), \", Z=", "{:.2f}".format(acc_z))utime.sleep(0.1)

参考文献:
[1] ADXL345 Datasheet. ADXL345 3-Axis Digital Accelerometer.
[2]class SPI - a Serial Peripheral Interface bus protocol. https://docs.micropython.org/en/latest/library/machine.SPI.html

发布日期:2021年7月25日

树莓派Pico与ADXL345三轴加速度传感器SPI总线接口技术及MicroPython编程相关推荐

  1. ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  2. ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  3. ADI Blackfin DSP处理器-BF533的开发详解61:DSP控制ADXL345三轴加速度传感器-LCD(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  4. ADI Blackfin DSP处理器-BF533的开发详解62:DSP控制ADXL345三轴加速度传感器-贪食蛇游戏(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  5. ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  6. 三轴加速度传感器bma150驱动解析

    BMA150 博世 三轴加速度传感器 SPI(4线,3线),i2c,中断引脚 频响+/- 2g,4g,8g;带宽25~1500hz,中断触发内部加速度求值 低功耗,快速唤醒 包含数据寄存器,控制寄存器 ...

  7. STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  8. 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器

    1 产品介绍 MSV3100A三轴加速度传感器 MSV3100A是一款三轴向模拟输出的MEMS加速度传感器.传感器由三个相互正交的微加速度计和信号变换电路组成.能够承受高达10,000g的冲击载荷和恒 ...

  9. 溢出检测单符号位法_设计经验:如何用三轴加速度传感器检测倾斜角?

    本文介绍了三轴加速度传感器的特性,并通过一个典型的应用--检测倾斜角--对单轴.双轴和三轴加速度传感器进行了比较,并给出了选型建议. 在前两篇文章中,我们介绍了单/双轴加速度传感器在来检测倾斜角上的应 ...

  10. android SENSOR_ACCELEROMETER 三轴加速度传感器

    先看效果图: package org.ninetripods.mq.asdasdasdasdasdas; import android.content.Context; import android. ...

最新文章

  1. 微生物生态期刊Soil Biology and Biochemistry(SBB)简介
  2. 补psp进度(11月4号-9号)
  3. 提高工作效率-shell操作快捷键
  4. Python去线性化趋势
  5. 什么就像谈恋爱一样?
  6. UOJ284 快乐游戏鸡(树上动态规划问题、长链剖分+单调栈)
  7. MySQL 聚合函数(一)聚合(组合)函数概述
  8. py2exe打包python_Python打包-py2exe使用
  9. php 句号,句号 - Programming Life - PHP博客
  10. Nginx中传输带宽限制
  11. selenium网页截图总结
  12. 微信中直接下载APK
  13. 淘宝买二级c语言题库可以嘛,大学计算机二级考试(C语言)试题在哪可以买?...
  14. NANK南卡lite Pro无线蓝牙耳机上手体验
  15. vue父传子mounted问题
  16. python calu_Python的Woe:Woe库功能的介绍、安装和使用,之,woewoe,库函数,简介,方法,详细,攻略...
  17. 微信开店需要营业执照吗?微信开店需要准备哪些资料?
  18. Python基础笔记_Day14_Python图形化界面、Python GUI、tkinter、Python英汉词典
  19. 隔板法详解(各种方法)
  20. android手机通讯录备份还原代码,安卓手机误删联系人恢复及备份技巧总汇

热门文章

  1. PHP生成海报/PHP合并图片/PHP图片处理
  2. High Scalability创始人Todd Hoff:Facebook网络性能的秘密武器
  3. NerveBridge 助力 YF 和 Bingoo 社区实现资产跨链
  4. lens flare:镜头光晕
  5. 51单片机的中断源入口地址是程序存储器空间的5个单元
  6. VS2008 Pocket PC 2003 SE仿真程序上网设置
  7. html 滑动刻度尺,js实现移动端H5页面手指滑动刻度尺功能
  8. php 786.00,美國佛羅裡達州區號786
  9. linux 翻录cd,Linux下一个CD翻录 创CUE 压缩flac攻略
  10. 免费stm32视频教程分享:心率检测仪的设计与实现