贾振月,马志刚,杨钏钏
(西安电子科技大学电子工程学院,陕西西安 710071)
随着DSP技术的发展,其功能越来越强,类型也越来越多。由于DSP内部结构的特点,其算法程序一般都存储在外部的非易失性存储器中,在系统上电后,要将算法程序从外部存储器加载到DSP中,再进行相应的数据算法处理,这就需要动态地加载DSP运行程序。加载就是将存储在外部设备中的应用程序代码或数据加载到处理器内部的过程。为了充分利用DSP数据处理速度快的优点,通常希望程序能在DSP中高速运行,这就需要运用DSP的引导功能实现对DSP的快速引导。当电路板尺寸有限时,采用传统的并行EEPROM引导就比较困难。文中提出一种基于SPI Flash的引导方法,以ADSP-BF533为例,它是一款支持SPI接口引导功能的DSP,M25P16是一款串行的Flash,体积小、容量大、操作方便,用它做DSP的外部Flash ROM来实现BF533处理器的程序加载。
ADSP-BF533(简称BF533)处理器是一款主频高达600 MHz的高性能的Blackfin系列处理器,其结构采用数据总线和程序总线分离的哈佛结构,比传统的冯·诺依曼结构有更快的指令执行速度,同时具备简洁的RISC指令集结构。其内部指令处理采用流水线技术,并集成有乘累加单元(MAC)和算术逻辑单元(ALU)[1]。
BF533集成了丰富的外设接口,其中包括并行外设接口(PPI)、串口(SPORT)、串行外设接口(SPI)等。在该系统中使用SPI接口与M25P16连接实现程序的加载,并用可编程标志(PF)的PF2口作为M25P16的片选信号。
M25P16是一款带有先进写保护机制和高速SPI总线访问的2 MB串行Flash存储器,该存储器主要特点:2 MB的存储空间,分32个扇区,每个扇区256页,每页256 Byte;写入1页数据所需时间为1.4 ms(典型值);能单块擦除和整块擦除,SPI总线和50 MHz数据传输时钟频率。该芯片有一个状态寄存器,通过对其编程可实现芯片存储空间的保护以及芯片的写使能等操作。该状态寄存器中具有BUSY状态位,通过该状态位可查询芯片的当前状态,并进行相应的读、写、擦除等命令[2]。M25P16的读操作时序如图1所示。
图1 M25P16的读写时序
M25P16写入一个字节数据需写使能(WREN)和写入(PP)指令。采用这两个指令实现单页编程。对于某个单字节空间的操作,在使用PP指令之前需要对其擦除(FFh)。擦除操作可通过单块擦除指令(SE)和整块擦除(BE)来完成。擦除之前需要先执行WREN指令。当片选S信号为低电平,则选中该器件,此时处于有效电源模式;当片选S信号为高电平,器件未被选中,但能在所有内部指令周期完成前保持有效电源模式。指令周期完成则进入备用电源模式。通过特殊指令来读取或设置状态寄存器内的状态位和控制位,实现相应操作。
Flash M25P16芯片具有与工业标准的SPI接口兼容的外部引脚,文中使用的BF533也具有同样的SPI接口,因此,只需将两个芯片的SPI引脚对应连接即可,这就大幅节省了DSP芯片的外部接口资源。图2给出了BF533与M25P16的连接关系。
图2 BF533与M25P16的SPI连接
SPI通信有主机和从机两种工作模式,在该系统中DSP芯片工作在主模式,Flash芯片工作在从模式,相应地 M25P16的 MISO、MOSI分别对应 BF533的MOSI和MISO引脚。建立好DSP和Flash的连接关系后,还需要注意DSP加载模式的硬件设置。BF533有两个模式选择引脚 BMODE[1]和 BMODE[0],通过设置这两个信号就可以选择DSP的不同的加载模式,如表1所示。在本例中,设置 BMODE[1]和 BMODE[0]均为高电平,此时DSP的加载模式为SPI主模式加载。
表1 BF533引导模式选择
从SPI Flash中加载程序,必须要把文件编译链接得到的.ldr文件写入到 Flash存储器中,然后对M25P16进行擦除,写数据等操作,注意在擦除M25P16之后,写使能被自动禁止,因此,在继续写数据之前,必须重新设置存储器的状态寄存器。
DSP上电或复位后,处理器就会在BOOT ROM中执行自举引导程序,本文设置的是SPI主机模式引导,程序转入到SPI引导程序的入口,通过SPI口向Flash发送读命令,读取标志位,然后引导数据块的传递,完成整个 SPI引导过程。当程序指针跳转到0xFFA00000就可以执行引导进来的用户程序了。引导过程的流程图如图3所示。
图3 BF533 SPI引导流程图
在整个引导过程中,M25P16作为从机,ADSPBF533作为主机。从M25P16的读写时序图可以看出,当BF533上电或者复位后,M25P16的片选信号从高电平变为低电平,选通该芯片。BF533通过给SPI口的发送缓冲寄存器SPI_TDBR发送READ指令来激活传输,从M25P16的指令时序图和SI引脚时序可以看出,之后发送的是16 bit的地址,以确定从M25P16的那个地址开始读数据。这时,M25P16将从起始地址未开始的存储空间读数据到SO口上,经过BF533的MISO引脚传输到接收缓冲寄存器SPI_RDBR中,当接收缓冲器满时,DMA将自动地从其中读取数据,完成数据的传输和引导。
要顺利实现程序加载还要在Visual DSP++环境里对程序进行相应的设置,将文件类型改为Loader file,同时在Load选项里将加载模式选择为SPI Flash,文件格式选择Hex格式,数据宽度选择8 bit,另外还要在工程选项的Load选项中的Initialization里添加一个系统的初始化程序[3],具体程序的编写参考BF533的硬件手册。设置完成后经过编译就会生成加载需要的ldr文件。图4给出了程序加载的流程图。
图4 BF533程序加载流程
当系统的硬件和软件设计完成后,就要利用已经设计好的硬件平台将相应的软件加载程序进行正确的设置,然后,下载到Flash中,再利用引导程序往BF533中加载,这样DSP每次上电复位或手动复位后,程序就会自动加载进来,实现程序的自启动[4-5]。
具体的实现过程为:首先在Visual DSP++里打开Programmer,先将引导程序下载到Flash中,如图5所示,点击Load Driver加载引导程序,如果成功的话就会返回正确的设备信息,即制造商0x20,设备0x15等,右面的信息栏中也会出现加载成功的信息。另外,右面区域会显示M25P16的所有存储区,每段存储区都是未知状态,在加载程序之前首先要对M25P16进行擦除操作。
图5 BF533加载引导程序
加载引导程序成功后即开始加载用户程序,点击Programming,就会出现加载用户程序的界面,如图6所示,选择擦除方式,一般选择Erase affected,因为一般的程序很小,占用的空间较小,不必将Flash全部擦除,接着选择文件的格式为Hex即可。然后将编译生成的ldr文件添加进来,即可进行加载。右面对应的是Flash存储块占用情况和程序加载的信息,如果成功就会显示Success,出错时话也会出现相应的错误信息。
另外需要注意几个问题:一是在对M25P16编程时,需要注意一次写入的数据量大小,这是由存储区每块的容量决定的,当一次写入的数据量超过该容量时就会导致数据覆盖,从而导致系统错误。二是在对Flash芯片进行擦除或者写入操作时,在操作完成后必须读取该芯片的状态寄存器,根据状态寄存器中某些状态位判断操作是否完成。
图6 BF533加载用用户程序
加载完成后,将软件关闭重启系统,或者手动复位DSP,即可观察到程序所预期的结果,这说明加载成功,每次上电或复位时用户程序可以被自动执行,实现由外部SPI Flash的准确加载。
介绍了一种基于SPI Flash的BF53x系列DSP的程序加载方法,即以BF533为例用M25P16实现对它的SPI串行加载,该方法具有灵活性高,节约板级资源的优点,具有较强的实用性。
[1]Analog Devices Inc.Blackfin@embedded processor ADSP -BF533[M].USA:Analog Devices Inc,2006.
[2]ST Microelectronics.M25P16_www.ic37.com[M].USA:STMicro-electronics group of compa-nies,2004.
[3]Analog Devices Inc.Running programs from Flash on ADSP-BF533 blackfin processors[M].USA:Analog Devices Inc,2006.
[4]廖柏林,王星胜,林坤,等.基于DSP正弦信号发生器设计[J].电子科技,2011,24(2):21 -23,29.
[5]吴进.一种基于总线令牌的多DSP并行信号处理系统[J].西安邮电学院学报,2009(1):125 -127,141.