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数据的原因,数据做如下说明:
波形上显示读到的数据为: 0xFF、0xFF、0xFF、0x17
实际FIFO读到的数据为: 0xFF、0xFF、0xFE、0x2E
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个字节没收完的情况: