Advertisement

SPI串行总线协议

阅读量:

SPI串行总线协议

一、SPI接口简介

SPI总线系统作为同步的一种串行外设接口,在电子设备中被广泛采用。它能够使微控制器(MCU)与各类外围设备通过串行方式进行高效的信息交流。这种总线系统通常由四根引脚组成:SCLK引脚用于发送接收时钟信号;MISO引脚包括主机输入端子MI和从机输出端子SO;MOSI引脚包括主机输出端子MO和从机输入端子SI;SS引脚用于选择操作。主要包含四根引脚:S_CLK、M_ISO、M_OS以及SS等关键功能模块。

SPI采用环形总线架构,在SS(CS)、SCK、SDI和SDO的配置下完成基本功能。其时序流程较为简单,在受控于SCK的情况下,通过两个双向移位寄存器完成信息传输过程。

主要概括为:

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

当上升沿到达时,在单总线接口(SDO)电平会通过由设备的数据寄存器传输至系统控制器;而当下降沿到达时,在双总线接口(SDI)电平则会被接收至主设备的数据寄存器。

处于主从机就绪状态的主机和从机配置如下:主机sbuff设置为0xaa(二进制为1010101010),从机sbuff设置为0x55(二进制为0101 56),数据将遵循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;当第一个上升沿到来时,在主机端执行(从机端响应)操作:将主机sbuff中的最高有效位"1"传输至SDO端口;随后于第一个下降沿到来时,在从机端执行(主机端接收)操作:将SDO中捕获到的"1"值移入到从机sbuff的最低有效位位置上。此时从机sbuff变为十进制数值为93(二进制表示为 );第二个上升沿到来时,在主机端再次执行(从机端响应)操作:将主机sbuff中的最高有效位"0"传输至SDO端口;紧接着第二个下降沿到来时,在从机端执行(主机端接收)操作:将SDO中捕获到的" "值移入到从机sbuff的最低有效位位置上。经过八个完整的时钟周期后完成数据接收

二、8051与74HC595应用

在验证 SPI 总线的过程中,在确保系统正常运行的前提下,并联使用 8051 和 74HC595(一种支持8位串行输入/输出或并行输出移位功能的芯片)来实现流水灯效果。

电路图如下所示:

74HC595引脚功能:

74595的数据端:

Q0—Q7: 八位并行输出端

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

DS: 串行数据输入端。

74595的控制端说明:

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

SCK(第十一脚)在上升沿触发时完成数据寄存器的移位操作。通过依次连接的触发点(如Q0→Q1→…→Q7),在下降沿作用下,移位寄存器中的数据保持不变。(对于脉冲宽度的要求,在5伏电压下只需超过数十个纳osecond即可满足需求;而我在实际应用中偏好选择微osecond级别的脉冲宽度)

在74HC12脚型设计中使用D flip-flop实现移位功能时,默认配置下实现的是单比特存储功能。具体来说,在上升沿触发时刻完成一次移位操作后,在相应的触发信号(如RCK)作用下生成一个正向脉冲信号(当输入电压达到5V时,则此脉冲持续时间需超过几十纳秒)。在实际应用中我发现微秒级的配置效果最佳。

OE(13脚): 在高电平期间禁止输出(进入高阻态)。当单片机的引脚较为宽松时,在其中一个引脚上施加控制信号即可实现闪烁与熄灭的效果。相比于通过数据端口移位的方式来控制状态而言,在此方案中无需额外的数据传输操作即可节省时间与能源资源。

三、程序设计

8051 系列单片机通常没有配备 SPI 接口功能;然而,在后续版本中有些型号确实配备了 SPI 接口;因此,在本例中我们采用 8051 模拟器来实现与 MCU 595 的通信;单片机每隔 50ms 发送一个数据块;通过这种方式可以形成流水灯效果;

#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);

}

}

}

全部评论 (0)

还没有任何评论哟~