通信协议学习笔记(一)- SPI协议

通信协议学习笔记(一)- SPI通信协议

    • 概述
    • 应用
    • 特点
    • SPI通信原理
    • SPI通讯模式
    • SPI通信时序
    • 软件模拟SPI时序举例

概述

SPI(Serial Perripheral Interface)串行外围设备接口,是摩托罗拉公司推出的一种同步串行接口技术,它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信,是一种高速的,全双工,同步的通信技术。

应用

SPI 主要应用在 EEPROM,Flash,,实时时钟(RTC),数模转换器(ADC),数字信号处理器(DSP) 以及数字信号解码器之间。

特点

  1. 高速、同步、全双工、非差分、总线式
  2. 主从机通信模式

SPI通信原理

SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。

通信协议学习笔记(一)- SPI协议_第1张图片

  • CS/SS – 从设备使能信号,由主设备控制。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI 协议中没有设备地址,它使用CS信号线来寻址,当主机要选择从设备时,把该从设备的CS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI 通讯。所以SPI 通讯以CS线置低电平为开始信号,以CS线被拉高作为结束信号;
  • SCLK – 时钟信号线,用于通讯数据同步,由主设备产生,决定了通讯的速率;
  • SDO/MOSI – 主设备输出/从设备输入引脚,主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机;
  • SDI/MISO – 主设备输入/从设备输出引脚,主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机;

当有多个SPI 从设备与SPI主机相连时,设备的其它信号线SCK、SDI及SDO同时并联到相同的SPI 总线上,即无论有多少个从设备,都共同只使用这3 条总线;而每个从设备都有独立的这一条CS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。

SPI通讯模式

SPI 一共有四种通讯模式,它们的主要区别是总线空闲时SCK 的时钟状态以及数据采样时刻。

  • 时钟极性CPOL :是指SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即SPI 通讯开始前、 CS线为高电平时SCK 的状态)。CPOL=0 时, SCK 在空闲状态时为低电平,CPOL=1 时,SCK 在空闲状态时为高电平;
  • 时钟相位CPHA :是指数据的采样的时刻,当CPHA=0 时,SDI 或SDO数据线上的信号将会在SCK 时钟线的“奇数边沿”被采样。当CPHA=1 时,数据线在SCK 的“偶数边沿”采样;

注:SPI 的采样时刻不是由上升/下降沿决定的

SPI模式 CPOL CPHA 空闲时SCK 时钟 采样时刻
0 0 0 低电平 奇数边沿
1 0 1 低电平 偶数边沿
2 1 0 高电平 奇数边沿
3 1 1 高电平 偶数边沿

SPI通信时序

通信协议学习笔记(一)- SPI协议_第2张图片
上图为时钟相位CPHA=0 的时序图。首先,根据SCK 在空闲状态时的电平,分为两种情况。SCK 信号线在空闲状态为低电平时,CPOL=0;空闲状态为高电平时,CPOL=1。无论CPOL=0 还是=1,因为我们配置的时钟相位CPHA=0,在图中可以看到,采样时刻都是在SCK 的奇数边沿。注意当CPOL=0 的时候,时钟的奇数边沿是上升沿,而CPOL=1 的时候,时钟的奇数边沿是下降沿。SDO和SDI数据线的有效信号在SCK 的奇数边沿保持不变,数据信号将在SCK 奇数边沿时被采样,在非采样时刻,也就是偶数边沿,SDO和SDI的有效信号发生切换。类似地,当CPHA=1 时,不受CPOL 的影响,数据信号在SCK 的偶数边沿被采样,在奇数边沿进行信号切换。
通信协议学习笔记(一)- SPI协议_第3张图片

软件模拟SPI时序举例

使用软件SPI通信协议发送16bit数据,MSB先行,时钟极性CPOL = 1,时钟相位CPHA = 0,伪代码如下:

   :拉高时钟 SCK						//空闲状态为高电平
	拉高片选 CS
	拉低片选 CS
	循环开始:0 ≤ i < 16
		判断写入数据最高位是否为1
		如果是,拉高数据线SDO
		如果不是,拉低数据线SDO
		延时
		拉低时钟 SCK					//奇数边沿采样
		延时
		拉高时钟 SCK
		写入数据左移一位
	循环结束
	拉高片选 CS
	程序结束

参考文献:零死角玩转STM32—F429

你可能感兴趣的:(通信协议学习笔记(一)- SPI协议)