一种基于CPLD译码的DSP外部Flash烧写方法张芝贤1,邱委华1,朱庆贤2,王时间:2009年08月17日字体:大中小关键词:CPLDVHDLDSPTMS320C5509A摘要:以实际的图像监控系统为背景,介绍了对S29AL008DFlash存储器进行操作的指令格式和控制方法。通过CPLD实现DSP和Flash存储器之间的硬件连接,给出了部分VHDL源程序。利用TMS320C5509ADSP通过CPLD快速译码实现Flash烧写具有接口简单、通用性强的优点,在实践中证明了方法的有效性。关键词:DSP;S29AL008D;CPLD译码;Flash烧写数字信号处理器DSP因其运算精度高,实时性强等特点,在通信、工业控制和消费类电子等领域得到了广泛应用,成为进行数字信号处理的首选器件。在图像监控系统中,往往要对大量的数据和应用程序进行处理和非易失性存储。采用Flash存储器对这些大量数据和应用程序进行存储是一种性价比较高的选择。本文设计的以TI公司DSP芯片TMS320VC5509A(以下简称VC5509A)为主处理器的图像监控系统中,使用了AMD公司S29AL008DFlash存储器作为数据和应用程序存储芯片。使用VC5509A对S29AL008D进行操作,在硬件接口设计中采用CPLD进行译码和时序控制。1VC5509A及其外部存储空间TMS320VC5509A是TI公司的一款16位高速低功耗定点DSP芯片,主要应用于对音频、静态图像的数字信号处理,是设计便携设备的较佳解决方案。该DSP芯片在核心电压为1.35V时最大工作频率为144MHz;地址线为24位,对地址的寻址范围为16M×8bit或8M×16bit。VC5509A采用统一的编址方式,即存储空间地址没有重叠但是寻址方式却有2种不同的方式:字节寻址和字寻址[1]。当DSP中的CPU访问VC5509A程序存储空间时,通过外部存储器接口(EMIF)对外部存储空间进行管理。外部存储空间被分成CE0~CE34个空间,分别由EMIF的CE0#~CE3#引脚管理,外部存储空间划分如图1所示[2]。CEn#(n=0~3)与外设的片选端连接。2硬件电路设计2.1VC5509A与Flash的硬件连接使用PGE封装的VC5509A对外只提供14条地址线引脚,因此只能寻址8K×16bit的空间范围[3],要对S29AL008D的512K×16bit存储空间寻址需19条地址线。解决办法是用CPLD实现锁存译码使D[5:0]具有数据/地址复用功能,为S29AL008DFlash存储器提供高6位地址[4]。VC5509A和CPLD与S29AL008D的硬件接口电路如图2所示[5]。通过CPLD的快速译码功能在CE2空间模拟1个Flash高位地址控制寄存器(换页控制寄存器)FPCR,上电复位后通过写FPCR控制FLASH的高位地址来实现换页功能。此处用VHDL对XC9536XL进行编程将FPCR映射到0x400000,由于篇幅限制仅给出如下部分核心源程序:begainfce=ce1;foe=aoe;fwe=awe;addr=a3&a2&a1;datain=d5&d4&d3&d2&d1&d0;facs='1'whence2='0'andaddr='000'else'0';FAR:process(facs,awe,reset)begainifreset='0'thenfa='000000';elseifreset='1'thenifawe'eventandawe='1'theniffacs='1'thenfa=datain(5downto0);endif;endif;endif;endprocess;dataout=fawhenaoe='0'andfacs='1'else'ZZZZZZ';……2.2VC5509ADSP相关寄存器的初始化在DSP对S29AL008D进行读写访问之前,要对DSP内相关寄存器进行正确的设置。此系统的初始化设置如下[6-7]:ioportunsignedint*ebsr=(unsignedint*)0x6c00;ioportunsignedint*egcr=(unsignedint*)0x800;ioportunsignedint*ce11=(unsignedint*)0x806;ioportunsignedint*ce12=(unsignedint*)0x807;ioportunsignedint*ce13=(unsignedint*)0x808;*ebsr=0x01;//外部总线选择寄存器选定完全EMIF模式*egcr=0x0a10;//关闭ARDY控制在CPU一半工作频率下,设置CE1*ce11=0x162a//设置存储器模式为异步16位,读操作的setup、strobe、hold与写操作的相同*ce12=0x162a;//写操作的setup、strobe、hold*ce13=0;2.3Flash存储器的操作对S29AL008D的读写过程必须严格按照S29AL008D提供的命令时序来完成。表1给出了S29AL008D对数据字进行复位、擦除、读、写的命令时序[7]。Flash操作写子函数C程序如下:#defineflash_ba0x200000//ptr是FLASH存储器映射在整个DSP系统地址空间中的基地址#defineFARunsignedintPA,PD;voidwrite_se(unsignedintse_addr,unsignedintse_data){unsignedint*flash_adr,*FAR=(unsignedint*)0x400000;flash_adr=(unsignedint*)(flash_ba+se_addr);//se_addr由FAR和A[13:1]来决定*flash_adr=se_data;}对Flash进行写操作前必须先擦除片内原有的数据。Flash的整片字擦除操作时序C语言实现如下:voidErase-Chip(){voidwrite_se(0x555,0xAA);voidwrite_se0x2AA,0x55);voidwrite_se0x555,0x80);voidwrite_se0x555,0Xaa);voidwrite_se0x2AA,0x55);voidwrite_se0x555,0x10);}Flash要对写入的数据进行校验以及判断操作是否正确完成。Flash写校验C语言实现如下:voidprogram_check(void){unsignedintalgorithm_out;unsignedintdatapolling_bit;unsignedintexceed_time;algorithm_out=read_arry(PA);datapolling_bit=intalgorith_out&0x80;exceed_time=algorithm_out&0x20;while((datapolling_bit!=PD&0x0080)&&(exceed_time!=0x20)){algorith_out=read_arry(PA);datapolling_bit=algorith_out&0x80;exceed_time=algorith_out&0x20;}if(exceed_time==0x20){datapolling_bit=read_arry(PA)&0x80;if(datapolling_bit!=PD&0x0080){reset_flash();wrong();}}}Flash字编程程序如下:voidWord-Program(void){write_se(0x555,0xAA);write_se0x2AA,0x55)write_se(0x555,0XA0);write_se(PA,PD);program_check();}由于篇幅所限,本文仅给出部分核心程序代码,读者可利用上述代码编写一个完整的程序。本文以解决DSP静态图像无线传输系统项目中对大规模程序和大量图像数据的存储问题为背景,并最终在整个系统调试中实现其存储功能和程序的二次加载。经验证,本接口设计和编程实现具有操作方便,易于扩展等优点。对DSP外部Flash编程虽不是一项关键技术,但它在整个DSP嵌入式系统开发中却有着至关重要的作用。如果开发者在设计之初就掌握了这项技术,将会大大方便系统的调试,缩短开发时间。参考文献[1]TexasInstruments.TMS320VC5509DSPexternalmemoryinterface(EMIF)referenceguide[S].LiteratureNumber:SP-2RU670,October2003.[2]彭启琮,武乐琴.TMS320VC55X系列DSP的CPU与外设[M].北京:清华大学出版社,2005:191-212.[3]TexasInstruments.TMS320C55xDSPCPUreferenceguide[S].LiteratureNumber:SPRU371F,February2004.[4]申敏,邓矣冰.DSP原理及其在移动通信系统中的应用[M].北京:人民邮电出版社,2001:130-139.[5]刘伟,闫玉华.基于CPLD译码的DSP二次Bootloader方法[J].电子技术应用,2008,34(10):61-63.[6]李坤,肖恒.TMS320VC33的引导加载方法设计与实现[J].电子技术应用,2003,23(2):166-168.[7]PublicationnumberS29AL008D_00revisionAamendment3.IssueDateJune16,2005.