SPI的接口及其应用.docx
- 文档编号:10562036
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:17
- 大小:208.81KB
SPI的接口及其应用.docx
《SPI的接口及其应用.docx》由会员分享,可在线阅读,更多相关《SPI的接口及其应用.docx(17页珍藏版)》请在冰点文库上搜索。
SPI的接口及其应用
SPI的接口及其应用
2010-09-0100:
10:
29| 分类:
ARM及程序设计| 标签:
|字号大中小 订阅
1SPI接口的特点
目前很多单片机都配置有SPI、I2C或UART等串行接口。
在SPI、I2C及UART三种串行接口一般情况下速度最快的是SPI。
I2C接口由于是二线协议速度很难超过1MHz/Bit,而UART工作在方式0(8位移位寄存器)时时钟速度为系统时钟的十二分之一(Fosc/12),而SPI接口时钟速度一般为系统时钟的四分之一(Fosc/4)。
典型SPI接口结构如图1所示。
串行外围设备接口SPI(serialperipheralinterface)总线技术是Motorola公司推出的一种同步串行接口,Motorola公司生产的绝大多数MCU(微控制器)都配有SPI硬件接口,如68系列MCU。
SPI用于CPU与各种外围器件进行全双工、同步串行通讯。
SPI可以同时发出和接收串行数据。
它只需四条线就可以完成MCU与各种外围器件的通讯,这四条线是:
串行时钟线(CSK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)、低电平有效从机选择线CS。
这些外围器件可以是简单的TTL移位寄存器,复杂的LCD显示驱动器,A/D、D/A转换子系统或其他的MCU。
当SPI工作时,在移位寄存器中的数据逐位从输出引脚(MOSI)输出(高位在前),同时从输入引脚(MISO)接收的数据逐位移到移位寄存器(高位在前)。
发送一个字节后,从另一个外围器件接收的字节数据进入移位寄存器中。
主SPI的时钟信号(SCK)使传输同步。
SPI主要特点有:
可以同时发出和接收串行数据;
可以当作主机或从机工作;
提供频率可编程时钟;
发送结束中断标志;
写冲突保护;
总线竞争保护等。
图2和图3中还给出了SPI总线工作的四种方式及SPI总线接口的时序。
SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。
如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。
时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。
如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。
SPI主模块和与之通信的外设的时钟相位和极性应该一致。
图2
图3
2利用SPI接口驱动LED显示屏
从图1可以看出SPI接口的核心部分是8位串行移位寄存器,而LED单元板的最基本元件74HC595也是8位串行移位寄存器,因此适当地设计单片机SPI和LED单元板的连接可以高速将显示数据传送到LED显示屏。
显然将一个SPI器件对应于单元板的一条扫描线可最大限度发挥SPI器件的速度优势。
对应于一个扫描线不多而每扫描线又很长的情况下(超长LED条屏)使用一个SPI器件对应于单元板的一条扫描线可输出速度高达系统时钟的四分之一(Fosc/4)或更高。
而SPI接口的FLASH存储器件工作速度更可达50MHz/Bit以上,如只以SPI接口的FLASH存储器件工作速度来计算:
设一场扫描时间为16MS,在扫描模式为16时(1/16扫描),输出一行的时间为1MS,则LED屏水平方向点数=1000μS/(1/50MHz)=50000点。
可以说是一个“超超”长的LED条屏。
但这是不可能的,因为单元板中74HC595的工作频率一般为16MHz以下,也就是说50000点至少要除3。
有关超长LED条屏的详细介绍见下一章。
在上一节中我们将RAM的显示数据输出不经CPU处理直接送LED显示屏显示,数据流和控制如图4(a)所示。
CPU此时只做地址加一和读操作,这时的读(虚读)是为了单元板串行移位时钟。
这种理念同样可用于SPI接口的FLASH存储器件。
其数据流和控制框图如图4(b)所示。
从图4(b)中可以看出:
当CPU从串行FLASH中读数据时,串行FLASH的So端的数据在CPU的SCK作用下输出的同时移入74HC164,当两个字节共16位从串行FLASH输出并移入74HC164后由CPU给单元板发串行移位时钟。
这是一个经典的串并转换,其特点是数据不经CPU处理旁路直接输出。
VRS51L3074单片机有两个特殊功能正好为图4(b)所示的电路使用。
一是一次SPI启动后可输出多个字节(1至32位),二是输出多个字节后自动在特定引脚上输出一个负脉冲。
特别重要的是VRS51L3074单片机SPI时钟为系统时钟的二分之一(Fosc/2)。
多个字节特性可保证数据连续输出的速度,而输出负脉冲特性进一步提高了整体程序处理的速度。
图4(b)中串行移位寄存器使用的是74HC164而不是74HC595做串并转换,是因为74HC595多了一级输出锁存器时序上需要额外的控制信号。
也可以选用其它带SPI接口的单片机作为控制芯片,但需要软件实现单元板串行移位时钟。
不论控制电路为图4(a)或图4(b)中的哪一种,其前提是一行显示数据在存储器中连续排列。
众所周知计算机中为加速数据传送一般采用DMA方式,而图4(a)、(b)正是基于这样的理念设计的,让显示数据从存储器直接“DMA”到LED显示屏输入口。
简单地说一切影响速度的环节我们都应该想办法用硬件或软件的手段“DMA”,软件手段“DMA”只有一个基本点就是在硬件允许的前提下,尽最大努力减少完成同一功能模块的指令执行时间。
下面通过图5所示的SPI方式LED显示屏控制电路加以说明。
图5
图5(a)为74HC164内部结构图。
图5(b)为基于SPI串行FLASH存储器旁路输出的LED显示屏控制系统。
CPU可选用SST89E516或VRS51L3074均可。
SST89E516在倍频使用18MHZ晶振时SPI的SCK移位脉冲可达9MHz。
而VRS51L3074在使用内部40晶振时SPI的SCK移位脉冲可高达20MHz。
对于VRS51L3074来说P1.0和P1.1为SPI的片选信号,P1.3在传送8位后可自动产生一个负脉冲。
所以使用VRS51L3074时只需对SPI接口配置后直接连续启动SPI输出即可。
如果使用的是SST89E516只能以手动方式片选FLASH存储器,输出一个字节后用软件产生SCK移位信号,由于此时CPU端SPI输出只是用于启动SPI传送,如果我们固定启动SPI传送的数据使用0x80,在MOSI端将每间隔8位输出一位高电平,这个信号可用于产生SCK移位脉冲。
从图1可以看出启动数据0x80产生的脉冲发生在SPI传送的开始,故最后要启动一次SPI传送以保证最后一个字节被移入LED显示屏。
有关VRS51L3074和SST89E516的SPI配置请查阅相关器件数据手册。
图6是VRS51L3074连续传送一块单元板长度数据的程序模块。
程序(a)中SPI的输出为标准循环查询模式。
由于VRS51L3074的SPI输出速度设定为20MHz,在使用内部晶振40MHz时一位的传送时间为2个振荡周期。
8位共需用16个振荡周期。
程序(a)中第12行启动SPI传送后14行开始读SPI传送是否完成的状态。
此时SPI传送显然没有完成,经14、15、16后再回到14行读SPI完成状态时最多经过了12个振荡周期,此时SPI传送还没有完成。
只有第3次到14行读SPI状态时SPI传送肯定完成了。
这时一个字节的传送时间=3+3+3×(3+2+4)+5=38个振荡周期,而38个振荡周期在程序(b)中可以传送2个字节。
程序(b)的DAA指令为延时指令,4个DAA指令用时16个振荡周期,我们没有必要检测SPI状态,只是保证正确的SPI时序。
程序(b)比程序(a)速度快一倍。
图6(b)中CPU采用内部晶振40MHz的VRS51L3074水平方向的LED单元板点数为2048(一场16MS),垂直方向的单色128双色64点。
如果用2片74HC164级连垂直方向单色256双色128点,但水平方向的点数减为1024。
如果图6(b)中CPU采用外部晶振20MHz倍频的SST89E516其SPI输出速度只能到10MHz,再加上SST89E516为6T单片机而VRS51L3074为1T单片机,其综合输出性能最多到VRS51L3074综合输出性能的40%。
3单片机直接驱动LED显示屏应用实例
本文以一例单片机直接驱动LED显示屏的实例,对前面章节中所提到的数据组织、程序优化作小结。
如图7所示,硬件电路部分采用最简单的“单片机最小系统+08接口+LED显示屏”组成。
其中单片机采用SST89C58,工作频率为12MHz,LED显示屏为一块通用室内双基色单元板。
该电路为最简LED显示屏工作系统,适用于小型LED显示系统,具有显示效果丰富、成本低廉、易于控制等有点,并且该系统已在实际应用项目中通过测试。
如图7所示,设定显示区域4倍于显示屏,即Dw=2×Lw,Dh=2×Lh,其余参数定义见程序(LED屏和显示区域参数与第4章中符号定义相同)。
例1中给出的程序可以完成LED显示屏(图8中灰色区域)在显示区域ACIG中垂直、水平、对角移动这些功能,已在KeiluVision3的3.03版本中编译通过。
其中最重要的函数是voiddisplay(),它包括了对存储器的访问、数据输出、显示控制这3大功能。
对于存储器的方法完全根据第五章数据组织中的公式而来,因此数据查找详细分析见第五章。
该函数的执行效率直接关系到显示屏的显示效果,所以必须对它进行最大程度的优化。
整个LED显示屏组成仅用一块双基色单元板,所以如图7所示,数据口P0仅用P0.0~P0.3四条I/O线对应输出D0~D3,因此实际生成数据只有低4位有效。
为便于读者理解和修改、测试数据,故设置显示区域所有文字为黄色,例如当上半屏某象素点点亮为黄色时,该点绿色和黄色LED必然同时点亮才能混合显示黄色,所以R1和G1数据线上对应的数据必须同时置1,存储器中数据为“0xF3”。
如果读者希望验证某点或整个数据显示区域显示内容是否正确,只需要按照第五章中数据组织方法找出对应字节,修改对应红、绿扫描线的数据位即可实现所希望显示的效果。
由于显示区域数据较多,因此对例1中数组Dispaly_Font进行压缩。
如图7所示,该系统只使用D0~D3,4条数据线,所以显示区域数据高4位为无效数据,可以用任意数据替换,按照一般编程习惯,可以采用“F”替换高四位。
数据扩展方法为:
每个16进制数对应扩展为原数据低4位,例如“5”,扩展后应该为“0xF5,”。
注意编译前必须去掉最后一个数据后面的逗号。
建议使用UltraEdit软件的列操作功能进行修改。
例1:
//*****************************************************************************
以下为工程主文件和数据文件,注意测试时请包含数据文件
*****************************************************************************//
//*****************************************************************************
主文件
*****************************************************************************//
#include
#include
#defineDw128//显示区域长度
#defineDh64//显示区域高度
#defineLw64//LED显示屏宽度
#defineLh32//LED显示屏长度
#defineSw16//LED显示屏的扫描宽度
#defineEN_ON1
#defineEN_OFF0
sfrCTRL_PORT=0xa0;//定义扫描线A、B、C、D分别对应P2.0、P2.1、P2.2、P2.3
sfrDATA_PORT0=0x80;//定义并行数据输出端口为P0口
sbitE=P2^5;//定义显示允许控制信号
sbitRCK=P2^6;//定义74HC595锁存信号
sbitSCK=P2^7;//定义74HC595移位信号
//*****************************************************************************
显示核心程序
功能:
根据指定显示数据起始地址,在对应显示区域中查找数据,并完成一屏数据输出显示
参数说明:
XL:
数据起始地址的x坐标
YL:
数据起始地址的y坐标
display_count:
每屏显示次数,可以控制移动速度,数值越大单屏显示时间越长,移动速度越慢
*****************************************************************************//
voiddisplay(unsignedintXL,unsignedintYL,unsignedintdisplay_count)
{
unsignedcharline;//扫描线循环选择变量
unsignedcharcol;//控制横向移动长度变量
unsignedcharcode*ram_point;//显示数据访问指针
unsignedintk,ram_begin_addr;//数据起始地址
for(k=0;k { for(line=0;line { ram_begin_addr=Dispaly_Font; ram_point=ram_begin_addr+YL*Dw+XL+line*Dw;//数据查找 E=EN_ON;//开显示 for(col=Lw;col>0;col--)//每次循环完毕即送出完整一行数据到74HC595 //移位寄存器 { DATA_PORT0=*ram_point; ram_point++; SCK=0;SCK=1;//74HC595移位寄存器信号 } E=EN_OFF; RCK=0;RCK=1;//74HC595锁存信号 CTRL_PORT=CTRL_PORT&0xe0; CTRL_PORT=CTRL_PORT|line;//选择扫描行线 } } } voidmain(void) { unsignedintXL,y,count=80; display(0,0,3000); while (1) { for(XL=0;XL display(XL,0,count); for(XL=Dw/2;XL>0;XL--)//水平左移,从BCFE区域,向ABED区域移动 display(XL,0,count); for(YL=0;YL display(0,YL,count); for(YL=Dh/2;YL>0;YL--)//垂直移动,从DEHG区域,向ABED区域移动 display(0,y,count); for(XL=0;x display(XL*2,XL,count); for(XL=Lh;XL>0;XL--)//对角线移动,从EFIH区域,向ABED区域移动 display(XL*2,XL,count); for(XL=Lh;XL>0;XL--)//对角线移动,从BCFE区域,向DEHG区域移动 display(XL*2,Lh-XL,count); for(XL=0;XL<32;XL++)//对角线移动,从DEHG区域,向BCFE区域移动 display(XL*2,Lh-XL,count); } } //***************************************************************************** 数据文件 *****************************************************************************// //***************************************************************************** 显示区域数据,共计6144个16进制数据 数据替换方法: 将“F”、“A”、“5”、“0”,分别依次替换为“0xFF,”、“0xFA,”、“0xF5,”、“0xF0,”,去掉最后一个数据后面的逗号即可编译 *****************************************************************************// unsignedcharcodeDispaly_Font[128][48]={ FFF5FFFAFFF5FAFFFFFFFFFF5FFFAFFFFFF5FFFFFFFFFFFFFFFFFFFFFF555FFF FFF5FFFF5FAAAFFFFFFFFFF0FFFFFAFFFFF0AAAA0AAAFFFFFFFF5FFAFFFFF5FF FFFF5AAAAF5FFAFFFF0AAAAA0AAAAAFFFFF5FFFFFFF5FFFFF555555555FFFFFF FAA0AAAAA0FFFFFFFAAAAAA0AFFF5AFFFFF0FFFFF5FA5FFF555555F05555555F FAAAA0FFF5FF5AFFFF0FFFFA5FFFAFFFFAA0AAF555000FFFAAAAA0AFFFFAAFFF FF5FFAFFF5FF5FFFF5505555550550FFFFF0A000000055FFFFFF5FF0FFFFFFFF FF555055550550FFFF0FFFFA5FFFAFFFAAF5FAA5FAA5AAFFAAFFF5FFFFA0AFFF FF5FF055555055FFFFFAFFF5FFAFFAFFFFF0FFFFFFFAFFFFF5FF5FF0F5FFF5FF FF5FFAF5FFAF5AFFFF0FFFFA5FFFA5FF005550A5AAF5FAAFAAFF5FFFFA0AAFFF F5FF0FFF5FAFFFFFFFFAAAA0FFA5FAFF555000A0AAA0FFFFF5FF5FF0F5FFF5FF FF5FFAF0FFAF5AFFFF0000000000055FAAF5FAA5AAF5FAAFAA55555555FAAFFF 55000AA0AAF5FFFFFFA5555055055AFFFFF5FFFF5F5FFAFFF5FF5AF0FA5F5FFF AA00000005055AFFFF0FFFFAFFFFAFFFFA00AAF5AAF0FAAFAAAAAAF5FFFAAFFF FFF5FF5AFFFF5FFFFFA5FFFAFFA5FAFFAAA0A000000000AFF5FF5AF0FF0F5FFF FF5FAAF5FFAF5AFFFF0FFFFAFFFFAFFFAA555AA5AAF0FAAFFFFFFA0FFF5AAFFF FF5FF505550555FFFAF055055505FAFFFFA55FAF5FFFFFFFF5FF0FF0FFF0FFFF FF5FAAA5FFAF5AFFFF05555055FFAFFFA0F5F0A5AAF5FAAFFFFFF0AFFFF0AFFF F5FFFAF5FF5AF5FFAFF5AFAFFFA5FAFFFF00AAAA0AAAA0FFF55505F0FFF5AFFF FF50505005055AFFFF0AAAAAA0AAAFFFA0F5FAA5AAF5FAAFFF55500555500FFF 55000AA0AA0AAFFFFFF550555505FAFF55A555050555505FFFFAF5F0FF5F5AFF FF5AFAF5AFAFFAFFFF0FFFFAF5FFAFFF0AF5FAA5FAA5AAFFAAFFFAA5FFFA0FFF F5FFFFF0FF5FAFFFFFF5FAFFFFA5FAFFFFA0AAAF0FF5AFFFFFAFF5F0FF5F5AFF FFAFFAF5FFAFF0FFFF0FFFFAF5FFAFFFFAA0AAF5FFA0AFFFFAAA0AF5FA0AAAAF FFFFAFF0FF0FFFFFFFF505555505FAFFFFA5FFA5FAF0FFFFFAF555F0F5FFF5FF 505550555555505FFF0FFFFAF5FFAFFFFFF5FFF5FFF5FF5FFFFF5FF5FFF5FFFF FFF50F5AFF5AFF5FFFF0FFFFFFF5FAFFFFA0AAAF5F0FFFFF555FF5F05FFFF5FF FFFFFAF5FFFFFAFFFA5FFFFAF5FFAFFFFFF5FF5FFFF5FF5FFFF5FFF5FFFF5FFF 555AFF5AFF5FAF5FFFA5FFFFFFF5F0FFAAA5FFAFF05AAFFFF5FFF5F0FFFFFFFF FFFFFAF5FFFAFAFFF0FFFFFAF5AFAFFFFFF5F5FFFFFF555FFF5FF5F5FFFF5FFF F5AFF0FAFFF5055F505555555550505FF5F5FFAF0FF50AAFFFF5F0F05555555F FFFFFAF5FFFFAFFF0FFFFFFFF5FAFFFFFFF55FFFFFFFFFFFFFFFFF5FFFFFFFFF FFFF5FAFFFFFFFFFFFFFFFFFFFFFAFFFFF5FFF00FFFF5AFFFFFF5FAFFFFFFFFF FFFAFFFFF5FAFFFFFFFFFFFFAFFFFFFFFFFAFFFFFFFFFFFFFFF5FFFFFFAAAFFF FFF0FFFFAFFFFFFFFFFF5FFAFFFFFFFFFFFA5FFFAFFFFFF5FFFFAFFFFFFFFAFF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SPI 接口 及其 应用