模块外部总线接口常见用法-SPI总线01

柴松 合宙Luat 昨天


目前合宙Air系列模块外部可用的通用总线接口基本上有UART、I2C、SPI这三种,为方便大家了解和使用,近期将陆续对这三种总线进行一一介绍,并结合常用外部器件总线进行实测。


今天,我们先从SPI总线开始。






1


SPI总线简介




SPI接口的全称是“Serial Peripheral Interface”,意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。

SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,分为三线式和四线式通讯,其中Air系列物联网模块主要支持4线式。接口定义如下:



1. 接口名MOSI
    模块引脚:SPI_DOUT,
    功能:模块输出,从器件数据输入;

2. 接口名MISO
    模块引脚:SPI_IN,
    功能:模块输入,从器件数据输出;

3接口名SCLK
    模块引脚:SPI_CLK,
    功能:时钟信号,由主器件产生;

4接口名/SS
    模块引脚CS
    功能:从器件使能信号,由主器件控制。





为了更快的响应数据,不少电路还扩充了中断引脚和一些电路控制引脚,通过模块GPIO来实现,如:


  1. INT 模块引脚:任意GPIO        -从设备中断信号,通知主器件进行操作 (可选)



SPI模块允许MCU和外围设备之间的双工、同步、串行通信 软件可以轮询SPI状态标志,或者通过外部GPIO触发的中断进行控制。 

SPI接口是在CPU和外围低速器件之间进行同步串行数据传输的接口,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,数据传输速度可达到几Mbps。在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。

SPI设备也可以与多个从设备进行数据交换,当对应/SS置为高电平时,未被激活设备的MISO会成为高阻状态,从线路上断开。而只有被选中的设备控制总线的电平变化。

设备连接示意图如下:



SPI还有一些突出的优势,因为主时钟是由主机进行同步的,因此在读写的时候主机时序要求宽松,既可以快速也可以慢速,只要时钟和数据位对齐即可,因此采用GPIO软件模拟低速SPI非常容易,后面也会在实验中加以测试






2


SPI的基本时序




在数据交换之前,主控制器和从设备会将存储器数据加载至它们的内部移位寄存器


收到时钟信号后,主控制器先通过 MOSI 线路时钟输出其移位寄存器的 MSB。同时从设备会读取位于 SIMO 的主控器第一位元,将其存储在存储器中,然后通过 SOMI 时钟输出其 MSB。主控制器可读取位于 MISO 的从设备第一位元,并将其存储在存储器中,以便后续处理。


整个过程将一直持续到所有位元完成交换,而主控器则可让时钟空闲并通过 /SS 禁用从设备





除设置时钟频率外,主控制器还可根据数据配置时钟极性和相位。这两个分别称为 OPOL 与 CPHA:



CPOL = 0 时,时钟空闲在逻辑 0 位置上:


  1. 如果 CPHA = 0,数据在 SCK 的上升沿读取,在下降沿变化。

  2. 如果 CPHA = 1,数据在 SCK 的下降沿读取,在上升沿变化。

CPOL = 1 时,时钟在逻辑为高时空闲:


  1. 如果 CPHA = 0,数据在 SCK 的下降沿读取,在上升沿变化。

  2. 如果 CPHA = 1,数据在 SCK 的上升沿读取,在下降沿变化。



通常情况下我们 CPOL 和 CPHA 均置为 0 的场景比较多,下面是简化过的时序图,在时钟的上升沿采样MOSI和MISO两根数据线上的数据,是不是看上去更好懂一些呢:







3


SPI实际应用





在进行SPI4线式数据读写时,我们经常遇到的是如下这样的时序结构:




SPI读操作指令由8bit C0-C8的首字节构成,在MOSI线路传输指令时,同时由MISO传入设备的状态信息 S0-S8 构成首字节,然后其余的数据D0-DXX 附加在首字节后在MISO线上由设备传到模块。




SPI写操作指令由8bit C0-C8命令首字节加上D0-DXX的数据构成,在MOSI线路由模块传向设备,同时由MISO传入设备的状态信息 S0-S8构成返回信息。


为了仅读取状态信息,也可以不发送数据字节,成为NOP操作,时序更为简单。





4


SPI总线测试方法




对于SPI主设备,最简单的测试方法是打环测试,即将MOSI和MISO直接短接,这样我们可以从读寄存器得到发送信息的副本。

当然,也可以将MISO置高,或者置低,那么我们将可以从寄存读取到 0xFF或者0x00 的数值。此时从 SCK 和 MOSI 上则能读出与输入相匹配的方波信号。



SPI 打环测试


  1. 发送 01010101

  2. 接收 01010101

  3. --SPI 置低测试MISOGND

  4. 发送 XXXXXXXX X是任意高低电平)

  5. 接收 00000000

  6. --SPI 置高测试MISOVCC

  7. 发送 XXXXXXXX X是任意高低电平)

  8. 接收 11111111

下一篇文章,我们将结合Air720SL系列模块对SPI总线进行相关测试,敬请关注。








感谢阅览本期内容

欢迎文末留言互动


本期文末最先留言的五位同学

— 将获得合宙商城五折券一张 —


五折券有效期至2月29日

点击公众号菜单“合宙商城”即可使用

2月1日起合宙商城已恢复正常发货







- 粉丝专有福利 -


请由公众号菜单“合宙商城”进入或长按下图识别二维码直达,领取粉丝专有福利↓↓↓




DIY无线电话机 -


- 往期官方教程 -



刘晨旭白话Lua零基础系列教程:

白话Lua教程第一期:初识Lua

白话Lua教程第二期:变量

白话Lua教程第三期:字符串

白话Lua教程第四期:逻辑运算

白话Lua教程第五期:分支判断

白话Lua教程第六期:函数

白话Lua教程第七期:Table



●  Luat系列官方教程1:下载调试工具LuaTools

●  Luat系列官方教程2:控制LED小灯

●  Luat系列官方教程3:Luat程序的基本时序

  Luat系列官方教程4:Luat程序的基本时序

●  Luat系列官方教程5:Socket代码详解

●  Luat系列官方教程6:MQTT代码详解

●  Luat系列官方教程7:串口收发




●  Luat程序如何实现延时运行

●  2G/4G系列模块Lua版本串口功能汇总

●  史上最详细的4G模块驱动安装教程

●  4G模块AT版本PDP使用汇总

●  4G模块AT版本MQTT应用说明

●  4G模块AT版本HTTP应用说明

●  4G模块在Linux 设备上的RNDIS网卡使用

●  4G模块Linux USB驱动以及PPP拨号说明





点亮在看,和更多人一起了解物联网

↓↓↓