电子说
步骤1:总而言之,SPI是什么?
SPI是一种通信协议,最初是由Motorola开发的,在两个电子设备之间传输信息。这是一种全双工协议,这意味着两个设备能够同时彼此“交谈”。
这两个设备被指定为“主”设备和“从”设备。主设备是始终启动每个对话并控制对话进行速度的芯片。从设备仅在主设备请求时才同时发送和接收信息。
步骤2:如何进行SPI通信?
要使两个设备之间的通信正常进行,有四个使用的导线:通常标记为CS或SS(用于从机选择)的片选导线,主输出从输入数据线(MOSI),主输入从输出数据线(MISO)和串行时钟线( SCK)。
主设备将CS线拉低,以与另一侧的从设备指示它希望与其通信。因为这是一条单独的电线,被赋予了“低”电压信号,所以这意味着主机可以通过将其特定电线驱动为低电平来实际控制多个“从”设备。
MOSI和MISO数据行可以完成您可能已经猜到的事情;这两条线允许SPI为全双工。数据位以高电压或低电压信号的形式在两个设备之间沿一个方向或另一个方向传输,具体取决于我们正在查看的数据线。
SCK线控制速度传输MOSI和MISO线上的数据位。像CS线一样,SCK线也由主机控制,并以高和低周期驱动以创建“时钟脉冲”,以控制何时在这些线上传输数据。可以将SPI配置为在时钟变高或变低时传输数据。
第3步:您一直说数据的“位”
实际上是。 SPI被设计(并且是真正成为SPI所必需的)以字节大小的通信块工作,八位到一个字节。因此,对于每个数据传输,时钟和两条数据线上都会有8个时钟脉冲和8个数据传输。
但是,有些器件,例如ADI公司的AD5628芯片在Digilent的PmodDA4上,它使用串行外设接口,但表示它们传输12位数据而不是8位数据。虽然这似乎是不可能的,因为您不能使用SPI协议来传输8位数据,然后仅传输4位数据,但是当我们深入研究该芯片的数据手册时,便找到了解决方案。滚动一点后,我们可以看到DAC的移位寄存器实际上是32位长(第22页)。可以很好地将其分为四个单独的8位传输。
步骤4:我们如何传输此数据?
与其他通信协议不同,SPI是它能够以多种方式传输数据,因此功能相当广泛。根据每个芯片想要接收数据的方式,可以先发送最高有效位(MSB)或先发送最低有效位(LSB)来发送信息。
但是真正的多功能性来自四种不同的SPI时钟模式,可供选择。这些模式可以调整时钟信号是从高电压值开始还是从低电压值开始,以及数据的位是随着时钟信号转变为高电平状态而传输还是随着时钟转变为低态状态而传输。上表概述了每种时钟模式的配置。同样,根据设备期望接收信息的方式来选择每种模式。
因此,如果我们希望两个设备通过SPI互相发送210值,则最高位首先,在时钟下降沿传输数据,首先让主机将芯片选择线拉低,然后使时钟信号拉高,让每个设备将适当的位“加载”到数据线上,然后让主机将时钟信号拉低,以便两个设备“收集”在线上的数据位。重复该过程,直到所有位均已传输,然后主机最终再次将芯片选择线拉高以结束通信。
步骤5:接收数据如何?
要正确接收数据所需执行的操作取决于接收数据的组件类型。如果您拥有主设备(通常是某种形式的微控制器),则将信息发送到另一设备,该设备不是微控制器,而只是一个只做一件事并且永远不会回应您的小芯片(例如在这种情况下产生模拟电压信号) (Analog Devices AD5628),那么作为用户创建威廉希尔官方网站 的用户通常不需要执行任何操作。只需确保您以设备想要接收的格式将信息发送到设备即可。
如果您希望从设备接收反馈(或者正在将信息发送到所需的其他微控制器)进行编程以正确接收和解释传入的信息),您可能需要做两件事。如果您使用的SPI库支持全部接收(并返回)8位数据,例如chipKIT/Arduino的SPI库,那么您可以简单地将所有信息接收并存储到一个变量中
如果不使用SPI库,则必须收集各个信息位,然后将它们“网状”在一起。 (可能)最容易通过接收数组中的信息位来完成。
步骤6:需要考虑的其他事项
尽管看起来SPI是通过某种方式完成的并且可以始终如一地工作,但情况并非总是如此。尝试使用主设备与其从芯片进行通信时,线路的另一端可能没有从设备。作为主设备的电子芯片无法物理地知道它是否通过电线连接到其他芯片。
此外,SPI中可能使用的许多代码仅用于SPI库。一些配置(例如,是否应首先发送最高或最低有效位或何时应在时钟周期发送)仅由库处理。但是,也可以“手动”执行SPI协议。毕竟,SPI使用的所有信号就是这样。高低压信号。因此,只要将主机用于发送电压信号的引脚连接到“从”设备上的正确引脚,就可以通过“ SPI”完成通信,而无需实际使用指定的SPI引脚。
自然地,使用SPI库可能会更快(无论是键入速度还是实际速度),但是很高兴知道所有通信(无论是SPI还是其他方式)实际上都是电压信号。/p》
第7步:运行SPI:没有库
虽然理论很不错,但我个人也看到了有关某物的实际示例时,它会更有用看起来像在代码中。这将不需要使用预定义的SPI库,因为我认为查看SPI协议的各个部分何时发生会更有帮助。代码本身(在下面的文本文件中提供)基于Digilent的uC32,这是一个功能强大的Arduino兼容微控制器。
步骤8:运行SPI:使用库
您还可以将SPI与适当的库一起使用。这种方法(毫不奇怪)大大减少了您作为用户需要键入的代码量,但同时从本质上来说还是抽象的。除非您已经知道每个命令在内部执行的操作,否则没有简单的方法只能通过查看它们来弄清楚发生了什么。
步骤9:一些最终想法
正如我之前提到的,SPI是电子领域中使用最广泛的通信协议之一,但并没有给人以为使用 协议的印象。 ; I2C,UART,USB等许多其他协议,甚至简单的通用输入/输出(GPIO)引脚在通讯方面都有其优点和缺点。
全部0条评论
快来发表一下你的评论吧 !