单片机
返回首页

SPI串行总线协议

2022-05-18 来源:eefocus

一、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驱动流水灯。


电路图如下所示:

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


#include


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

}


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<

                Delay(50);


          }


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


          {


              send(~(1<

                Delay(50);


          } 


   }


}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章