Pmod通信:串行外设接口

欢迎回到Digilent博客!

不久前,我们了解到Pmods能够做到这一点的一种方式与他们的主机板沟通是通过SPI。我们知道那串行外围接口是一种通信协议的“主人”,“奴隶”设备(在这种情况下,Pmod)能够互相发送的数据在同一时间与主机板控制沟通的时机。尽管这是一个很好的概述,但根据我的个人经验,理论概述在实际执行我们所学内容时并不是最有帮助的。这就引出了一个问题:你如何使用SPI吗?让找到!

在基本的层面上,所有的电子设备都根据它们接收到的电压信号(无论是高电压信号还是低电压信号)来运行和做不同的事情。串行外围接口以串行(顺序)方式发送这些相同的高、低电压信号。SPI和使用简单的“开”和“关”信号之间的区别是,SPI在一行中发送8个这些“开”和“关”信号(数据位)。这8个信号允许更精确的输出(而不是完全打开或完全关闭),允许多个输出(或多或少)同时受到影响,允许执行一组选项中的特定操作,或所有这些操作的组合。此外,所有这些事情都可以在两个方向上发生——同时发生在主设备和从设备上。本质上,SPI允许电子设备的用户以更巧妙的方式操作它们。

为了更巧妙地操作,需要更多的导线来连接两个通信设备。SPI使用四根电线:芯片选择线(CS或SS奴隶select)表示,“奴隶”的设备,它会有一个对话的“主”装置,两个数据电线,Master-Out-Slave-In(莫西人)和Master-In-Slave-Out(味噌)数据前往奴隶的奴隶设备和装置,分别以及串行时钟线(SCK),主控“脉冲”控制两个设备之间通信发生的速率。在Pmods上,SPI引脚与CS线排列在引脚1位置,然后是MOSI、MISO和SCK线。最后一对电源线和地线使使用SPI的Pmods成为一个6脚的外围模块。

Digilent的SPI Pmod操纵杆
Digilent的6针SPI外围模块之一,PmodJSTK。

通常,SPI协议背后的许多细节可以由SPI库处理。然而,我个人认为,理解库中发生的事情,并能够用自己的代码复制它,从长远来看是非常有价值和更有帮助的。

回到SPI!SCK线的“脉冲”是通过让主电路的电压在逻辑高压和逻辑低压之间振荡来实现的。首先传输最高有效位(MSB)或最低有效位(LSB)的8位数据中的一位,通过将导线置于高电压或低电压,由主设备和Pmod(从设备)放置到相应的数据线上。然后根据从设备期望接收信息的时间,被对面的设备接收。当串行时钟从低电压状态过渡到高电压状态(时钟上升沿)或时钟下降沿(时钟从高电压状态过渡到低电压状态)时,可以进行信息接收。这些过渡状态,以及时钟开始时的电压水平,构成了所谓的SPI模式,如下表所示。SPI模式0是最常用的模式之一;这就是为什么它在列表的顶端。

四种可能的SPI模式。
四种可能的SPI模式。

所以,如果主设备和从设备要互相发送一个210(二进制的11010010)的值,1代表一个高电压信号和0代表一个低电压信号)奴隶设备需要接收信息在时钟的时钟的下降沿最初开始在低电压状态和数据发送MSB首先,下列顺序需要发生。主设备首先将适当的CS带入低电压状态。然后,SCK线将被带到一个高电压状态来准备时钟。然后,主设备将适当地将MOSI线带入高电压或低电压状态,从设备也将这样做(由于我们作为人类用户通常不直接控制从设备在MISO线上放置什么)。

在将数据线调到适当的电压水平后,主从设备将SCK线调到较低的电压水平,从而使主从设备都能接收到适当数据线上的数据。时钟线脉冲和数据发送共发生8次后,主控将芯片选择线调到一个高电压电平,结束与外围模块的通话。您可以在文本下方的图片中看到这个过程的可视化表示。

当两个设备互相发送210的值时,在SPI中的每条线看起来的时序图
当两个设备互相发送210的值时,在SPI中的每条线看起来的时序图。

在SPI协议中,您一次只能发送8位(1字节)的数据,没有例外。那么,当你遇到像Digilent的PmodDA4这样的设备时,你该怎么办呢DAC,它需要12位的数据通过SPI?我建议做的第一件事是不要恐慌——它就是这样设计的。我要做的第二件事是检查数据表模拟设备AD5628PmodDA4使用的芯片。稍微搜索一下,我们可以在22页发现我们发送的不仅仅是12位的数据,而是32位的数据。这32位可以很容易地分成4个字节,允许SPI像它设计的那样工作。

32位的数据可以分成4个字节,每个字节8位。
32位的数据可以分成4个字节,每个字节8位。

但是,虽然能够从一台设备向另一台设备发送数据至关重要,但接收数据也同样重要。我们通常不担心从设备接收数据,因为,作为用户,我们并不总是能够直接访问设备通过SPI发送和接收的数据;这往往是由设备上的芯片内部处理的。虽然主设备并不总是需要从Pmod接收数据来让模块正常工作,但有时主设备确实需要从Pmod接收信息,就像您从PmodJSTK接收输入时需要做的那样。

接收信息的方式有两种。如果手动发送信息位并通过代码控制时钟,则可以使用数组在数据被从设备传输后存储每一位信息,然后在以后访问数据以对其进行适当的解密。使用一个库,比如Digilent设计的DSPI库,数据位仍然被单独收集和存储,但是在信息被传输后,你可以作为一个字节访问所有的位。

您可以在下面的代码中查看SPI的示例。

一个SPI在代码中的样子的例子。
一个SPI在代码中的样子的例子。

查看我们的Pmod系列的其余部分,并很快回来获取更多!

0
第一个投票。

关于詹姆斯·科尔文

我最喜欢的事情就是学习新东西。特别是涉及某些技术的事情;电脑组件、有趣的小工具、游戏、编码技术等。我喜欢和我的妻子和两个儿子在一起,也喜欢和朋友们在一起。在我的日常工作中,我管理Digilent论坛和北美支持团队。

查看所有由James Colvin→发布的帖子

《Pmod通信:串行外设接口》评析

留下一个回复

您的电子邮件地址将不会被公布。必填字段被标记