做个学习记录,spi协议挺简单的,理解四种模式以及把时序图看懂就行
SPI跟uart其实很像,SPI协议相比于串口,增加了时钟线用于同步,减少了同步的资源以及时间消耗,以至于SPI的传输速度相比串口大大加快,串口一般是115200bps,SPI可以高达10mbps
管脚含义
MASTER为主机,slave为从机,只能一个主机,但可以多个从机
SCK为时钟线,由主机发出时钟,从机使用主机发来的时钟进行同步
MOSI为主机发出(master output slave input)
MISO为主角接收(slave output master input)
CS为片选引脚,决定从机能否工作
SPI是全双工的,记住这点,只要主机的发出端不停发出,接收端不停接收就行,这就简单了,只需要管好模式时序以及数据就可以,不用像I2C那样,一根线又要接又要收,烦死。
协议解析
1.片选引脚决定能不能和从机通讯,这里假设低电平能和从机通讯,那么当不工作时自然CS片选自然就是高电平
2.四种模式
SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式
时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA
是用来配置数据采样是在第几个边沿:
一个时钟周期为一个低电平加一个高电平,不停高低高低的走
CPOL=0,片选禁止时的空闲状态,SCLK=0为低电平,所以接下来有效状态的瞬间SCLK处于高电平
CPOL=1,片选禁止时的空闲状态,SCLK=1为高电平,所以接下来有效状态的瞬间SCLK处于低电平
CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿
其实很好记住,0就是小,1就是大
CPOL=0,自然空闲时是低电平,低电平是小,反过来,CPOL=1,自然空闲时是高电平
CPHA=0,第1个边沿采集(1比2小嘛),反过来就是CPHA=1,第2个边沿采集
3.大小端
举例来说,数值0x2211
使用两个字节储存:高位字节是0x22
,低位字节是0x11
。
- 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
- 小端字节序:低位字节在前,高位字节在后,即以
0x1122
形式储存。
0x1234567
的大端字节序和小端字节序的写法如下图
MSB为大端,LSB为小端
4.接收和发送
主机发送端一直不停发送就可以,有数据的话就发数据,没数据就发0XFF,从机收到命令就会发相应的数据给主机,从机在发送时会自动屏蔽掉主机无用的数据。
收发是以8bit一个整体发出去,8bit发完还有就继续8bit发
收发送完就把片选信号置位,让通讯停止
5.一主多从
6.优缺点
优点:
支持全双工操作;操作简单;数据传输速率较高。
缺点:
需要占用主机较多的口线(每个从机都需要一根片选线);
只支持单个主机;
没有指定的流控制,没有应答机制确认是否接收到数据
传输距离短