基于串口实现DSP程序的在线编程
摘要:目前DSP处理器普遍使用Flash作为其程序代码存储器,通过DSP的JTAG仿真接口对Flash存储器进行编程实现代码的更新,这给DSP系统的软件维护和升级造成了很大的困难。本文提出基于DSP设备的串口实现DSP程序在线编程的方法,使DSP代码的更新可以脱离仿真器,改善了DSP设备的易用性、可维护性,增强了DSP系统的技术生命力。
1 引言 随着微电子技术的飞速发展,通用数字信号处理器(DSP)的性价比不断提高,在数字信号处理、通信、控制等领域运用的越来越广泛。在以前的DSP 系统中,大部分使用EPROM、E2PROM 等存储器来存放程序代码。由于这类存储器的编程条件比较苛刻,需要将芯片取下后使用专用的编程器来编程,给系统的升级、尤其是比较复杂、不易拆装的系统的升级带来了一定难度。非易失性存储器Flash 由于不需要复杂的编程环境、可以直接使用板上MCU 进行编程,同时还具有容量大、速度快、功耗低的特点,已经广泛应用于DSP、嵌入式系统和其它可编程系统中,提高了DSP 的在线编程能力。
DSP 在线编程是指不更改目标系统硬件的情况下,实现系统功能的更新。传统实现DSP 在线编程的方法是:通过JTAG(或MPSD)接口下载Flash 写入程序和代码数据到DSP 片内运行,实现对Flash 的编程。它由于具有下载速度快、无需添加额外接口设备等优点,被DSP 开发者广泛采用。虽然传统方法实现起来比较简单,但也存在很多的局限性: (1) JTAG(或MPSD)接口不能满足远距离传输要求,难以实现远端系统的在线编程; (2) 不能在高、低温等复杂环境下工作; (3) 由于要连接仿真器进行程序下载,常常需要打开设备外壳; (4) 接口信号太多,难以在掌上PDA 等小体积设备中应用。 针对上述问题,提出基于DSP 设备串口实现DSP 程序在线编程的方法,并从总体角度介绍了系统硬件、软件实现方案,本方案已经成功应用于多个项目,具有较好的指导意义。
2 实现原理
通过深入研究DSP 的上电引导机制,预先编写一个核程序 Kernel,使用DSP 仿真器通过JTAG 接口对F1ash 芯片植入该核程序,此过程每个设备一次。Kernel 是一个可以完成与计算机通讯、F1ash 编程操作和DSP 用户代码加载的内核,每次上电或重启后,DSP 依靠其自举功能从Flash 中加载Kernel 程序到DSP 内部开始运行,此后 DSP 被Kernel 核程序接管,在设定的时间内Kernel 程序监视串口通讯数据,如果检测到Flash 编程请求,则开始接收用户代码并缓存到DSP 片内,在用户代码全部正确接收后,启动Flash 编程指令将代码编程到Flash 中。如果在设定的时间内没有检测到Flash 编程请求,则Kernel 程序负责搬移Flash 中已有的DSP 用户代码到DSP 内部的程序RAM 中开始运行,此后DSP 完全由用户程序控制。在本文中, DSP用户代码(程序)指DSP 开发人员编写的、控制DSP 设备完成特定处理功能的、经过编译以后形成的二进制代码。 DSP 开发人员完成程序编写并调试通过形成DSP 用户代码后,连通DSP 设备和计算机之间的串口,运行计算机的在线编程软件,发出Flash 编程请求给DSP,同时给DSP 上电或重启使DSP 处在被Kernel 核程序接管的状态,在DSP 返回确认指令表示准备就绪后,在线编程软件就可以通过串口通讯把DSP 用户代码发送给DSP,实现用户代码的在线编程。在设计中,Kernel 程序与用户程序在F1ash 里分开存储。F1ash 中的Kernel 程序设置为写保护,不能随便擦除,所以在操作过程中遇到突然掉电或误操作引起的擦除、写入不成功也不会影响程序的再次更新。
3 实施方式
3.1 硬件实现 美国德州仪器公司(TI)TMS320C6416 DSP 不仅具有强大的处理内核,能够完成各种复杂的数据处理任务,同时片内硬件资源充足,可以作为设备通用的微处理器来使用。S29AL004D是SPANSION 公司生产的CMOS 单电压供电F1ash 存储器,具有低功耗、大容量、擦写速度快等特点,内部嵌入ISP(In System Program)功能,支持在线的实时擦除和再编程操作[3]。通过TMS320C6416 与S29AL004D 的配接,为在线编程系统提供一个通用硬件操作平台。ST16C752是一款串口芯片,完成数据的串并转换,通过DSP 提供的EMIF 接口实现与DSP 无缝数据交换。 在此设计中,计算机采用RS232 串口标准,通过MAX232实现电平格式转换送往ST16C752,ST16C752 实现串并数据转换(UART)和产生串口收发中断。通过CPLD 完成译码选通,实现ST16C752 和S29AL004D 与DSP 的连接,其硬件连接方式如图1 所示。本硬件实现方案只是为了说明原理而采用的一个硬件平台,本文提出的设计思想可以在符合以下条件的硬件平台中得以应用:一、DSP 与计算机之间可以完成数据通讯(包括网络通讯); 二、DSP 可以通过特定指令完成对Flash 的编程。
图1 硬件连接框图
3.2 Flash 编程操作
S29AL004D 的命令集与JEDEC 单电压供电Flash 标准完全兼容,DSP 可以使用满足特定时序要求的写操作将Flash 操作命令写入其命令寄存器中,由内部状态机根据命令寄存器中的命令完成对Flash 的擦除和编程电路的控制,实现Flash 的读写、扇区保护等操作。由于编程指令不能使Flash 中的数据位从“0”变为“1”,只能从“1”变为“0”,而擦除命令可使“0”变为“1”,所以正确顺序是先擦除后编程。
3.3 软件实现
3.3.1 串行通信协议
DSP 用户代码一般都有上百K 字节,由于串口通讯容易受到干扰,一次性传递这么大量的数据容易造成误码,为保证传输可靠性,本文对DSP 用户代码采取了分包处理,把DSP 用户代码分成若干个大小相等的数据包,然后在每个包中加入帧头、帧尾和校验码形成完整的一帧数据,DSP 和计算机之间的通讯以帧方式进行。计算机与DSP 之间的串行通信波特率设置为较小值57600kbps,数据格式为:1 个起始位,8 个数据位,1 个停止位。计算机端主动发起连接,在发出一帧数据后开始计时,若在两秒内没有收到DSP 的正确响应,则重发当前帧,DSP 端被动地接收计算机发出的数据,在收到正确的一帧数据,则根据协议(文中由于篇幅关系未给出)做出相应的响应,如果收到的数据是错误的,DSP 不做任何操作。协议中包含随机码字段,计算机端每次发起连接时使用的随机码是不同的,以此来保证DSP 和计算机之间的通信是针对当前连接的。校验码是用除帧头、帧尾以外的数据通过某种计算方法生成的用来验证本帧数据在传输过程中是否发生差错的校验机制,本文采取了对每个字节求和的方式来生成校验码,这种方法实现简单、计算量小,并且在实际使用过程中确实满足了校验要求。以 7E、7F 分别作为每帧的帧头、帧尾标记,为了保证每一帧的其余字节中不出现7E、7F,对所有出现的7E、7F 字节采用替换算法,对7E 用7D5E 两字节代替,对7F 用7D5F 代替,对7D 用7D5D 代替。DSP 端在接收到一帧完整的数据后,先对数据进行反向替换,再对替换后的数据进行校验,通过校验后根据命令字做出相应的响应,如果没有通过校验,则抛弃该帧数据 。
3.3.2 在线编程应用软件设计 在线编程应用软件由编程文件载入模块、串口配置模块、控制管理模块组成,属于计算机端应用程序。编程文件载入模块完成编程文件的装载,根据DSP 用户代码大小实现分包、生成校验码、特殊字节替换和装帧处理;串口配置模块用于配置串口通讯端口和速率;控制管理模块主要实现在线编程时与DSP 的交互和发送数据帧等功能。
3.3.3 Kernel 软件设计 Kernel 软件主要由编程文件接收模块、差错校验模块、Flash 写入模块、Flash 擦除模块、完整性效验模块、二次加载模块和控制模块等组成。编程文件接收模块负责接收来自串口的编程文件,经差错校验模块校验无误后,把收到的字节缓存到已分配的内存中,并对在线编程应用软件发出应答信号;如果差错校验没有通过,则不做任何应答等待在线编程应用软件重发数据包。Flash 擦除、写入模块对Flash 实施在线编程的具体操作,在整个编程文件接收完毕后,启用Flash 擦除、写入模块完成Flash 的在线写入,写入完成后,由完整性校验模块对Flash 编程的正确性进行检查,把编程前数据的校验和和编程后从Flash 中读出数据的校验和进行比较,确认编程是否成功。二次加载模块负责引导DSP用户程序的执行。控制模块是Kernel 程序的调度者,在设定的时间内监视Flash 编程请求,如果收到Flash 编程请求,则控制DSP 工作在Kernel 核程序接管状态,如果没有收到,启用二次加载模块导入用户程序开始执行。
4 结论 论文提出了一种新的基于串口的DSP 在线编程的解决方法,并应用到实际的项目中,使DSP 代码的固化可以脱离仿真器,避免了代码固化过程中插拔仿真器及拆卸DSP 设备引起的损坏,使没有DSP 开发经验的人员也能够完成DSP 代码的固化。实践表明:这种编程方法可操作性好,在设备的功能扩展、售后维护等方面发挥了较大的作用,提高了设备的技术生命力,值得推广和借鉴。
|