基于LPC2103的SPI总线技术的应用
扫描二维码
随时随地手机看文章
关键词: SPI总线;主模式;LPC2103;74HC595
SPI( Serial Peripheral Interface) 总线是Motorola公司提出的一个同步串行外设接口, 允许MCU与各种外围器件以串行方式进行通信、数据交换。SPI可以同时发出和接收串行数据, 它只需4条线就可以完成MCU与各种外围器件的通信。一般使用的4条线为:串行时钟线SCK、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SSEL。这些外围器件可以是简单的TTL移位寄存器、复杂的LCD显示驱动器、Flash、RAM、A/D转换器、网络控制器及其他MCU等[1]。
本文给出了一种基于SPI总线的LPC2103控制外围LED显示的设计方法。利用74HC595驱动静态共阳LED数码管,使用串转并的方式实现I/O口的扩展。
1 LPC2103中的SPI功能特性
LPC2103是一个基于支持实时仿真的16/32位ARM7 TDMI-S CPU的微控制器,内部具有2个完全独立的SPI控制器,采用全双工的数据通信方式,最大数据位速率为外设时钟Fpclk的1/8。与SPI总线接口有关的专用寄存器有:(1)SPCR控制寄存器。该寄存器包含一些可编程位来控制SPI总线的功能,而且在数据传输之前进行设定,主要有时钟相位控制、时钟极性控制、主从模式选择、字节传输移动方向及SPI中断使能;(2)SPSR状态寄存器(为只读寄存器)。用于监视SPI功能模块的状态,包括一般性功能和异常情况。主要用途是检测数据传输是否完成,通过判断SPIF位来实现,其他位用于指示异常情况;(3)SPDR数据寄存器。为SPI提供数据的发送和接收,处于主模式时,向该寄存器写入数据,将启动SPI数据传输。串行数据的发送和接收通过内部移位寄存器来实现;(4)SPCCR时钟计数器寄存器。用于设置SPI时钟分频值,SPI处于主模式时,该寄存器用于控制时钟速率,即SPI总线速率,寄存器值为1位SCK时钟所占用的PCLK周期数,并且值为偶数,必须不小于8;(5)SPINT中断标志寄存器。包含了SPI的中断标志位,由数据传输完成及发生模式错误来引发[2]。
1.1 SPI电气连接
利用SPI总线可在软件的控制下构成各种系统,如1个主MCU和几个从MCU、几个从MCU相互连接构成多主机系统(分布式系统)、1个主MCU和1个或几个从I/O设备所构成的各种系统等。在大多数应用场合, 可使用1个MCU 作为主机来控制数据,并向1个或几个从外围器件传送该数据。从器件只有在主机发命令时才能接收或发送数据。同一时刻只允许有1个主机操作总线。在数据传输过程中,总线上只能有1个主机和1个从机通信。在一次数据传输中,主机总是向从机发送1个字节数据,而从机也总是向主机发送1个字节数据[3]。图1为SPI在主模式下控制2个SPI从机的硬件连接图。
1.2 SPI数据传输
在SPI数据传输中,SPCR控制寄存器的CPHA和CPOL位作用非常关键。CPHA为时钟相位控制,该位决定SPI传输时数据和时钟的关系,并控制从机传输的起始和结束,该位为1,时钟前沿数据输出,后沿数据采样;为0,时钟前沿数据采样,后沿数据输出。CPOL为时钟极性控制,为1时,SCK为低电平有效;为0时,SCK为高电平有效[4]。[!--empirenews.page--]
图2为SPI的4种不同数据传输格式时序,描述的是8位数据传输。该时序图水平方向分成3部分:(1)描述SCK和SSEL信号;(2)描述CPHA为0时的MOSI和MISO信号;(3)描述CPHA为1时的MOSI和MISO信号。SSEL信号为低电平,说明SPI工作在从模式。其中,MOSI和MISO信号中的bit1~bit8表示传输的第几位数据。
2 74HC595扩展I/O接口电路
SPI是一个串行输入输出的接口,使用串转并的接口芯片可以实现扩展I/O口。74HC595芯片为一种常用的8位串转并移位寄存器芯片,本系统利用74HC595来驱动静态共阳LED数码管。74HC595的主要优点:具有数据存储寄存器,在移位过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。LPC2103工作在SPI主模式下。
图3为74HC595逻辑图。图中,SI为串行数据输入引脚,用来连接LPC2103的MOSI功能引脚;SCK为移位寄存器的时钟输入,连接LPC2103串行时钟线SCK;为清移位寄存器引脚;RCK为锁寄存器锁存时钟引脚;即输出触发端与SSEL连接;为输出使能引脚;SQH为串行数据输出引脚,连接MISO;QA~QH引脚为并行输出。当为高电平、使能接低时,SCK产生一个上升沿,SI引脚当前电平值将在移位寄存器中左移1位,在下一个上升沿到来时移位寄存器中的所有位都会向左移1位,同时SQH引脚也会串行输出移位寄存器中的高位的值。当RCK产生上升沿时,移位寄存器的值将会被锁存到锁存器里,并从QA~QH引脚输出。
[!--empirenews.page--]
图4为SPI接口与74HC595的连接原理图。其中QA~QH分别连接共阳LED数码管的8个段。在SPI输出1个字节的数据时,SSEL产生1个低电平,SPI主机串行地发该字节的各个位,各个位都依次被锁存在74HC595的移位寄存器内,当1个字节的数据传输完成后,SSEL由低电平变为高电平,从而使74HC595的移位寄存器的值被锁存到74HC595的锁存器并从其QA~QH引脚输出;在SPI输出1个字节数据的同时,74HC595移位寄存器之前的值也通过MISO引脚被SPI主机读回。
3 软件设计[5]
软件设计包括:进行I/O口初始化,设置SPI引脚连接,启用LPC2103的SPI 0总线,设置GPIO的P0.4、P0.5、P0.6、P0.7为SPI 0总线的SCK0、MISO0、MOSI0、SSEL0特殊功能,置74HC595片选端的I/O口为输出功能。其代码如下:
PINSEL0=0x00005500; //设置SPI引脚连接
PINSEL1=0x00000000;
IODIR=HC595_CS; //设置片选端I/O口为输出
3.1 SPI总线操作初始化
图5为SPI总线操作流程图。使用LPC2103的SPI总线主模式下实现对74HC595的数据传输,用来驱动外围LED数码管。设置SPI时钟,在SPI主模式下,SPCCR寄存器控制SCK的频率,SPI速率为Fpclk / SPCCR。通过SPCR控制寄存器设置时钟相位、时钟极性、主模式控制、字节移动方向及SPI中断使能等。代码实现如下:
Void MSpiIni(void)
{ SPI_SPCCR = 0x52; //设置SPI时钟分频
SPI_SPCR = (0<<3)| //CPHA=0,数据再从SCK的第一时钟沿采样
(1<<4)| //CPOL=1,SCK为低有效
(1<<5)| //MSTR=1,SPI处于主模式
(0<<6)| //LSBF=0,SPI数据传输MSB(位7)在先
(0<<7); //SPIE=0,SPI中断被禁止
}
3.2 SPI总线主模式下数据发送过程
首先选择从机,设置片选。选择74HC595为从机,置片选端SSEL为低有效。将发送的数据写入SPDR,发送出去。等待SPIF置位,即数据发送完毕。最后可从SPDR读取收到的数据。以下为发送函数:
uint8 MSendData(uint8 data)
{ IOCLR=HC595_CS; //片选端,由LPC2103指定的I/O口置位
SPI_SPDR=data;
while(0==(SPI_SPSR&0x80)); //等待SPIF置位,即等待数据发送完毕
IOSET=HC595_CS; //片选置高无效,结束发送
return(SPI_SPDR); //返回接收到的数据
}
3.3 控制LED数码管主函数
主函数使用LPC2103的SPI接口输出给74HC595,用来控制LED数码管显示。DISP_TAB[ ]为LED显示0-F字模的16进制码表。MSendData( )实现每一字节数据的发送。
#define HC595_CS 0x00000100 //P0.8口为74HC595的片选
uint8 const DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
int main(void)
{ uint8 rcv_data;
uint8 i;
PINSEL0=0x00005500; //设置SPI引脚连接
PINSEL1=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(0);
}
基于SPI总线的数据通信技术已经广泛应用在MCU与各种外围设备的串行通信中。如存储系统、A/D转换系统、网络控制器和多MCU构成的分布式系统。本文给出了74HC595芯片驱动LED数码管显示的电路,采用SPI总线技术实现对LED显示的数据传输,方便快捷、准确性高、速度快,满足了复杂微控制系统对外围设备控制的要求。