SPI—读写串行 FLASH

SPI协议简介
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设
备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADCLCD 等设备与 MCU 间,
要求通讯速率较高的场合。

 

 

标号1处, NSS信号线由高变低,是SPI通讯的起始信号。 NSS是每个从机各
自独占的信号线,当从机检在自己的NSS线检测到起始信号后,就知道自己
被主机选中了,开始准备与主机通讯。
在图中的标号6处, NSS信号由低变高,是SPI通讯的停止信号,表示本次通
讯结束,从机的选中状态被取消。

 为什么MOSI,MISO信号线是两根交叉呢?因为这样可以在采样时传递0或者1两种选择,而选择切换时就在触发情况下进行切换(交叉处),所以spi的通讯,到底属于4种模式中的哪种模式很重要。

• CS(NSS)信号线在空闲状态为低电平时, CPOL=0;空闲状态为高电平时, CPOL=1
• CPHA=0MOSIMISO数据线的有效信号在SCK的奇数边沿保持不变,数据信号将在SCK奇数边沿时被采样,在非采样时刻, MOSIMISO的有效信号才发生切换。

• CS(NSS)信号线在空闲状态为低电平时, CPOL=0;空闲状态为高电平时, CPOL=1
• CPHA=1MOSIMISO数据线的有效信号在SCK的偶数边沿保持不变,数据信号将在SCK偶数边沿时被采样,在非采样时刻, MOSIMISO的有效信号才发生切换。 


 

 

 

 

 

 

 

 

 

 

编程要点:

 

上面的MISO,按照正常情况来说,这个引脚应该配置为输入模式,但是在SPI引脚复用的时候,配置成输出模式,也可以接收数据。

 

在复用模式的时候,配置成推挽或者开漏输出,也可以对输入数据寄存器访问,这样的复用情况下,可以输出也可以输入。但是要是你想配置成输入模式也具有输出功能,那就不切实际了,没有配置输出,肯定没有输出,没有配置输入,可我外部有输入时,在复用情况下,是可以接收输入的。

还要注意与MCU通信的SPI芯片手册对于SPI模式的描述,有的直接给出了模式,有的支持好几种,有的压根就不说,要你自己去看手册的时序图并自己判断。

比如:W25Q128 和ADS1256,都是SPI通信的,但是W25Q128的芯片手册比较人性化:

直接给出了支持模式0和模式3,而且我们知道,通信速率取决于速度更慢的一方,W25Q128也给出了:

但是,TI的ADS1256可没有那么人性化:

英文文档没有介绍关于4种模式的,只有通过时序,我们可以的知道是模式一。同样,速率也不是以时钟多少兆体现的,而是

SPS:每秒采样次数,sample per second。

经过这次项目对ADS1256的调试,对spi认识更加清楚了。

 接收和发送函数在同一个函数中:

SPI是全双工的,所以可以在发送的时候接收,也可以在接收的时候发送。但是,我们的通信都是先写发送,再写接收,我在想可不可以先写接收,再写发送呢?这样去想为什么是很好的学习方式,但是经过思考之后,应该是不可行的,必须先写发送再写接收,因为你要通过SPI通信,作为SPI通信发起者,应该先发送,再接收。经测试,也确实如此。(这里是我的推论,如果没有更改,证明测试之后如我预期)。



 

posted @ 2017-07-03 14:58  Crystal_Guang  阅读(14395)  评论(0编辑  收藏  举报