首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >迷乱的通信协议之SPI分析

迷乱的通信协议之SPI分析

作者头像
狂人V
发布2020-06-29 10:31:27
1.8K0
发布2020-06-29 10:31:27
举报
文章被收录于专栏:电子狂人电子狂人电子狂人
重新回顾了一下SPI这个通信协议,感觉有现成的驱动文件真安逸,不过为了做成一份记录进行发出,还是耐着性子折腾了。

首先了解下SPI的背景,SPI——串行外围设备接口(serial peripheral interface)的缩写。是Motorola公司首先在其MC68HCXX系列处理器上定义的,是一种高速的、全双工、同步的通信总线。

SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器等方面,SPI通信原理很简单,以主从方式工作,与IIC的方式类似,可以一主多从,信号线一般是4根线,当使用半双工方式进行数据传输的话,就是三根了;

也许你对全双工和半双工这个概念不清楚,其实很简单,全双工就是通信允许数据在两个方向上同时传输;半双工指的数据可以在两个方向上传输,但是不同时。

如果还是不太理解的话,可以把它想象成通行的车子,全双工:两辆车子(数据)在双向通道上,道路(信道)够宽,两车可以互不影响的同时通过该道路;半双工:两辆车子还是在一个双向通道上,但是道路很窄,只允许一辆车通行,这时,辆车相遇,就必须要有一辆先通过,然后另外一辆才能再通过。

接下来对信号线进行讲解

四根信号线分别为:

SDO--数据输出,SDI--数据输入,SCLK--时钟信号,CS--片选信号。

对应着MOSI,MISO,SCLK,CS这四个信号。

MOSI是SPI总线主机输出/从机输入——SPI Bus Master Output/Slave Input;

MISO是SPI总线主机输入/从机输出——SPI Bus Master Input/Slave Output;

SCLK是时钟信号,由主机产生,从机跟随使用;

CS是从设备使能的一个信号,由主机控制选择,当片选信号为正确的使能信号时(因为有可能为高电平,也可能是低电平),对从机的操作才有效。

挂载多个设备时可以有以下的连接方式,叫做独立从设备,如下图所示,还有一种叫做菊花链从设备,感兴趣的可以自行了解具体,数据流动方向大概是这样的:主机->从机1->从机2->从机3->…->从机N->主机,构成一个环路的感觉。

从上图可以看出,当片选信号选定好从机后,主要就是靠SCLK,MOSI和MISO进行数据的传输了。

需要注意的的一点,SPI控制器中,主机设备需要能够控制时钟,是因为SPI的通信与之前所讲的IIC和UART这两种通信不同,没有专门的起始信号和停止信号,所以当没有数据的传输时,时钟需要保持空闲状态,可能为高电平,也可以是低电平,需要与工作模式进行对应,接下来开始讲解SPI的四种工作模式。

总共有四种工作模式,有以下的组合:

CPOL是指时钟极性,CPOL=0:SCLK空闲时为低电平,高电平为有效状态;CPOL=1:就反过来,空闲时为高电平,有效状态是低电平的时候。

CPHA是指时钟相位,CPHA=0,时钟的第一个时钟边沿,就是从空闲状态进入有效状态的边沿,CPHA=1,时钟的第二个边沿,指时钟信号从有效状态进入空闲状态的边沿。

再对四种模式进行文字表述

Mode 0:CPOL=0, CPHA=0;空闲时为低电平,第一个边沿进行采样,即上升沿采样;

Mode 1:CPOL=0, CPHA=1;空闲时为低电平,第二个边沿进行采样,即下降沿采样;

Mode 2:CPOL=1, CPHA=0;空闲时为高电平,第一个边沿进行采样,即下降沿采样; Mode 3:CPOL=1, CPHA=1;空闲时为高电平,第二个边沿进行采样,即上升沿采样;

为方便大家理解,我绘制了一个图,请仔细比对数据最高位(MSB)所对应的边沿。

顺便说下传输时序怎么理解,数据传输利用的是两个移位寄存器,传输的数据可以是8位,也可以是16位,在主机产生片选信号和时钟信号后。数据按位传输,高位在前,低位在后,如上图所示,每产生一次工作模式对应的沿变化,就存入一位数据至移位寄存器进行传输。

也许你看到这么多模式,或许有点迷了,其实实际上SPI设备的模式是固定的,可以在从机设备对应的datasheet中找的使用的模式,然后在主机中做好对应模式进行配置即可;如果从机设备是可由自己用软件配置的,也需要保持主机的模式与配置的从机一致,因为主从机之间的发送数据和接收数据都是同时完成的,所以为保持通信正常,一定要使得主从机的工作模式相同,有一致的时钟极性和时钟相位。

你理解完上面说的传输时序后,对于数据的传输也会有了一定的猜想,在一个时钟周期内,完成如下的操作:

1)主机通过MOSI发送1位数据,从机通过MOSI读取这1位数据;

2)从机通过MISO发送1位数据,主机通过MISO读取这1位数据;

这利用的就是刚才讲的移位寄存器,主机和从机都各有一个移位寄存器,二者构成一个环路,随着时钟信号的变化,依此传输数据,当寄存器的内容全部移出后,就相当于数据传输完成,数据传输的样子如下图所示:

突然发现画这些图挺累的

当你看完整篇时,你会发现我并没有分析过和IIC相似的读写过程,其实业界并没有统一的SPI标准,具体的使用需要参考相关器件的手册,如果想进行实际的编程使用,可以先参考SPI Flash的读写,推荐W25QXX这系列的Flash芯片,然后编完了整个读写的驱动过程后,你会对整体有个更加清晰的认识,当然,以后时间足够的话,也会进行相关驱动代码的编写,应该是使用硬件语言进行设计。

敬请期待吧~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子狂人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档