天天看点

SPI串行总线协议

SPI串行总线协议

一、SPI接口简介

SPI(Serial Peripheral interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出线(MISO)、主机输出/从机输入线(MOSI)和从机选择线SS。

SPI是一个环形总线结构,由SS(CS)、SCK、SDI、SDO构成,其时序比较简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。

主要概括为:

上升沿发送、下降沿接受,高位在前、低位在后;

上升沿到来时,SDO电平将被送到从设备的寄存器中;下降沿到来时,SDI电平将被接收到主设备的寄存器中。

下面是主从机准备就绪,主机sbuff=0xaa(1010101010),从机sbuff=0x55(01010101),数据根据SPI协议传输过程:

---------------------------------------------------

脉冲           主机sbuff    从机sbuff     sdi    sdo

---------------------------------------------------

0    00-0     10101010     01010101      0      0

---------------------------------------------------

1    0--1     0101010x     10101011      0      1

1    1--0     01010100     10101011      0      1

---------------------------------------------------

2    0--1     1010100x     01010110      1      0

2    1--0     10101001     01010110      1      0

---------------------------------------------------

3    0--1     0101001x     10101101      0      1

3    1--0     01010010     10101101      0      1

---------------------------------------------------

4    0--1     1010010x     01011010      1      0

4    1--0     10100101     01011010      1      0

---------------------------------------------------

5    0--1     0100101x     10110101      0      1

5    1--0     01001010     10110101      0      1

---------------------------------------------------

6    0--1     1001010x     01101010      1      0

6    1--0     10010101     01101010      1      0

---------------------------------------------------

7    0--1     0010101x     11010101      0      1

7    1--0     00101010     11010101      0      1

---------------------------------------------------

8    0--1     0101010x     10101010      1      0

8    1--0     01010101     10101010      1      0

---------------------------------------------------

其中:0-1表示上升沿、1-0表示下降沿;SDI、SDO是相对于主机来说的。

主机发送、从机接收过程:0脉冲时,主机sbuff=10101010,从机sbuff=01010101,SDI=0,SDO=0,在第一个上升沿到来时,主机发送(从机接收),将最高位“1”传到SDO;接着是第一个下降沿,此时,主机接收(从机发送),从机将SDO的“1”移入从机sbuff的最低位,从机sbuff为10101011,主机sbuff为01010100,接着是第二个上升沿到来时,主机发送(从机接收),将最高位“0”传到SDO;接着是第二个下降沿,此时,主机接收(从机发送),从机将SDO的“0”移入从机sbuff的最低位,从机sbuff为01010110,主机sbuff为10101001;经过8个时钟周期后就可将数据接收完毕。

二、8051与74HC595应用

为了验证SPI总线,将8051与串行外设74HC595(8位串行输入/输出或者并行输出移位寄存器)相连进行并用595驱动流水灯。

电路图如下所示:

SPI串行总线协议

74HC595引脚功能:

74595的数据端:

Q0—Q7: 八位并行输出端

Q7’: 级联输出端。我将它接下一个595的SI端。

DS: 串行数据输入端。

74595的控制端说明:

SCLR(10脚): 低点平时将移位寄存器的数据清零。通常将它接Vcc。

SCK(11脚):上升沿时数据寄存器的数据移位。Q0-->Q1-->Q2-->...-->Q7;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。我通常都选微秒级)

RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。

OE(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。

三、程序设计

8051系列单片机一般是没用SPI接口的,后面的89系列有些是带有SPI接口的,所以,这里我们用8051来模拟SPI接口跟595进行通信,单片机每隔50MS向595输出一个数据,形成流水灯现象:

#include<reg52.h>

#include<intrins.h>

sbit  sclk=P2^0;    //串行移位时钟

sbit  sda=P2^1;            //MOSI

sbit  clk=P2^2;            //595的数据更新脉冲,上升沿有效

void Delay(int n)                  //延时1ms子程序

{

   int x,y;

   for(x=0;x<110;x++)

      for(y=0;y<n;y++);

}

void send(char byte)

{

   char i;

   sclk=0;

   clk=0;

   for(i=0;i<8;i++)

   {

      sclk=0;

         if(byte&0x80)sda=1;

         else  sda=0;

         byte<<=1;

         _nop_();            //延时,用来控制SPI时钟频率

         _nop_();

         sclk=1;

         _nop_();

         _nop_();

         _nop_();

   }

   clk=1;

}

void main ()

{   

   char i=0;

   while(1)

   {

          for(i=0;i<8;i++)          //去

          {

              send(~(1<<i));

                Delay(50);

          }

          for(i=6;i>0;i--)     //回

          {

              send(~(1<<i));

                Delay(50);

          } 

   }

}