前言
通信是各种设备之间的必备功能,就像说话一样,是两个独立个体之间相互沟通的方式。但前提是通信双方都互相认可、理解并支持相互沟通的方式。就像一个说英语的美国人和一个说韩语的韩国人沟通,显然是无法沟通到一起去的。所以就必须制定互相之间的通信协议。比如,一个美国人只会说英语,但是因为英语是世界通用语言,所以一个韩国人学会了英语,这时候他想和只会说英语的美国人沟通,显然双方都要说英语才能顺利地沟通,这就是统一了通信协议。显然在不同的设备和机器之间也是如此,今天总结一下通信协议之SPI。
一、SPI是什么?
Serial Peripheral Interface简称SPI,中文译为串行外设接口。它是一种高速、全双工、同步通信协议。最早由Mototola公司提出,通信定义为MOSI、MISO、SCLK、CS四根线构成。多用于短距离通信,设备按照时钟源提供的形式被定义为主机或从机。
二、SPI通信协议
1.通信引脚说明
MOSI:主出从入的数据线
MISO:主入从出的数据线
SCLK:时钟线
CS:片选信号
时钟信号只能从主机发出,从机只能接收时钟信号。
2.通信格式说明
通信数据每次发送8bit数据。识别数据有两个关键,在上升沿还是下降沿读取数据和空闲电平是高电平还是低电平。这两种条件所有排列组合共有四种结果,如下图:
图中从上到下依次为:
第一种:空闲电平为高电平,读取边沿为上升沿。
第二种:空闲电平为低电平,读取边沿为下降沿。
第三种:空闲电平为高电平,读取边沿为下降沿。
第四种:空闲电平为低电平,读取边沿为上升沿。
这四种不同的模式可以通过不同的芯片寄存器配置。只要通信双方使用一致即可,如果不一致就会出现通信数据错误。
对于片选信号,往往是低电平表示本设备有效。想要接收或发送数据就必须先使能本设备。片选信号的控制是由本设备控制还是由主机控制取决于所在系统的设计。对于简单的单主单从的设计,可以选择主机CS和从机直连,也可以将从机片选默认接地始终选中。
SPI通信需要约定的信息如下:时钟频率、数据读取边沿模式、空闲电平状态、数据长度、CS如何选通、数据发送顺序(MSB / LSB)。
3.实现形式
硬件生成和软件模拟。
在实际应用中,一般选用硬件SPI。因为这样会减少CPU的处理压力,传输数据的工作全部交由硬件去实现。当然,也可以使用软件模拟来实现。但是软件模拟往往非常占用CPU处理时间,因为需要根据不同的传输频率进行不同的等待或定时中断。另外软件模拟产生的波形也没有硬件产生的优良。软件模拟往往会有一定延迟,但是硬件产生的输出信号很整齐。
4.三线制SPI
工程中也会有应用到三线制SPI的情况。个人认为三线制SPI分为两种情况。
第一种是省略CS线,这样就从四线制转为三线制。出现在单主单从,或始终需要选通设备的情况。
第二种是将MISO和MOSI两线通过外部电路合为一线,实现三线制。这种改法最关键的是把SPI从全双工转变为了半双工。并且实现形式较为复杂。主要体现在某一时刻只能输出或读取数据,但是在芯片内部采用的实际是四线制,这样收发两种数据就会混合在一条线上。同时半双工会降低传输速率,影响通信时间。
总结
SPI是非常常见并且基础的通信协议之一。在一些传感器和外部内存上经常用到。学习SPI通信最好的方式就是找相应SPI通信的传感器或模块进行实际的编程测试,并使用示波器观察波形。这样很快就会掌握其中的特点。然后回过头再理解一些其中的难点就会豁然开朗。