Synchronous Serial Port 协议详解
1、简介Synchronous Serial Port (SSP) ,基于下图文档的设计标准
https://i-blog.csdnimg.cn/direct/eda1b7029574445d825307ff55e40cfe.png
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。
对接方式如下图:
https://i-blog.csdnimg.cn/direct/f651fbe9d7ef4915a215a66b61f2b25d.png#pic_center
2.2、传输模式
(1)、只发不收
[*] 只用到TXD,CS和CLK这3根线,顾名思义,只发送数据,不吸取数据
[*] 控制LCD屏幕,会用到只发不收模式,LCD屏只吸取控制命令数据。
[*] 例如下图,发送1帧数据,0x15BF的数据宽度为13bit
[*] 注意:数据一般是先发送高位,有些控制器巨细端可配
https://i-blog.csdnimg.cn/direct/900ab04c5d8f4743af4c3374c7f761ce.png#pic_center
(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)
https://i-blog.csdnimg.cn/direct/0d1197bcee984561965ea3754d541cb2.png#pic_center
(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每帧都拉高的情况:
https://i-blog.csdnimg.cn/direct/c10cb457490047fd8cb2f8e6db0e4e60.jpeg#pic_center
[*]大概使用DMA,事先把全部数据都准备好,一次性发完,就可以保证CS一直拉低。
https://i-blog.csdnimg.cn/direct/1fce16ce4e20485b83e5f3c2117e516e.png#pic_center
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个时钟沿(降落沿)数据正在改变
[*]后续数据都是按上升沿采样,降落沿数据改变
https://i-blog.csdnimg.cn/direct/8de6fe417342471493c8df5a7b5b5a01.png#pic_center
(2)、CLK空闲时为低电平,第1个时钟沿采样数据
[*]第1个沿为上升沿,第2个沿为降落沿
https://i-blog.csdnimg.cn/direct/6ce5e3c3dc0a4124b7be22f16ecd7660.png#pic_center
(3)、CLK空闲时为高电平,第2个时钟沿采样数据
和(1)雷同,只是变成了第2个时钟沿采样数据
(4)、CLK空闲时为低电平,第2个时钟沿采样数据
和(2)雷同,只是变成了第2个时钟沿采样数据
3、SSP(Texas Instruments synchronous serial interface)
[*]特性和SPI雷同
[*]相位和极性是固定的不可选
[*]最显著的差异点是,SSP的片选信号为脉冲信号,高有效。一个时钟周期的高电平表现传输开始,接下来CS会拉低,接着发送数据。
[*]下图可以直观的相识SSP的传输原理
https://i-blog.csdnimg.cn/direct/491d3d7d5c334ea084a23a60c32778c0.png#pic_center
[*] 实在有点特别,逻辑分析仪没有解析的方法,不过也不复杂
[*] CS先发一个周期高电平,发送完一帧数据,CS再发一个周期高电平,再发下一帧数据
[*] 下图表现帧结束的波形,CS保持低电平状态:
https://i-blog.csdnimg.cn/direct/aad14143b7ed4d51928b6d19d3d3ff27.png#pic_center
4、Microwire(National Semiconductor Microwire interface)
[*]相对于SSI和SSP来说,Microwire只是半双工协议,不能同时收发
[*]波形和SPI雷同
[*]TXD发送期间,RXD无效
[*]RXD吸取期间,TXD无效
[*]从功能上来说和用SPI控制FLASH一样,必要先发命令,再发数据或吸取数据
[*]发完命令再吸取数据,会有一个dummy bit的等候时间才采样RXD数据
https://i-blog.csdnimg.cn/direct/66b19acd3f6245fcb27099b4ff1bfcc4.png#pic_center
[*]和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端交互的波形
https://i-blog.csdnimg.cn/direct/f49358ab091c4e6d9293de18546423d6.png#pic_center
[*] 上图可以看到,master在发完0xFF之后,slave才开始发送第1个数据0x00,是为了完成同步,所以多发了一个0xFF,那么为了末了不丢数据,也要多吸取一个字节
[*] 例如收发256个字节:
master向slave发送0x00 ~ 0xFF,依次加1
slave向master发送0xFF ~ 0x00,依次减1
[*]假如不做同步,只收发256个字节,master吸取slave发来的数据时,会出现前2个字节都为0,末了还有2个字节充公完的情况:
https://i-blog.csdnimg.cn/direct/565b58c564a14cbd80241afc735d9ee4.png#pic_center
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]