1.1.SPI协议概括

SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200.
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

  • SDO – 主设备数据输出,从设备数据输入
  • SDI – 主设备数据输入,从设备数据输出
  • SCLK – 时钟信号,由主设备产生
  • CS – 从设备使能信号,由主设备控制

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

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

要注意的是,SCK信号线只由主设备控制,从设备不能控制信号线。
SPI接口的一个缺点:没有指定的流控制,没有应答机制确认是否接收到数据

SPI总线四种工作方式
SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。

  • 如果 CPOL=0,串行同步时钟的空闲状态为低电平;
  • 如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。
  • 如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;
  • 如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。

//首先定义好I/O口
2 sbit SDO=P1^0;
3 sbit SDI=P1^1;
4 sbit SCK=P1^ 2;
5 sbit SCS=P1^3;
6 sbit ACC7= ACC^7;
7 unsigned int SpiRead(unsigned char add)
8 {
9 unsigned char i;
10 unsigned int datal6;
11 add&=0x3f;/6位地址/
12 add |=0x80;/读操作码l0/
13 SDO=1;/发送1为起始位/
14 SCK=0;
15 SCK=1;
16 for(i=0;<8;i++)/*发送操作码和地址*/
17 {
18 if(add&0x80==1)
19 SDO=1;
20 else
21 SDO=0;
22 SCK=0;/从设备上升沿接收数据/
23 SCK=1;
24 add<<= 1;
25 }
26 SCK=1;/从设备时钟线下降沿后发送数据,空读1位数据/
27 SCK=0;
28 datal6<<= 1;/读16位数据/
29 for(i=0;<16;i++)
30 {
31 SCK= 1;
32 _nop
();
33 if(SDI==1)
34 datal6|=0x01;
35 SCK =0;
36 datal6< < =1;
37 }
38 return datal6;
39 }