视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
(完整)spi总线协议详细说明
2025-10-02 19:20:47 责编:小OO
文档
SPI总线原理与应用篇 《电子制作》2008年9月 站长原创,如需引用请注明出处

 大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了使用IIC总线的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习SPI总线的基本原理与应用实例。

 先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。主体系统如图1所示,其配套书本教程《单片机快速入门》如图2所示。

图1 51单片机综合学习系统主机部分图片

图2 51单片机综合学习系统配套书本教程——《单片机快速入门》

 上图是我们将要使用的51单片机综合学习系统硬件平台,如图1所示,本期实验我们用到了综合系统主机、板载的AT93C46芯片,综合系统其它功能模块原理与使用详见前几期《电子制作》杂志及后期连载教程介绍。

SPI总线简介

SPI总线基本概念

    SPI ( Serial Peripheral Interface ———串行外设接口) 总线是Motorola公司推出的一种同步串行接口技术。SPI总线系统是一种同步串行外设接口,允许MCU 与各种外围设备以串行方式进行通信、数据交换。外围设备包括FLASHRAM、A/ D 转换器、网络控制器、MCU 等。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。其工作模式有两种:主模式和从模式。SPI是一种允许一个主设备启动一个从设备的同步通讯的协议,从而完成数据的交换。也就是SPI是一种规定好的通讯方式。这种通信方式的优点是占用端口较少,一般4根就够基本通讯了(不算电源线)。同时传输速度也很高。一般来说要求主设备要有SPI控制器(也可用模拟方式),就可以与基于SPI的芯片通讯了。

SPI总线系统结构

 系统可直接与各个厂家生产的多种标准外围器件直接接口,一般使用4 条线:串行时钟线(SCK) 、主机输入/ 从机输出数据线MISO(DO)、主机输出/ 从机输入数据线MOSI(DI) 和低电平有效的从机选择线CS。MISO和MOSI用于串行接收和发送数据,先为MSB(高位),后为LSB(低位)。在SPI设置为主机方式时,MISO是主机数据输入给,MOSI是主机数据输出线。SCK用于提供时钟脉冲将数据一位位地传送。SPI总线器件间传送数据框图如图3所示:

图3 SPI总线器件间传送数据框图

SPI总线的接口特性

 利用SPI总线可在软件的控制下构成各种系统。如1个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。在大多数应用场合,可使用1个MCU作为主控机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。其数据的传输格式是高位(MSB)在前,低位(LSB)在后。

 当一个主控机通过SPI与几种不同的串行I/O芯片相连时,必须使用每片的允许控制端,这可通过MCU的I/O端口输出线来实现。但应特别注意这些串行I/O芯片的输入输出特性:首先是输入芯片的串行数据输出是否有三态控制端。平时未选中芯片时,输出端应处于高阻态。若没有三态控制端,则应外加三态门。否则MCU的MISO端只能连接1个输入芯片。其次是输出芯片的串行数据输入是否有允许控制端。因为只有在此芯片允许时,SCK脉冲才把串行数据移入该芯片;在禁止时,SCK对芯片无影响。若没有允许控制端,则应在外围用门电路对SCK进行控制,然后再加到芯片的时钟输入端;当然,也可以只在SPI总线上连接1个芯片,而不再连接其它输入或输出芯片。

SPI总线的数据传输

 是一个环形总线结构,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。SPI数据传输原理很简单,它需要至少4根线,事实上3根也可以。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。在SPI方式下数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上沿或下沿时改变,在紧接着的下沿或上沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。假设8位寄存器内装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候 数据将会是高位数据SDO=1。下降沿到来的时候,SDI上的电平将被存到寄存器中去,那么这时寄存器=0101010SDI,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个SPI时序。下面举一个实例来说明其数据传送过程。

 假设主机和从机初始化就绪,并且主机的sbuff=0xaa,从机的sbuff=0x55,下面将分步对SPI的8个时钟周期的数据情况演示一遍:(下表中“上”表示上升沿,“下”表示下降沿)

脉冲序号主机缓存从机缓存SDISDO
0101010100101010100
1上

0101010x1010101x01
1下

010101001010101101
2上

1010100x0101011x10
2下

101010010101011010
3上

0101001x1010110x01
3下

010100101010110101
4上

1010010x0101101x10
4下

101001010101101010
5上

0100101x1011010x01
5下

010010101011010101
6上

1001010x0110101x10
6下

100101010110101010
7上

0010101x1101010x01
7下

001010101101010101
8上

0101010x1010101x10
8下

010101011010101010
表1:脉冲与数据变化对应表

 这样就完成了两个寄存器8位的交换, SDI、SDO是相对于主机而言的。其中CS引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议,因为SPI的数据输入和输出线,所以允许同时完成数据的输入和输出

 对于不带SPI串行总线接口的MCS51系列单片机来说,可以使用软件来模拟 SPI的操作,包括串行时钟、数据输入和数据输出。如我们可以定义三个普通I/O口用来模拟SPI器件的SCK、MISO、MOSI。对于不同的串行接口外围芯片,它们的时钟时序是不同的。对于在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件,一般应将其串行时钟输出口的初始状态设置为1,而在允许接口后再置为0。这样,MCU在输出1位SCK时钟的同时,将使接口芯片串行左移,从而输出1位数据至单片机的模拟MISO线,此后再置SCK为1,使单片机从模拟的MOSI线输出1位数据(先为高位)至串行接口芯片。至此,模拟1位数据输入输出便宣告完成。此后再置SCK为0,模拟下1位数据的输入输出……,依此循环8次,即可完成1次通过SPI总线传输8位数据的操作。对于在SCK的下降沿输入数据和上升沿输出数据的器件,则应取串行时钟输出的初始状态为0,即在接口芯片允许时,先置SCK为1,以便外围接口芯片输出1位数据(MCU接收1位数据),之后再置时钟为0,使外围接口芯片接收1位数据(MCU发送1位数据),从而完成1位数据的传送。 

93C46存储器的软硬件设计实例

 下面就以目前单片机系统中广泛应用的SPI接口的数据存储器93C46为例,介绍SPI器件的基本应用。

93C46串行存储器简介

 是1k位串行EEPROM储存器。 每一个储存器都可以通过DI/DO引脚写入或读出。它的存储容量为1024位,内部为128×8位或×16位。93C46为串行三线SPI操作芯片,在时钟时序的同步下接收数据口的指令。指令码为9位十进制码,具有7个指令,读、擦写使能、擦除、写、全擦、全写及擦除禁止。该芯片擦写时间快,有擦写使能保护,可靠性高,擦写次数可达100万次, 93C46的引脚功能图如图4所示。

图4 93C46的引脚图

CS:芯片选择

SCK:时钟

DI:串行数据输入

DO:串行数据输出

VSS:接地

NC:空脚(应用时不用接任何电路)

VCC:电源

指令起始位操作数地址数据
╳16

128╳8

╳16

128╳8

读(READ)

110A5~A0A6~A0
清除((ERASE)

111A5~A0A6~A0
写(WRITE)

101A5~A0A6~A0D15~D0D7~D0
写使能(EWEN)

10011XXXX11XXXXX
写禁止(EWDS)

10000XXXX00XXXXX
芯片清除(ERAL)

10010XXXX10XXXXX
芯片写入(WRAL)

10001XXXX01XXXXXD15~D0D7~D0
表2:93C46串行EEPROM指令格式选择表

指令说明:

∙读(READ):当下达10XXXXXX指令后,地址(XXXXXXXX)的数据在SCK=1时由DO输出。

∙写(WRITE):在写入数据前,必须先下达写使能(EWEN)指令,然后再下达01XXXXXX指令后,当SCK=1时,会把数据码写入指定地址(XXXXXXXX);而DO=0时,表示还在进行写操作,写入结束后DO会转为高电平。写入动作完成后,必须再下达写禁止(EWDS)命令。

∙清除(ERASE):下达清除指令11XXXXXX后会将地址(XXXXXXXX)的数据清除。

∙写使能(EWEN):下达0011XXXX指令后,才可以进行写(WRITE)操作。

∙写禁止(EWDS):下达0000XXXX指令后,才可重复进行写入(WRITE)操作。

∙芯片清除(ERAL):下达0010XXXX指令后,全部禁止。

∙芯片写入(WRAL):下达0001XXXX指令后,全部写入“0”。

程序功能

 本例用来实现对93C46存储器的读写操作,并验证数据是否正确。此程序可以用配套实验板为硬件平台,在调试时要把功能开关调到93C46处。本程序先分别向0x02和0x03两个地址写入0x55和0xAA,然后读其中一个地址,并将读到的数据显示出来验证是否正确。程序默认是读0x02地址内的数据,读者也可以修改地址数据来读其它地址数据。在实验前要先把功能开关切换到93C46的位置上,如图5,图6所示。

图5 93C46实验演示图

图6 93C46实验演示图

硬件原理图

图7 硬件原理图

程序流程图

图8 软件流程图下载本文

显示全文
专题