SPI

SPI的特性是工作方式众多,有标准SPI和QSPI:

QSPI: QSPI 是 Queued SPI 的简写,是 Motorola 公司推出的 SPI 接口的扩展,比 SPI 应用更加广泛。在 SPI 协议的基础上,Motorola 公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即 QSPI 协议)。使用该接口,用户可以一次性传输包含多达 16 个 8 位或 16 位数据的传输队列。一旦传输启动,直到传输结束,都不需要 CPU 干预,极大的提高了传输效率。与 SPI 相比,QSPI 的最大结构特点是以 80 字节的 RAM 代替了 SPI 的发送和接收数据寄存器。

Dual SPI Flash: 对于 SPI Flash 而言全双工并不常用,可以发送一个命令字节进入 Dual 模式,让它工作在半双工模式,用以加倍数据传输。这样 MOSI 变成 SIO0(serial io 0),MISO 变成 SIO1(serial io 1),这样一个时钟周期内就能传输 2 个 bit 数据,加倍了数据传输。

Quad SPI Flash: 与 Dual SPI 类似,Quad SPI Flash增加了两根 I/O 线(SIO2,SIO3),目的是一个时钟内传输 4 个 bit 数据。

所以对于 SPI Flash,有标准 SPI Flash,Dual SPI Flash, Quad SPI Flash 三种类型。在相同时钟下,线数越多传输速率越高。

RT-Thread 设备驱动SPI浅析及使用

SPI的Motorola SPI 通信协议和TI的SSP通讯协议:主要区别就是片选的不同:

Motorola SPI:通讯期间片选一直低电平(有效)

SSI(Synchronous Serial Interface):启动通讯时片选先置高,维持图个CLK周期然后拉低。

双机通讯问题:

对于全双工SPI通信,主从机之间的收发本质上是两个移位寄存器的数据交换。这里需要注意主机读的情况:主机想读多少数据就要向从机写多少数据,要考虑:

1.主从机SPI的底层配置
2.通信协议的设计;相对比较简单,根据自己的需求设计数据帧格式
3.主从机整体框架搭建;主要是关于中断

如果按照下面的读写,如果从机突然掉电,主机就一直等待 

 

NSS分为内部引脚和外部引脚。

NSS外部引脚可以作为输入(一般用作硬件方式从机的片选I)信号或者输出(一般用于主SPI去片选与之相连的从SP)信号。

这张图的解释。对于从机SPI寄存器CR1中的SSM位,置1时代表软件片选,置0时代表硬件片选。上图的意思是;如果SSM置0,则内部NSS由外部NSS引脚电平确定;如果SSM置1,内部NSS由SSI决定,通过CR1中的SSI位来驱动,此时外部NSS引脚无效了,随你怎么用,哪怕是复用为SPI_CS也起不到任何作用,因为内部的NSS电平是由SSI位决定的,注意它不是简单的“与门”。

对于从机而言,如果SSM=0,即硬件片选,则CS引脚必须连接到主机的CS上在CS=0时被其控制。在CS=1时被释放。才不会触发中断和接收数据。即从机必须设置SSM=0。

主机是软件片选还是硬件片选:对于一主多从的情况主机用软件片选,从机用硬件片选。

推荐软件片选,SSI=1维持主机地位。

如果主机选择了硬件模式,一般都会以为片选引脚会在发送时自动拉低,在结束发送时自动拉高,但是实际上,手册上的说法是:使能SPI后片选引脚就会输出低直到关闭SPI(对于我的使用场景,就算你一直拉低也没什么哈)。

从机如果软件片选,随便指定一个GPIO为外中断连接到主机的CS上,进入中断后,通过SPI_NSSInternalSoftwareConfig(User_SPI,SPI_NSSInternalSoft_Reset)。来控制CR1寄存器的SSI=0来选择片选,退出时来搞SSI=1取消片选,非常麻烦。

 

 

  按照标准的SPI协议,当SPI被配置为主机模式后,通过SPI对从设备进行操作时,其NSS应该自动置低,从而选中(使能)从设备;一旦不对从设备进行操作,NSS立刻置为高。

 

但是,我在实际调试过程中却发现:STM32 SPI NSS无法自动实现跳变。

      ST官方技术人员也证实:STM32 SPI NSS是不会自动置位和复位的。按照官方说法,ST已经将其列入了改进计划。

 

 

引申:其它的SSOE支持多主或动态切换:

   每个SPI设置成硬件NSS,通过NSS检测,一旦发现系统中无NSS低信号,自己就输出低,从而成为主机;当系统中有NSS低信号时(及已经有其它SPI宣布为主机),自己就配置为从机。所谓的hard模式的NSS,实际就是为了实现多机间通信的。

主机要想发数据:备注:都空闲时M_TX_PIN=S_TX_PIN=0,高有效。

  1. 先读S_TX_PIN,如果为高则退出,否则继续。
  2. 在将M_TX_PIN=1,延时一小会儿,再读S_TX_PIN,如果为高则M_TX_PIN=0退出,否则进入临界区保护进行发送操作。
  3. 发送完成M_TX_PIN=0退出。

从机操作类似。

 

硬件SPI:

STM32的NSS(输入输出、软硬件模式):

硬件一对一方式(2中方法):

1STM32的NSS=VCC;从机的NCC=GND

2STM32的NSS接到从端的NSS,然后使能SPI_CR2的SSOE位。当SSOE为1时,并且SPI处于主模式控制时,NSS就输出低电平,也就是拉低,自动选择从端。

软件模式(NSS分内部NSS和外部NSS):

主机(STM32MCU):设置SPI_CR1寄存器的SSM(使能软件管理NSSq位)为1和SSI(内部NSS拉高这样STM32的SPI为于主机)位为1,此时外部NSS可以配置成一般的GPIO.

从机(STM32MCU):SPI_CR1寄存器的SSM(使能软件管理NSSq位)为1和SSI=0;

若从机是非MCU则可以将从机CSS=GND或者一条IO(也可以是NSSPIN即外部NSS)来控制从机CSS

http://blog.sina.com.cn/s/blog_6d0c454d0101aax7.html

软件SPI:速度慢,但比较灵活。一主多从比较方便。

 MISO/MOSI与SI/SO:

注意主从机的MISO和MOSI是不交叉的,即主机的MOSI对从机的MOSI.

SI/SO:意思是串行输入和输出,单这个是不能确定怎么连接,需要知道标注SI的设备是做主机还是从机,若是主机表示输入即MISO.

posted on 2015-08-25 11:28  杰瑞鼠  阅读(744)  评论(0编辑  收藏  举报