SPI总线bus的综述.docx
- 文档编号:9398540
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:15
- 大小:336.74KB
SPI总线bus的综述.docx
《SPI总线bus的综述.docx》由会员分享,可在线阅读,更多相关《SPI总线bus的综述.docx(15页珍藏版)》请在冰豆网上搜索。
SPI总线bus的综述
SPI总线综述
SPI是英文SerialPeripheralInterface的缩写,中文意思是串行外围设备接口。
SPI是Motorola公司推出的一种同步串行通讯方式,是一种标准的四线同步双向串行总线,因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。
SPI可以使微控制器(MCU)与各种外围设备(包括FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和微控制器等)以串行方式进行通信以交换信息。
SPI总线使用同步协议传送数据,接收或发送数据时由主机产生的时钟信号控制。
SPI接口可以连接多个SPI芯片或装置,主机通过选择它们的片选来分时访问不同的芯片
1基本原理
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,设备之间有4线模式(双向传输时)或3线模式(单向传输时)。
在4线模式下,它们是SDI(数据输入),SDO(数据输出),SCLK(时钟),CS(片选);在3线模式下,SDI和SDO并为一根,定义为SIO。
(1)MOSI–SPI总线主机输出/从机输入(SPIBusMasterOutput/SlaveInput)
(2)MISO–SPI总线主机输入/从机输出(SPIBusMasterInput/SlaveOutput)
(3)SCLK–时钟信号,由主设备产生
(4)CS–从设备使能信号,由主设备控制
其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。
这就允许在同一总线上连接多个SPI设备成为可能。
接下来就负责通讯的3根线了。
通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。
这就是SCLK时钟线存在的原因,由SCK提供时钟脉冲,SDI、SDO则基于此脉冲完成数据传输。
数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。
完成一位数据传输,输入也使用同样原理。
这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。
SPI总线系统有以下几种形式:
1个主机和多个从机、多个从机相互连接构成多主机系统(分布式系统)、1个主机与1个或几个I/O设备构成的系统等
SPI总线信号线基本连接关系,如下图
SPI总线包括1根串行同步时钟信号线以及2根数据线。
SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。
如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。
时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。
如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
SPI主模块和与之通信的外设音时钟相位和极性应该一致。
SPI接口时序如图3、图4所示。
SPI是一个环形总线结构由SS(CS)、SCK、SDI、SDO构成,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。
假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。
那么第一个上升沿来的时候数据将会是SDO=1;寄存器=0101010x。
下降沿到来的时候,SDI上的电平将所存到寄存器中去,那么这时寄存器=0101010SDI,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。
这样就完成里一个SPI时序。
例子:
假设主机和从机初始化就绪:
并且主机的SBUFF=0xaa,从机的SBUFF=0x55,下面将分步对SPI的8个时钟周期的数据情况演示一遍:
假设上升沿发送数据
脉冲
主机SBUFF
从机SBUFF
SDI
SDO
0
10101010
01010101
0
0
1上
0101010x
1010101x
0
1
1下
01010100
10101011
0
1
2上
1010100x
0101011x
1
0
2下
10101001
01010110
1
0
3上
0101001x
1010110x
0
1
3下
01010010
10101101
0
1
4上
1010010x
0101101x
1
0
4下
10100101
01011010
1
0
5上
0100101x
1011010x
0
1
5下
01001010
10110101
0
1
6上
1001010x
0110101x
1
0
6下
10010101
01101010
1
0
7上
0010101x
1101010x
0
1
7下
00101010
11010101
0
1
8上
0101010x
1010101x
1
0
8下
01010101
10101010
1
0
这样就完成了两个寄存器8位的交换,上面的上表示上升沿、下表示下降沿,SDI、SDO相对于主机而言的。
其中SS引脚作为主机的时候,从机可以把它拉底被动选为从机,作为从机的是时候,可以作为片选脚用。
根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在下一个8位时钟周期才把数据读回来。
要注意的是,SCLK信号线只由主设备控制,从设备不能控制信号线。
同样,在一个基于SPI的设备中,至少有一个主控设备。
这样传输的特点:
这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。
也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。
SPI还是一个数据交换协议:
因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。
不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义。
在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。
在多个从设备的系统中,每个从设备需要独立的使能信号。
2主要特性
•全双工通信,可以同时发出和接收串行数据
•1.05Mbit/s的最大主机位速率
•四种可编程主机位速率
•可编程串行时钟极性与相位
•可以当作主机或从机工作
•提供频率可编程时钟
•发送结束中断标志
•写冲突保护
•总线竞争保护等
3应用范围
SPI主要应用在高速数据传输的外设上,例如SD卡,FLASH芯片等。
在集成电路飞速发展的近几年SPI总线应用非常广泛,大量的新型器件如LCD模块、FLASH、EEPROM存储器、数据输入、输出设备、实时时钟、AD转换器、数字信号处理器和数字信号解码器等都有采用SPI接口。
在早期的单片机系统中,CPU大都不具有SPI接口,因此,对SPI接口设备的访问,基本都是通过软件模拟产生SPI接口所需要的时序。
但是随着单片机技术的进步,新型的单片机一般都已将SPI接口控制器集成在单片机内部。
SPI在单片机上的应用是其应用范围上的一大转折点,进一步拓宽了其应用领域,使得SPI的优势能在更多的领域体现。
4应用实例
1)MCP42X2双SPI数字电位器
SPI模块支持两种(共4种)标准SPI模式。
它们是模式0和3。
SCK的上升沿数据采样。
CS的无效状态Vih,低有效状态Vil和高有效状态Vihh。
Vil就是低电平,Vih就是MCP42X2的供电电压,Vihh需要一个MCP42X2的供电的倍压。
当与MCP42X2通讯时,CS只需要给出一个有效电平(低电平或倍电压)就可以。
SPI0时序图
命令格式
命令字节具有3个字段,即地址、命令和2个数据位。
当前仅定义了一个数据位(D8)。
它用于写命令。
当主器件发送正确的命令字节选择所需的操作时,会访问器件存储器。
被访问的存储器单元包含在命令字节的AD3:
AD0位中。
所期望的操作包含在命令字节的C1:
C0位中。
C1:
C0决定所期望的存储器单元是被读取、写入、递增(抽头设置+1)还是递减(抽头设置-1)。
递增和递减命令仅对于易失性抽头寄存器有效。
当命令字节装入器件(在SDI引脚上)时,器件的SDO引脚被驱动。
对于该命令的前6位,SDO引脚将输出高位。
在第7位,SDO引脚将输出CMDERR位状态。
第8位的状态取决于所选择的命令
命令位:
C1C0功能位数
11读数据16
00写数据16
01递增8
10递减8
存储器映射和受支持的命令
只有SPI发送具有正确的SCK脉冲数时,才会执行SPI发送。
只有接收到全部数量的时钟之后,命令才会被执行。
如果CS引脚被强制为无效状态(VIH),串行接口会复位。
不完整的命令不会被执行。
器件支持连续执行命令的功能。
当CS引脚处于有效状态(VIL或VIHH)时,可以接收任意的有效命令序列
2)基于LPC2103的SPI总线技术的应用
本文给出了一种基于SPI总线的LPC2103控制外围LED显示的设计方法。
利用74HC595驱动静态共阳LED数码管,使用串转并的方式实现I/O口的扩展。
1LPC2103中的SPI功能特性
LPC2103是一个基于支持实时仿真的16/32位ARM7TDMI—SCPU的微控制器,内部具有2个完全独立的SPI控制器,采用全双工的数据通信方式,最大数据位速率为外设时钟Fpclk的l/8。
与SPI总线接口有关的专用寄存器有:
(1)SPCR控制寄存器。
该寄存器包含一些可编程位来控制SPI总线的功能,而且在数据传输之前进行设定,主要有时钟相位控制、时钟极性控制、主从模式选择、字节传输移动方向及SPI中断使能;
(2)SPSR状态寄存器(为只读寄存器)。
用于监视SPI功能模块的状态,包括一般性功能和异常情况。
主要用途是检测数据传输是否完成,通过判断SPIF位来实现,其他位用于指示异常情况;(3)SPDR数据寄存器。
为SPI提供数据的发送和接收,处于主模式时,向该寄存器写入数据,将启动SPI数据传输。
串行数据的发送和接收通过内部移位寄存器来实现;(4)SPCCR时钟计数器寄存器。
用于设置SPI时钟分频值,SPI处于主模式时,该寄存器用于控制时钟速率,即SPI总线速率,寄存器值为l位SCK时钟所占用的PCLK周期数,并且值为偶数,必须不小于8;(5)SPINT中断标志寄存器。
包含了SPI的中断标志位,由数据传输完成及发生模式错误来引发。
1.1SPI电气连接
利用SPI总线可在软件的控制下构成各种系统,如l个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。
在大多数应用场合,可使用1个MCU作为主机来控制数据,并向1个或几个从外围器件传送该数据。
从器件只有在主机发命令时才能接收或发送数据。
同一时刻只允许有1个主机操作总线。
在数据传输过程中。
总线上只能有1个主机和1个从机通信。
在一次数据传输中,主机总是向从机发送1个字节数据,而从机也总是向主机发送1个字节数据。
图l为SPI在主模式下控制2个SPI从机的硬件连接图。
1.2SPI数据传输
在SPI数据传输中,SPCR控制寄存器的CPHA和CPOL位作用非常关键。
CPHA为时钟相位控制,该位决定SPI传输时数据和时钟的关系,并控制从机传输的起始和结束,该位为1,时钟前沿数据输出,后沿数据采样;为0,时钟前沿数据采样,后沿数据输出。
CPOL为时钟极性控制。
为l时,SCK为低电平有效;为0时。
SCK努高电平有效。
图2为SPI的4种不同数据传输格式时序。
描述的是8位数据传输。
该时序图水平方向分成3部分:
(1)描述SCK和SSEL信号;
(2)描述CPHA为0时的MOSI和MISO信号;(3)描述CPHA为l时的MOSI和MISO信号。
SSEL信号为低电平,说明SPI工作在从模式。
其中,MOSI和MISO信号中的bitl—bit8表示传输的第几位数据。
274HC595扩展I/O接口电路
SPI是一个串行输入输出的接口,使用串转并的接口芯片可以实现扩展I/0口。
74HC595芯片为一种常用的8位串转并移位寄存器芯片。
本系统利用74HC595来驱动静态共阳LED数码管。
74HC595的主要优点:
具有数据存储寄存器。
在移位过程中。
输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
LPC2103I作在SPI主模式下。
图3为74HC595逻辑图。
图中,SI为串行数据输入引脚,用来连接LPC2103的MOSI功能引脚;SCK为移位寄存器的时钟输入,连接LPC2103串行时钟线SCK;
为清移位寄存器引脚;RCK为锁寄存器锁存时钟引脚;即输出触发端与SSEL连接;
为输出使能引脚;SQH为串行数据输出引脚,连接MISO;QA~QH引脚为并行输出。
当
为高电平、
使能接低时,SCK产生一个上升沿,SI引脚当前电平值将在移位寄存器中左移l位,在下一个上升沿到来时移位寄存器中的所有位都会向左移l位,同时SQH引脚也会串行输出移位寄存器中的高位的值。
当RCK产生上升沿时,移位寄存器的值将会被锁存到锁存器里,并从QA~QH引脚输出。
图4为SPI接13与74HC595的连接原理图。
其中QA~QH分别连接共阳LED数码管的8个段。
在SPI输出1个字节的数据时,SSEL产生1个低电平,SPI主机串行地发该字节的各个位,各个位都依次被锁存在74HC595的移位寄存器内,当1个字节的数据传输完成后,SSEL由低电平变为高电平,从而使74HC595的移位寄存器的值被锁存到74Hc595的锁存器并从其QA~QH引脚输出;在SPI输出1个字节数据的同时,74HC595移位寄存器之前的值也通过MISO引脚被SPI主机读回。
3软件设计
软件设计包括:
进行IO口初始化,设置SPI引脚连接,启用LPC2103的SPI0总线,设置GPIO的P0.4、P0.5、P0.6、P0.7为SPl0总线的SCK0、MIS00、MOSIO、SSELO特殊功能,置74HC595片选端的I/O口为输出功能。
其代码如下:
PINSEL0=0x00005500;//股置SPI引脚连接
PINSELl=Ox00000000;
IODIR=HC595_CS;//设置片选端I/O口为输出
3.1SPI总线操作初始化
图5为SPI总线操作流程图。
使用LPC2103的SPI总线主模式下实现对74HC595的数据传输,用来驱动外围LED数码管。
设置SPI时钟。
在SPI主模式下,SPCCR寄存器控制SCK的频率,SPI速率为Fpclk/SPCCR。
通过SPCR控制寄存器设置时钟相位、时钟极性、主模式控制、字节移动方向及SPI中断使能等。
代码实现如下:
VoidMSpilni(void)
{
SPI_SPCCR=0x52;//设置SPI时钟分频
SPI_SPCR=(0<<3)|//CPHA=0,数据再从SCK的第一时钟沿采样
(1<<4)|//CPOL=1,SCK为低有效
(1<<5)|//STR=1,SPI处于主模式
(0<<6)|//LSBF=0,SPI数据传输MSB(位71)在先
(0<<7);//SPIE=0,SPI中断被禁止
}
3.2SPI总线主模式下数据发送过程
首先选择从机。
设置片选。
选择74HC595为从机,置片选端SSEL为低有效。
将发送的数据写入SPDR。
发送出去。
等待SPIF置位,即数据发送完毕。
最后可从SPDR读取收到的数据。
以下为发送函数:
uint8MSendData(uint8data)
{IOCLR=HC595_CS;//片选端,由LPC2103指定的I/O口置位
SPI_SPDR=data;
while(0==(SPI_SPSR&Ox80));//等待SPIF置位,即等待数据发
//完毕
IOSET=HC595_CS;//片选置高无效,结束发送
return(SPI_SPDR);//返回接收到的数据
}
3.3控制LED数码管主函数
主函数使用LPC2103的SPI接口输出给74HC595,用来
控制LED数码管显示。
DISP_TAB[]为LED显示0一F字模的
16进制码表。
MSendData()实现每一字节数据的发送。
#defineHC595_CSOx00000100//P0.8口为74HC595的片选
uint8constDISP_TAB[16I={0xC0,OxF9,0xA4,OxBO,0x99,0x92,Ox82,OxF8,0x80,0x90,0x88,0x83,0xC6,0xAl,0x86,Ox8E};
intmain(void)
{uint8rcv_data;
uint8i;
PINSEL0=0x00005500;//设置SPI引脚连接
PINSELl=0x00000000;
IODIR=HC595_CS;//设置LPC2103片选I/O口为输出功能
MSpiIni();//初始化SPI接口
while
(1)
{for(i=0;i<16;i++)
{rcv_data=MSendData(DISP_TAB[i]);//发送显示数据
DelayNS(50);//延时
}
}
return(O);
}
基于SPI总线的数据通信技术已经广泛应用在MCU与各种外围设备的串行通信中。
如存储系统、A/D转换系统、网络控制器和多MCU构成的分布式系统。
本文给出了74HC595芯片驱动LED数码管显示的电路,采用SPI总线技术实现对LED显示的数据传输,方便快捷、准确性高、速度快。
满足了复杂微控制系统对外围设备控制的要求。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SPI 总线 bus 综述
![提示](https://static.bdocx.com/images/bang_tan.gif)