SPI

什么是SPI

SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线。

特点

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

优点

  1. 支持全双工通信
  2. 通信简单
  3. 数据传输速率块

缺点

没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据 可靠性上有一定的缺陷。

原理&连接图

连接图

连接图

原理

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

  • SDO –> 主设备数据输出,从设备数据输入 对应MOSI master output slave input
  • SDI –> 主设备数据输入,从设备数据输出 对应MISO master input slave output
  • SCLK –> 时钟信号,由主设备产生
  • CS –> 从设备使能信号,由主设备控制

CS: 其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

SDI/SDO/SCLK: 通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过
SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

//首先定义好I/O口
sbit SDO=P1^0// 主机输入从机输出
sbit SDI=P1^1// 主机输出从机输入
sbit SCK=P1^ 2// 时钟
sbit SCS=P1^3// 片选
sbit ACC_7= ACC^7
unsigned int SpiRead(unsigned char add)
{
unsigned char i;
unsigned int datal6;
add&=0x3f/*6位地址*/
add |=0x80/*读操作码l0*/
SDO=1/*发送1为起始位*/
SCK=0
SCK=1
for(i=0;<8;i++)/*发送操作码和地址*/
{
if(add&0x80==1)
SDO=1
else
SDO=0
SCK=0/*从设备上升沿接收数据*/
SCK=1
add<<= 1
}
SCK=1/*从设备时钟线下降沿后发送数据,空读1位数据*/
SCK=0
datal6<<= 1;/*读16位数据*/
for(i=0;<16;i++)
{
SCK= 1
_nop_();
if(SDI==1)
datal6|=0x01
SCK =0
datal6< < =1
}
return datal6;
}