SPI协议详解(适合小白入门)

以下内容将阐述以下几个问题:
1.SPI协议是什么?
2.SPI协议具体通信过程?
3.SPI与IIC相比优缺点是什么?

========================================================================================

1.SPI协议是什么?

SPI,英文全拼为Serial Peripheral Interface,即串行外设接口,是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI最早是由摩托罗拉公司设计并实现,它是一种高速的、全双工的通信总线。何为总线,通俗的说,就是多个功能部件都可以在这条线上传输数据,是多个设备之间的公共通道。SPI总线可直接与各个厂家生产的多种标准外围器件相连,包括FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。除电源线外,该接口通信一般使用4条线:
SCLK:串行时钟线、
MISO:主机输入/从机输出数据线
MOSI:主机输出/从机输入数据线
NSS:低电平有效的从机选择线(有的也叫CS片选线,低电平表示对应的设备被选中,且一定要进行配置,不可悬空)。

2.SPI协议具体通信过程?此处画重点

从上文知道,对于SPI协议而言,是明确区分主机(Master)和从机(Slave)的,所以在进行通信之前,要先确定哪个是主机,哪个是从机。如何确定主从机,完全由接线决定。这里以STM32F103作为作为主机,OLED显示屏作为从机进行通信。这块显示屏是支持spi通信的,现在就用SPI通信将这块显示屏点亮。

在开始通信之前,要先进行接线,我使用的是软件方式模拟SPI协议通信,且OLED全程做为从机接收数据,所以其实只用三根线就行了,除去电源之外,OLED的MOSI,CS和SCLK 引脚,全部接到stm32的普通io口就行了。要注意的一点是,SCLK时钟信号线完全由主机进行控制,从机不控制该信号。

接下来就要开始通信了,如何开始呢,首先确定SPI的工作模式,通过查阅手册知道,SPI协议一般有四种工作模式 ,分别是是模式0,模式1,模式2,模式3。为什么是4个模式呢,因为在SPI协议中,有两个电平值来确定SPI的模式,分别是CPOL(clock plority,时钟极性)和CPHA(clock phase,时钟相位)

CPOL:表示SPI CLK的初始电平,0为电平,1为高电平
CPHA:表示初始相位,即第一个还是第二个时钟沿采样数据,0为第一个时钟沿,1为第二个时钟沿.
SPI工作模式
以下是四种工作模式的时序图:
在这里插入图片描述
常用的工作模式0和3,每当外设模块或者主机检测到时钟上升沿过来就采集数据。
知道这点之后,就可以写代码了。由于我们使用的是软件的方法模拟SPI通信,所以选择什么模式完全由你写的方式决定。

①首先,初始化IO口,全部设置为推挽输出就可以了。
②然后就可以开始写写通信函数了,因为SPI通信过程比较简单,这里只贴出写数据函数

void OLED_WR_Byte(u8 data)
{
	OLED_CS_clear();    //拉低片选线
	for(i = 0;i < 8;i++)
    {
		OLED_SCL_clear();  //拉低SCLK,准备写数据
        if(data & 0x80)
        	OLED_SDA_set();           //准备数据位
        else
			OLED_SDA_clear();
		
		OLED_SCL_set();            //拉高SCLK,开始传输数据
		data <<=1;	        
    }

   OLED_CS_set();         //传输完毕,拉高片选线
}

非常简单的几行代码就把 数据写入到了OLED之中,总结一下通信过程就是:

①SPI 主机首先先将 CS 线拉低,以此来告知 SPI 从机通信开始。
②主机通过发送 SCLK 时钟信号,来告知从机即将进行的读写操作。这里的 SCLK 时钟信号是由 SPI 的模式来决定是高电平还是低电平有效的。
③主机(Master) 将要发送的数据一位一位的写到SDA,也就是这里的MOSI上,然后在SCLK拉到对应电平开启传输。
④传输完毕后,拉高CS表示结束传输。

3.SPI与IIC相比优缺点是什么?

SPI与IIC各有优劣,总体可以从以下几个方面考虑:

SPIIIC
传输速率SPI总线的传输速率快,适合高速数据传输场景(比如数据采样)。SPI协议并没有对SPI的速率进行规定,SPI的传输速率完全由主机的时钟频率决定,即SCLK能跳变的多快,就能传多快。因此有着极高的上限,目前SPI最高可以达到几十Mbit的传输速度。而IIC的速率虽然也有时钟频率决定,但由于有了应答机制,导致速率会受限,因此IIC协议中规定了常用的IIC通信速率,范围100kbit/s~3.4Mbit/s
IO口数量当SPI总线上需要挂载多个设备时,片选线的数量决定了SPI设备的数量,主机通过片选线来寻找对应设备,一条片选线要占用一个IO口IIC只需要两条线就可以挂载多个设备,每个设备都有唯一的设备地址,主机通过发送设备地址码来寻址,硬件资源比较省
双工形式SPI因为有两条数据通道,所以是全双工的,主机在发送数据的同时也可以接收从机设备发来的数据,这也是SPI比IIC灵活的地方IIC也支持收发,但因为只有一条数据通道,收发不能同时,所以是半双工的
通信时序SPI为同步串行通信模式,即收发端都必须按照同一个标准时序(SCLK)一位一位地按顺序进行数据传输IIC也为同步串行通信模式

笔者看网上有很多文档说 “ SPI因为没有纠错机制,所以可靠性不如IIC”,笔者认为,这种观点是片面的。通信数据的可靠性主要取决于通信双方约定的协议格式,若数据发生丢失或异常,完全可以被校验出来,只能说IIC由于引入了应答机制,通过降低传输速率来降低通信发生异常的概率罢了。而且SPI和IIC都是短距离通信协议,多用于板级间通信,所以不存在什么IIC比SPI传输距离远这种讲法。根据笔者开发的经验来看,使用SPI通信的次数要远远多过于IIC,因为SPI操作简单,速率快,而且传输的数据是连续的,某些情况下会比较便利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值