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); } } }
下一篇:C8051F单片机端口配置