Synchronous Serial Port 协议详解

发布于:2024-12-21 ⋅ 阅读:(11) ⋅ 点赞:(0)

1、简介

Synchronous Serial Port (SSP) ,基于下图文档的设计标准

在这里插入图片描述

1.1、包含3种数据帧格式:

  • a Motorola SPI-compatible interface(以下简称SPI)
  • a Texas Instruments synchronous serial interface(简写SSI,以下简称SSP格式)
  • a National Semiconductor Microwire interface(以下简称Microwire)

1.2、共同点:

  • 都用4根线,CS、TXD、RXD、CLK
  • 都有master和slave模式

1.3、差异点:

  • SSP的CS由一个时钟周期的高电平脉冲表示开始,SPI和Microwire的CS是拉低有效,SSP的章节会详细展开
  • SPI比SSP和Microwire更为灵活,相位、极性可配,SPI的章节会详细展开
  • Microwire需要配置方向,告知发送还是接收;SSP和SPI,写数据寄存器就是发送,读数据寄存器就是接收;SPI的章节会详细展开

2、SPI(Motorola SPI-compatible interface)

  • SPI是一种同步的全双工通信协议,TXD和RXD可以同时工作。
  • 时钟由主机产生。
  • 支持一个master对多个slave,CS拉低控制哪个slave被选中。
  • 支持各种bit宽度的帧格式,一帧一般小于等于32bit。
  • 有多种工作模式,只发、只收、同时收发等。
  • 时钟极性和相位可配置,极性决定空闲时CLK的电平高低,相位决定第几个时钟沿采样数据

2.1、连接线

  • CS:片选线,也叫SS,拉低后开始传输,拉高后结束传输,支持发多帧数据时CS一直拉低,支持每帧以CS拉低开始CS拉高结束
  • CLK:时钟由master提供,支持的频率很宽泛
  • TXD:发送脚,又名MOSI,master输出脚接slave输入脚。TXD接对测设备RXD。
  • RXD:接收脚,又名叫MISO,master输入脚接slave输出脚。RXD接对测设备TXD。

对接方式如下图:

在这里插入图片描述

2.2、传输模式

(1)、只发不收
  • 只用到TXD,CS和CLK这3根线,顾名思义,只发送数据,不接收数据

  • 控制LCD屏幕,会用到只发不收模式,LCD屏只接收控制命令数据。

  • 例如下图,发送1帧数据,0x15BF的数据宽度为13bit

  • 注意:数据一般是先发送高位,有些控制器大小端可配

在这里插入图片描述

(2)、同时收发
  • 4根线都会用到,发送数据的同时也在接收数据
  • 控制FLASH、EEPROM,会用到此模式。FLASH接收到命令后延时一段时间,才会返回真实的数据,所以master需要发几帧无效的数据,等待slave返回真实值。
  • 例如下图,读FLASH设备ID,发送1帧命令+4帧dummy,接收5帧数据,数据宽度为8bit
  • 发送数据为:0xAB、0xFF、0xFF、0xFF、0xFF(命令:0xAB)
  • 接收的数据为:0xFF、0xFF、0xFF、0xFF、0x17(FLASH ID:0x17)

在这里插入图片描述

(3)、只收不发
  • 只用到RXD,CS和CLK这3根线,只接收数据,不发送数据
  • 比如作为slave模式时,只接收master发来的数据
  • 波形和只发不收模式类似,master的TXD接到slave的RXD

2.3、CS的多种实现方式

(1)、用GPIO模式CS脚
  • 有些SPI控制器规定,在TXFIFO发空后,CS会被拉高,CLK时钟也会停止。对于FLASH这种器件,需要先发送命令,再接收数据的需求就不能满足,不可能TXD一直在发送dummy byte,尤其是读大量数据时。那么CS就可以复用成GPIO功能,或用另外一个GPIO代替。
  • 需要CS拉低时,GPIO输出低
  • 需要CS拉高时,GPIO输出高
  • 这需要熟读FLASH手册,且软件操作相对复杂
  • 例如ST的示例代码,就是用GPIO模拟CS,可以得到同时收发模式的波形:
u32 SPI_FLASH_ReadDeviceID(void)
{
  u32 Temp = 0;

  /* GPIO 输出低,Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();

  /* Send "RDID " instruction */
  SPI_FLASH_SendByte(W25X_DeviceID);
  SPI_FLASH_SendByte(Dummy_Byte);
  SPI_FLASH_SendByte(Dummy_Byte);
  SPI_FLASH_SendByte(Dummy_Byte);
  
  /* Read a byte from the FLASH */
  Temp = SPI_FLASH_SendByte(Dummy_Byte);

  /* GPIO 输出高,Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  return Temp;
}
(2)、SPI自带的CS功能
  • 缺点TXFIFO发空后CS就拉高了
  • 连续发送多个数据之后(在TXFIFO阈值内),再查询TXFIFO满状态,保证一直有数据可发
  • 通常这种方式只适用于同时收发模式,发送的同时也把数据收了。
  • 不一定能保持一直拉低的效果,需要抓波形确认。
  • 下图是CS每帧都拉高的情况:

在这里插入图片描述

  • 或者使用DMA,事先把所有数据都准备好,一次性发完,就可以保证CS一直拉低。

在这里插入图片描述

2.4、SPI的相位和极性

  • CPOL,clock polarity,极性,决定空闲时CLK电平高低
  • CPHA,clock phase,相位,决定第几个时钟沿采样数据,有2种相位情况
    (1)、第1个时钟沿采样,第2个时钟沿数据正在改变
    (2)、第1个时钟沿数据正在改变,第2个时钟沿采样
  • 至于第1个时钟沿是上升沿还是下降沿,由时钟极性决定
  • 采样数据时,数据线上的电平值是稳定的,高电平表示1,低电平表示0
  • 发送数据时,数据正在发生改变,由0变1,或1变0
(1)、CLK空闲时为高电平,第1个时钟沿采样数据
  • 下图的CS空闲时为高电平
  • 第1个时钟沿(上升沿)采样数据,第2个时钟沿(下降沿)数据正在改变
  • 后续数据都是按上升沿采样,下降沿数据改变

在这里插入图片描述

(2)、CLK空闲时为低电平,第1个时钟沿采样数据
  • 第1个沿为上升沿,第2个沿为下降沿

在这里插入图片描述

(3)、CLK空闲时为高电平,第2个时钟沿采样数据

和(1)类似,只是变成了第2个时钟沿采样数据

(4)、CLK空闲时为低电平,第2个时钟沿采样数据

和(2)类似,只是变成了第2个时钟沿采样数据

3、SSP(Texas Instruments synchronous serial interface)

  • 特性和SPI类似
  • 相位和极性是固定的不可选
  • 最显著的差异点是,SSP的片选信号为脉冲信号,高有效。一个时钟周期的高电平表示传输开始,接下来CS会拉低,接着发送数据。
  • 下图可以直观的了解SSP的传输原理

在这里插入图片描述

  • 实在有点特殊,逻辑分析仪没有解析的方法,不过也不复杂

  • CS先发一个周期高电平,发送完一帧数据,CS再发一个周期高电平,再发下一帧数据

  • 下图表示帧结束的波形,CS保持低电平状态:

在这里插入图片描述

4、Microwire(National Semiconductor Microwire interface)

  • 相对于SSI和SSP来说,Microwire只是半双工协议,不能同时收发
  • 波形和SPI类似
  • TXD发送期间,RXD无效
  • RXD接收期间,TXD无效
  • 从功能上来说和用SPI控制FLASH一样,需要先发命令,再发数据或接收数据
  • 发完命令再接收数据,会有一个dummy bit的等待时间才采样RXD数据

在这里插入图片描述

  • 和SPI的同时收发模式对比,Microwire先发送控制命令0xAB,再接收4个字节,也能读到FLASH ID
  • Microwire因为会延后1个dummy bit才采样RXD数据的原因,数据做如下说明:
波形上显示读到的数据为: 0xFF0xFF0xFF0x17
实际FIFO读到的数据为: 0xFF0xFF0xFE0x2E
FIFO的数据需要往右移动1位才是FLASH ID值:0x2E >> 1 = 0x17
  • 支持Microwire协议的设备,接收到命令后,默认延后1个dummy bit才返回数据。但FLASH一般不会,用Microwire控制flash,需要对FIFO数据做移位操作。

5、slave模式说明

  • 上述章节描述的都是master模式下的功能,slave模式和master类似,但也有需要注意的地方

  • slave支持只收、同时收发等模式

  • 因为CLK由master提供,需要2端配合传输。slave接收到数据之后,才会往外发送数据,所以会有1~2个dummy byte的延迟,master才会收到数据。具体延迟多少,可以抓波形确认。

  • 例如SSP帧格式,2个控制器master、slave都配置为同时收发模式,下图为2端交互的波形

在这里插入图片描述

  • 上图可以看到,master在发完0xFF之后,slave才开始发送第1个数据0x00,是为了完成同步,所以多发了一个0xFF,那么为了最后不丢数据,也要多接收一个字节

  • 例如收发256个字节:

master向slave发送0x00 ~ 0xFF,依次加1
slave向master发送0xFF ~ 0x00,依次减1
  • 假如不做同步,只收发256个字节,master接收slave发来的数据时,会出现前2个字节都为0,最后还有2个字节没收完的情况:

在这里插入图片描述