第4章+SPI数据传输.docx
《第4章+SPI数据传输.docx》由会员分享,可在线阅读,更多相关《第4章+SPI数据传输.docx(28页珍藏版)》请在冰豆网上搜索。
第4章+SPI数据传输
第4章SPI数据传输
本章主要内容包括:
ÐSPI的原理
ÐSPI模块的组成部分
ÐSPI模块的使用方法
Ð片上SPI的功能
ÐSPI传输的实现
本章全面介绍SPI总线技术的原理和使用方法。
读者在学习本章之后能够全面了解SPI的原理和模块的组成部分。
本章最后是SPI传输程序代码,读者只需要稍微修改就可以应用的其他程序。
4.1SPI模块概述
串行外围设备接口SPI(SerialParallelInterface)总线技术是Motorola公司推出的一种同步串行接口。
SPI总线是一种三线同步总线,由于其硬件能力很强,与SPI有关的软件相当简单,使CPU有更多的时间来处理其他事务,因此得到了广泛应用。
SPI传输是三总线结构,而且能够工作在主从模式下,图4.1是SPI总线模块结构图,从图中看出,SPI总线模块包含有如下几部分:
输入和输出部分,SPI模块控制部分及波特率产生和控制部分。
下面将分别介绍各个部分及其功能。
4.1.1SPI模块输入和输出
SPI模块的输入和输出是SPI模块与其它SPI模块或元件的接口,时钟信号决定着传输的速度。
在进行SPI传输时,数据先保存在SPI内部的数据寄存器,在SPI时钟的作用下,数据通过移位寄存器依次出现在输出线上,或从输入线上接收数据。
因此,输入输出部分包含了输入输出引脚和对应的数据寄存器。
图4.1SPI模块
1.SPI输入输出引脚
SPI模块可以工作在主模式或从模式下,如图4.2所示,主模式和从模式的输入引脚和输出引脚上不同的,而且主从模式的选择是通过
选择的。
∙MOSI(主机输出从机输入引脚):
在主模式下,该引脚输出数据到从机;在从模式下,从机通过该引脚接收主机发送到数据。
∙MISO(主机输入从机输出引脚):
该引脚与MOSI引脚功能相反。
在主模式下,主机通过该引脚接收从机发送到数据;在从模式下,该引脚输出数据到主机。
∙SCK(串行时钟):
该引脚为串行数据传输提供时钟信号,主模式下,该引脚向从机提供设置信号,从模式下,该引脚接收主机输出的时钟信号。
∙
(从机选择引脚):
在主模式下,该引脚置高电平;在从模式下,若该引脚置低电平,则说明主机选择了该从机。
图4.2SPI全双工主从模式连接图
图4.2为SPI通信连接示意图,该图中,由于只有一个从机,故从机
引脚接地,主机
引脚未用,接高电平。
2.SPI移位寄存器和SPI数据寄存器(SPIDR)
SPI移位寄存器实现并行数据和串行数据的相互转换,它是一个8位的寄存器,从图4.2中可以看出,主机和从机的SPIDR通过MISO和MOSI串联在一块,形成了一个16位的移位寄存器,传输数据时,发生方移位寄存器中的8位数据串行移入接收方的移位寄存器中。
SPIDR是在SPI传输中暂存输入或输出数据的寄存器,它的作用类似于单片机串口中的SBUF缓存器。
SPIDR的状态可以通过读取SPI状态寄存器的SPIF位和SPTEF位获得。
接收数据时,当数据从移位寄存器移入SPIDR时SPIF置位;发送数据时,当SPIDR空时,SPTEF置位。
可以在任意时刻读取该寄存器,通常情况下,当SPIF置位时进行读取数据。
注意:
当SPIF标志置位但数据未被读取,且后续字节已接收到移位寄存器时,该字节将一直保存到移位寄存器中,该字节不影响SPIDR中的字节。
但是,在该字节变为无效之前,SPIF中断必须被相应,即必须读取SPIDR中的数据,否则,该字节将被忽略。
4.1.2SPI控制模块
SPI控制模块是SPI传输系统的控制核心,它控制着SPI传输过程,SPI中断,SPI时钟选择以及SPI的传输波特率。
该模块包含三个控制寄存器和一个状态寄存器。
1.SPI控制寄存器1(SPICR1)
SPICR1是SPI模块中第一个控制寄存器,它控制着SPI传输过程的禁止和有效,SPI模块是否产生中断,同时控制着SCK时钟信号的相位和时钟选择,控制着移位过程中是先移LSB还是先移MSB。
复位后该寄存器的值为00000100,图4.3是该寄存器各位的描述。
D7
D6
D5
D4
D3
D2
D1
D0
SPIE
SPE
SPTIE
MSTR
CPOL
CPHA
SSOE
LSBEF
图4.3SPI控制寄存器1(SPICR1)
∙SPIE:
SPI中断允许控制位。
SPIE=1:
允许SPI中断;SPIE=0:
禁止SPI中断。
∙SPE:
SPI使能控制位。
SPE=1表:
许SPI传输,SPI传输的任何操作都必须使该位置位;SPE=0:
禁止SPI(SPI进入低功耗状态)。
∙SPTIE:
SPI传输中断允许控制位。
该位允许在SPTEF置位时产生中断。
SPTIE=1:
允许SPITEF中断;SPTIE=0表:
禁止SPITEF中断。
∙MSTR:
SPI主模式/从模式选择位。
MSTR=1:
SPI工作在主模式;MSTR=0:
SPI工作在从模式。
∙CPOL:
SPI时钟极性控制位。
该位选择SPI时钟的极性。
在SPI传输时,传输双方必须设置同样的CPOL值。
主机在传输中,该位若发生变化则会中止正在进行的传输。
CPOL=1:
低电平时钟有效,空闲时SCK信号为高电平;CPOL=0:
高电平时钟有效,空闲时SCK信号为低电平。
∙CPHA:
SPI采样时钟相位选择。
CPHA=1:
在SCK时钟的偶数沿(2,4,6,…)采样数据;CPHA=0:
在SCK时钟的奇数沿(1,3,5,…)采样数据。
∙SSOE:
输出选择位。
该位只能在主模式下有效,在MODFEN置1的情况下,SSOE的设置如表4.1所示。
表4.1
输入/输出选择表
MODFEN
SSOE
主模式
从模式
0
0
无效
输入
0
1
无效
输入
1
0
作为模式错误标志输入
输入
1
1
作为从机的选择信号
输入
∙LSBFE:
优先传输LSB控制位。
LSBFE=1:
数据传输时,先传输LBS;LSBFE=0:
数据传输时,先传输MBS。
2.SPI控制寄存器2(SPICR2)
SPI控制寄存器2控制SPI的模式错误检测,全双工传输和空闲模式下的SPI时钟信号的停止与否。
图4.4是该寄存器的各位的描述,复位后,该寄存器值为00000000。
∙
D7
D6
D5
D4
D3
D2
D1
D0
-
-
-
MODFEN
BIDIROE
-
SPISWAI
SPC0
图4.4SPI控制寄存器2(SPICR2)
MODFEN:
模式错误检测(MODF)允许位。
MODFEN=1:
引脚作为MODF特征输入;MODFEN=0:
无效。
详细功能见表4.1。
∙BIDIROE:
双向传输模式下输出缓冲区允许位。
在双向传输时,该位控制着MOSI和MISO的输出缓冲区。
在主模式下,该位控制MOSI的输出缓冲区,在从模式下,该位控制MISO的输出缓冲区。
BIDIROE=1:
使能输出缓冲区;BIDIROE=0:
禁止输出缓冲区。
∙SPISWAI:
空闲模式下SPI停止控制位。
SPISWAI=1:
空闲状态下停止SPI时钟发生器;SPISWAI=0:
空闲状态下不停止SPI时钟发生器。
∙SPC0:
双向串行传输控制位。
详细描述如表4.2。
表4.2单线双向传输和正常传输下各控制位及各引脚的功能表
传输模式
SPC0
BIDIROE
MISO脚状态
MOSI引脚状态
主机的操作
正常传输
0
×
主机输入
主机输出
单线传输
1
0
无效
主机输入
1
主机输入/输出
从机的操作
正常传输
0
×
从机输出
从机输入
单线传输
1
0
从机输入
无效
1
从机输入/输出
说明:
单线传输是指主机和从机通过一条线,主机用MOSI,从机用MISO实现单工或双工通信,这种通信是由SPC0和BIDIROE共同控制的。
3.SPI波特率控制寄存器(SPIBR)
D7
D6
D5
D4
D3
D2
D1
D0
-
SPPR2
SPPR1
SPPR0
-
SPR2
SPR1
SPR0
图4.5SPI波特率控制寄存器(SPIBR2)
SPIBR用于控制SPI传输的传输波特率,实际上,SPI的时钟信号频率取自处理器的晶振频率,SPIBR产生分频系数,从而控制了SPI时钟的频率大小。
图4.5为该寄存器各位的描述,SPPR2~SPPR0为波特率预设系数;SPR2~SPR0为波特率选择系数。
复位后,该寄存器值为00000000。
波特率分频系数按如下公式计算:
(4.1)
SPI系统波特率按如下公式计算:
(4.2)
注意:
主模式下,CPOL、CPHA、SSOE、LSBFE、MODFEN、SPC0以及SPPR2~SPPR0、SOR2~SPR0任意位发生变化,都会中止现行的SPI传输,从而进入空闲状态。
4.SPI状态寄存器(SPISR)
D7
D6
D5
D4
D3
D2
D1
D0
SPIF
-
SPTEF
MODF
-
-
-
-
图4.6SPI控制寄存器2(SPISR)
SPISR描述了SPI操作过程中各种状态,包括数据寄存器的空后不空的状态和模式错误诊断状态。
图4.4为该寄存器各位的描述。
复位后,该寄存器值为00100000。
∙SPIF:
SPIF中断标志。
在SPIE置1的情况下,SPI数据寄存器收到传输数据时,SPIF标志置1,SPI发生中断。
该位由硬件清零。
SPIF=1:
SPI数据寄存器收到新数据,该字节的传输完成;SPIF=0:
SPI传输过程未完成。
∙SPTEF:
SPI发送数据寄存器空中断标志。
SPTEF=1表明传输数据寄存器空,可以向数据寄存器写入数据;SPTEF=0表明数据寄存器中有要发送到数据,此时不能向寄存器中写入数据,否则写入的数据将被忽略。
∙MODF:
SPI模式错误标志。
4.2SPI传输模式
SPI传输过程是单片机和外围器件之间的一种双向的、同步的串行传输。
当控制寄存器SPICR1中的位SPE置1时,SPI模块的下列功能引脚有效:
∙从机选择引脚(
)
∙串行时钟(SCK)
∙主机输出/从机输入引脚(MOSI)
∙主机输入/从机输出引脚(MISO)
SPI数据寄存器是SPI系统中的重要部件,主机中的数据寄存器通过MOSI和从机中的数据寄存器通过MISO联接到一起形成一个16位的寄存器,如图4.2所示。
SPI传输过程就是数据在16位寄存器中移动8位,从而完成主机和从机之间的数据交换,当主机输入时,从机则输出数据,反之亦然。
SPI模块可以选择工作主模式或从模式,当SPICR1中MSTR置1时,模块工作在主模式,MSTR清0时,模块工作在从模式。
4.2.1SPI主模式
当MSTR置1时,模块工作在主模式。
在一个SPI传输系统中只有一个主模式模块,称为主机。
SPI传输过程是在主机的控制下进行的。
图4.7是一个多从机的SPI传输系统,主机通过
来选择从机。
下面分别介绍主模式下各功能引脚的作用和控制。
∙SPI时钟(SCK):
SPI传输系统的传输时钟是有主机提供的,SCK的频率决定了传输系统的波特率。
数据传输速率是由波特率控制寄存器SPIBR控制的,通过预设SPIBR中的SPPR2~SPPR0和SPR2~SPR0来设置系统传输的波特率,具体见4.1节。
∙MOSI与MISO:
在主模式中,MOSI引脚作为数据输出引脚,MISO引脚作为数据输入引脚。
图4.7SPI多从机连接图
∙
:
主模式中,当MODFEN和SSOE位置1时,该引脚作为选择从机的输出引脚,当该
变低时,与该引脚相连的从机被选中,进行SPI数据传输;当
变高时,从机进入空闲状态。
从图4.7中可以看出,主机是一个单片机或微处理器,它控制着这个SPI系统的传输。
主机可以包含SPI模块,这样传输完全由SPI模块自动完成,单片机只需要向数据寄存器中写入数据或从数据寄存器中读取数据即可;若主机不包含SPI模块,那么需要利用单片机的I/O端口模拟SPI系统来实现数据传输。
从机是SPI设备或包含SPI模块的单片机。
在传输过程中,SCK时钟沿的选择或采样时刻的选择将在4.3节中介绍。
在SPI中,传输总是有主机启动的。
如果使能SPI操作(SPE=1)并选择作为主机,主机对SPI数据寄存器的写操作将启动SPI时钟发生器和数据的传输。
在数据写入SPIDR之后的半个到一个SCK周期后,数据将出现在MOSI引脚上。
另外,主机可以通过将从机的
引脚变为低来实现通信。
写入主机SPIDR寄存器的数据从MOSI引脚移出到从机的MOSI引脚。
同时从机SPIDR寄存器的数据从MISO引脚移出到主机的MISO引脚。
传输完一个字节后,SPI时钟发生器停止,传输完成标志SPIF置1并产生一个中断(若SPIE=1)。
主机和从机的两个移位寄存器可以看作一个16位循环移位寄存器。
当数据从主机移位传送到从机的同时,数据也以相反的方向移入。
这意味着在一个移位周期中,主机和从机的数据相互交换。
注意:
主机在传输过程中,下列位CPOL,CPHA,SSOE,LSBFE,MODFEN,SPC,BIDIROE,SPPR2~SPPR0和SPR2~SPR2中的任一位改变都会中止传输过程并使系统进入空闲状态。
4.2.2SPI从模式
当MSTR清0时,模块工作在从模式,称为从机。
一个系统中可以有多个从机,从模式下各引脚的功能和控制如下:
∙SPI时钟(SCK):
从模式中SCK作为输入引脚接收主机输出的SCK。
∙MOSI与MISO:
在从模式中,MOSI引脚作为数据输入引脚,MISO引脚作为数据输出引脚。
∙
:
从模式中,
为输入引脚,作为从机的选择信号。
引脚必须在SPI传输开始前变为低,而且必须保持到SPI传输完成,
变为高时,从机将进入空闲状态。
当CPHA=1时,SSOE必须为0,
引脚必须取反并且在每个连续的串行字节之间重新设置为高电平。
如果SPIDR寄存器在
未变化时执行写操作,则将导致一个写冲突错误。
所谓写冲突,就是在发送数据时,数据寄存器中的数据还没有发送出去,新的数据又写入数据寄存器中,这时就会发生写冲突错误,在这种情况下,正在发送到数据将继续发送,新写入的数据将丢失。
当对主机或从机进行写冲突检测时,主机发生写冲突的情况是很罕见的,因为主机拥有数据传输的完全控制权,但从机有可能发生写冲突,因为当主机启动传输时,从机无法进行控制。
当CPHA=1时,SSOE可以置1。
如果SSOE=0,
引脚可以在连续传输之间保持有效。
这种方式适用于具有单固定主机和单固定从机驱动MISO数据线的系统。
注意:
SPI传输过程中,下列位CPOL,CPHA,SSOE,LSBFE,MODFEN,SPC0和BIDIROE,中的任一位改变都会中止传输过程并使系统进入空闲状态。
4.3SPI传输过程格式
SPI传输中,数据能够同步的发送或接收,其中起关键作用的是同步时钟信号SCK,该信号由主机发出,从机接收并作为和主机的同步信号,可以选择在SCK的上升沿或下降沿采样数据。
4.3.1SCK信号的相位和极性控制
SPICR1中的两个位CPOL和CPHA用来控制SCK信号的极性和相位,这两位可以通过软件改变。
当CPOL复位时,SPI系统以高电平为激活电平,在空闲状态下SCK为低电平;反之,SPI以低电平为激活电平,空闲状态下SCK为高电平。
CPHA置位时,SPI在SCK的偶数沿采样数据,CPHA复位时,SPI在SCK的奇数沿采样数据,所以根据CPHA的取值不同,SPI系统有两种传输格式。
4.3.2CPHA=0传输格式
在这种格式中,在SCK的第一个时钟沿进行数据的采样,即主机中数据的第一位进入从机中,同时,从机中数据的第一位进入主机中。
说明:
第一个SCK沿应至少落后于
有效点半个时钟周期。
半个SCK周期之后,出现第二个SCK时钟沿,同时先前的数据位锁存到移位寄存器中,在这个SCK沿之后,主机中数据的第二位通过MOSI进入从机中MOSI引脚,与此同时,从机中数据的第二位通过MISO进入主机中的MISO引脚,在第三个SCK沿采样该位,并在第四个SCK沿锁存到移位寄存器中。
如是依次处理,16个SCK时钟沿后,传输数据的8位全部分别在奇数沿上锁存到移位寄存器中并在偶数沿进行移位。
在最后一位移到移位寄存器的同时,该字节被传到系统的数据寄存器中。
该过程完成之后,传输应完成如下两个功能:
∙先前在主机数据寄存器中的数据现在应在从机的数据寄存器中,而原先在从机中数据寄存器中的数据应在主机中。
∙
图4.8SPI传输格式0(CPHA=0)
SPI状态寄存器中的SPIF位置位。
图4.8是CPHA=0时的传输格式。
该图给出了CPOL=1和CPOL=0两种SCK的波形图。
同时,该图既可以作为主机的传输图,也可作为从机的传输图。
若作为主机,MOSI为数据输出端,MISO为数据输入端,若作为从机,MOSI为数据输入端,MISO为数据输出端。
4.3.3CPHA=1传输格式
当CPHA=1时,SPI传输的采样点在SCK的偶数沿上。
在该种模式中,同步信号出现半个SCK周期后,SCK信号的第一个沿立即有效。
在这第一个沿上,若从机为输出,则从机数据的第一位传输到主机的输入引脚上。
再过半个SCK周期,第二个SCK沿出现在SCK引脚上,在这个沿上,主机和从机都会采样数据,则被传输数据的第一位被采样。
当第三个SCK沿产生时,被采样的第一位数据由输入引脚移位到移位寄存器中,在这个SCK沿之后,主机的输出数据的第二位传输到从机输入引脚上。
在第四个SCK沿上采样第二位,如此16个SCK沿之后,则一个数据传输完成。
在这16个SCK沿中,系统在奇数沿上移位数据位,在偶数沿上采样数据。
图4.9为CPHA=1时的SPI传输格式的波形图。
图4.9SPI传输格式1(CPHA=1)
该过程完成之后,传输应完成如下两个功能:
∙先前在主机数据寄存器中的数据现在应在从机的数据寄存器中,而原先在从机中数据寄存器中的数据应在主机中。
∙SPI状态寄存器中的SPIF位置位。
4.4利用SPI单片机实现多从机传输系统
在这个实例中,利用单片机STC12C5410中的SPI模块实现一个主机和两个从机的传输系统,同时主机通过RS-232接口与计算机连接可实现与计算机的通信。
4.4.1STC12C5410简介
STC12C5410是一款宏晶科技生产的增强型的8051内核的单片机,该单片机具有一个SPI模块。
图4.10为一款28引脚的单片机。
图4.10STC12C5410引脚图
在图4.10中,P1.4~P1.7为单片机的SPI模块管脚,与之相对应的还有SPI模块的各种寄存器和SPI传输的中断位。
下面分别介绍。
1.SPI控制寄存器SPCTL
STC12C5410的SPI模块只有一个是控制寄存器,地址为85H,复位后值为00000100。
D7
D6
D5
D4
D3
D2
D1
D0
SSIG
SPEN
DORD
MSTR
CPOL
CPHA
SPR1
SPR0
图4.11STC12C5410的控制寄存器
表4.3为该寄存器的各位的描述
表4.3SPI控制寄存器的位描述
位
符号
描述
D0
SPR0
SPR0/SPR1是时钟选择控制位
D1
SPR1
SPR1SPR0
00CPU_CLK/4
01CPU_CLK/16
10CPU_CLK/64
11CPU_CLK/128
D2
CPHA
SPI时钟相位选择位(见4.1节)
D3
CPOL
SPI时钟极性选择位(见4.1节)
D4
MSTR
主/从模式选择(见4.1节)
D5
DORD
SPI数据顺序(同4.1节LSBFE)
D6
SPEN
SPI使能(同4.1节SPE)
D7
SSIG
分机选择输出使能(同4.1节SSOE)
说明:
SPI传输协议最早为摩托罗拉公司制定的,但该协议并未成为国际标准协议,故各器件厂家并不是按摩托罗拉公司的SPI传输协议设计的SPI模块,而是有所差异。
所以,介绍的STC12C5410单片机的寄存器与前面的协议介绍有所不同。
2.SPI状态寄存器SPSTAT
SPI状态寄存器只有两个有效位,分别是SPIF和WCOL,如图4.12,地址为84H,复位后值为00××××××。
D7
D6
D5
D4
D3
D2
D1
D0
SPIF
WCOL
-
-
-
-
-
-
图4.12STC12C5410的状态制寄存器
∙SPIF:
SPI传输完成标志。
(同4.1节SPIF)
∙WCOL:
SPI写冲突标志。
在数据传输的过程中如果对SPI数据寄存器SPDAT执行写操作,WCOL将置位。
WCOL=1:
SPI传输中出现了写冲突:
WCOL=0:
SPI传输中未出现写冲突。
说明:
SPIF和WCOL用软件清零,清零时,向对应位写入1。
3.SPI中断
STC12C5410在51单片机的基础上增加了SPI中断,以实现SPI传输。
该中断的中断向量地址为002BH,中断号为5。
如果要允许SPI中断,则需要将处理如下几个控制位:
∙将ESPI置位,允许SPI中断,这是SPI中断的单独控制位。
∙将EADCI_SPI置位,允许A/D转换中断和SPI中断,只是A/D中断和SPI中断的总中断控制位。
∙将EA置位,打开单片机总中断控制位。
∙SPI中断服务程序中要用软件清SPI中断请求标志位SPIF。
4.4.2CAT25C32简介
CAT25C32为一款容量4k字节低电压、低功耗的CMOSE2PROM,它支持SPI串行传输,具有如下特点:
∙支持SPI串行传输
∙时钟速率可达20MHz
∙支持单字节操作模式和页操作模式(每页256字节)
∙1.8V~6V宽电压工作范围
∙硬件和软件写保护功能
∙低功耗CMOS技术
∙10万次擦写次数
∙数据可保持10年
∙高可靠性
∙8-引脚SOIC封装
1.CAT25C32的引脚和指令
图4.13为它的管脚图,下面介绍各引脚的功能。
图4.13CAT25C32管脚图
∙
:
片选信号。
当
变为低电平时,CAT25C32被选中,在SPI传输中,CAT25C32总是作为从机。
当
为高电平时,SI不会接收任何时间,SO为高阻态,CAT25C32进入挂起状态,在该状态下,CAT25C32的电流为零。
∙SCK:
串行时钟。
由于CAT25C32总是作为从机,所以SCK总是作为输入引脚。
∙SI:
串行数据输入。
该引脚是CAT25C32的数据、操作指令和数据地址的输入脚,在SCK的上升沿数据。
∙SO:
串行数据输出。
该引脚为CAT25C32数据输出引脚,数据中SCK的下降沿移出SO脚。
∙
:
写保护。
当该引脚有效时,CAT25C32中的数据处于写保护状态,在写保护状态下,CAT25C32中的数据只读的。
∙
:
暂停串行输入。
在
有效时,该引脚能够暂停CAT2