T EC HNOL O GY R EV IEW 技术纵横
paper @mesnet. com. cn (投稿专用)
2010 年第 6 期
Microcontrollers & Embedded Systems25
DSP 外部 Flash 存储器在线编程的软硬件设计
夏爽
(国营第722厂,桂林541001)
摘要
:
详细介绍DSP
与Flash
存储器的两种硬件接口方式及在线编程,
分析了两种硬件接口方式下在线编程的区别,
给出了相应的在线编程核心代码并在实际电路上测试通过
,
可作为DSP
嵌入式系统设计的参考 。 关键词:
在线编程; Flash
存储器;
硬件握手;
软件握手中图分类号
: TP368 . 2
文献标识码: B
Software and Hardware De sign of DSP Ext ernal Fla sh Me mory Online Pro gramming
Xia Shuang
( The State2run 722 Factory , Guilin 541001 , China)
Abstract : This article int roduces two hardware interfaces and o nline p rogramming of DSP and Flash memo ry. Differences between t he p rocesses of o nline p rogramming based o n t he two hardware interfaces respectively are analyzed , and co rresponding co re code of online p rogramming are p resented. The code is tested o ut in act ual circuit ry. The article can be used as reference for DSP embedded system de2 sign.
Key words : online p rogramming ; Flash memory ; hardware handshake ; sof tware handshake
引 言
随着嵌入式系统向体积更小 、性能更高的方向发展
,
传统的DIP (
双列直插)
集成电路因体积庞大 、元器件I/ O
引脚数量受封装限制等缺陷,
已逐渐淡出人们的视线 。在 嵌入式产品设计中,
大量采用SM T
贴片元器件,
既提高 了性能,
又节省了宝贵的空间 。由于采用贴片元器件,
无法将
Flash
存储器等元器件从电路板上取下来单独进行编程 。专用编程器的方式已经很少采用
,
取而代之的是采 用基于仿真器连接的J TA G
接口的在线编程方式 。这种 在系统带电编程的方式不受时间和空间的限制,
随时随地 都可进行,
且产品软件版本升级容易 。在嵌入式系统中
,
为了实现程序的脱机自动运行,
程 序往往固化在电可擦除的Flash
存储器中 。要实现一个 嵌入式系统的带电脱机运行,
在线编程就成为嵌入式系统 开发过程的必经之路 。由于在线编程涉及到硬件和软件 方面的内容,
因此要从顶层设计和系统的角度来考虑在线 编程 。硬件设计要为软件设计作铺垫,
尽可能简化软件 设计 。本文 以
TI
公 司 的DSP
芯 片TMS320C6711D
和AMD
公司的4 Mb Flash
存储器AM29L V400B
为例来介 绍两种在线编程方式 。1 DSP 与 Flash 存储器的两种硬件连接关系
1. 1 以 Re ady 信号作为硬件握手
带有
Ready
信号的TMS320C6711D
的EMIF ( Exter
2nal Memory Interface)
接口与Flash
存储器AM29L V400B
的硬件连接[ 2 ]如图1
所示 。由于AM29L V400B
输出的就 绪信号/
忙信号( R Y/ B Y)
为OD (
漏极开路)
输出[ 1 ],
需要 在该信号上加上拉电阻并连接到VCC
。图1 带有Ready信号的TMS320C6711D与 AM29L V400 B的硬件连接
1. 2 采用无 Re a dy 硬件连接的软件握手
不带
Ready
信号的TMS320C6711D
与Flash
存储器AM29L V400B
的硬件连接[ 2 ]如图2
所示 。技术纵横 T EC HNOL O GY R EV IEW
26 2010 年第 6 期
adv @mesnet. com. cn (广告专用)图2 不带Ready信号的TMS320C6711D与 AM29L V400 B的硬件连接
2 软件设计
2. 1 带有硬件握手的软件设计
带有
Ready
信号连接的Flash
存储器编程时序如图3
所示 。
Flash
的就绪信号/
忙信号( R Y/ B Y)
输出为低电平 时,
表明Flash
正忙,
处于编程或擦除状态 。由于DSP
与Flash
存储器采用Ready/ Busy
信号作为硬件握手信号,
当Ready/ Busy
信号为低电平时, CPU
在总线时序上插入等待周 期
,
直 到Ready/ Busy
信 号 解 除(
为 高 电 平)
。在Ready
信号为低电平期间,
由于CPU
处于等待状态,
程序被暂停执行
,
因此不需要通过软件来判断Flash
存储器的 编程或擦除状态 。图3 带有Ready信号连接的Flash存储器编程时序
Flash
擦除函数如下:
/ 3erase_flash :擦除Flash存储器AM29LV400B (512×8位) 3/
/ 3flash_pt r : Flash存储器地址指针 3/
void erase_flash (int 3 flash_pt r) {
/ 3EM IF设置为32位读写方式,控制地址左移2位,以便
控制地址对应EM IF端口的EA [ 19∶2 ]3/
unsigned int 3 ct rl_addr1 = ( unsigned int 3) ( (int) flash_
pt r + (0x555 < < 2) ) ;
unsigned int 3 ct rl_addr2 = ( unsigned int 3) ( (int) flash_
pt r + (0x2aa < < 2) ) ; 3ct rl_addr1 = 0x00aa ; 3ct rl_addr2 = 0x0055 ;
3ct rl_addr1 = 0x0080 ; 3ct rl_addr1 = 0x00aa ; 3ct rl_addr2 = 0x0055 ; 3ct rl_addr1 = 0x0010 ; }
Flash
编程函数如下:
/ 3 p rogram_flash :编程Flash存储器AM29L V400B 3/
/ 3 flash_pt r : Flash存储器地址指针 3/
/ 3 source_pt r :待编程的数据地址指针 3/
/ 3 lengt h :数据长度 3/
void p rogram_flash ( unsigned int 3 so urce_pt r , unsigned int 3 flash_pt r , int lengt h) {
int i ;
/ 3EM IF设置为32位读写方式,控制地址左移2位,以便
控制地址对应EM IF端口的EA [ 19∶2 ]3/
unsigned int 3ct rl_addr1 = ( unsigned int 3) ( (int) flash_
pt r + (0x555 < < 2) ) ;
unsigned int 3ct rl_addr2 = ( unsigned int 3) ( (int) flash_
pt r + (0x2aa < < 2) ) ;
fo r (i = 0 ; i < lengt h ; i + + ) { / /写控制命令序列
3ct rl_addr1 = 0x00aa ; 3ct rl_addr2 = 0x0055 ; 3ct rl_addr1 = 0x00a0 ;
/ /向Flash存储器写入(烧写)数据 3flash_pt r + + = 3so urce_pt r + + ; }
}
2. 2 带有软件握手的软件设计
Flash
的就绪信号/
忙信号( R Y/ B Y)
输出为低电平 时,
表明Flash
正忙,
处于编程或擦除状态,
此时写入或读 出的数据是无效的,
不是程序员需要的数据;
当该信号输 出为高电平时,
表明Flash
已处于就绪状态,
可对其进行 写入或读出数据的操作 。由于
DSP
与Flash
存储器的接口采用软件握手,
在对Flash
存储器进行编程或擦除时,DSP
的总线周期中不会由硬件自动插入等待周期
,
如果此时仍采用2 . 1
节 的Flash
编程函数对Flash
存储器进行编程,
则会得到错误的编程结果 。编程结束后会发现
Flash
存储器中有一部 分内 容 仍 然 是0xFFFF ,
处 于 编 程 前 的 状 态 。虽 然 对Flash
存储器进行了编程操作,
但由于Flash
存储器上一次编程操作还未完成
,
本次的编程操作无效,
数据根本写 不进Flash
存储器 。在CCS3 . 1
中用“View/ Memery
”功能查看
Flash
存储器,
就会发现Flash
存储器中的数据等间T EC HNOL O GY R EV IEW 技术纵横
paper @mesnet. com. cn (投稿专用)
2010 年第 6 期
Microcontrollers & Embedded Systems27
隔地出现编程正确和编程不正确的现象 。笔者在自己设 计 的
TMS320C6711D
2250
嵌 入 式 模 块(
带 有AM29L V400B Flash
存储器)
上,
通过断开DSP
与Flash
存储器的硬件Ready
信号进行编程测试,
无等待状态的测 试结果见表1 ,
有等待状态的测试结果见表2
。表1 无等待状态的测试结果(部分地址未烧写进去) 地 址 32位数据 32位数据 32位数据 32位数据 0x90000000 0x00000029 0x0000 FFFF 0x00003C2A 0x0000 FFFF 0x90000010 0x0000C069 0x0000 FFFF 0x0000006A 0x0000 FFFF 0x90000020 0x00000276 0x0000 FFFF 0x00000429 0x0000 FFFF 0x90000030 0x000099AB 0x0000 FFFF 0x00000000 0x0000 FFFF 0x90000040 0x0000C069 0x0000 FFFF 0x0000 FFEA 0x0000 FFFF
表2 有等待状态的测试结果(正确)
地 址 32位数据 32位数据 32位数据 32位数据 0x90000000 0x00000029 0x00000200 0x00003C2A 0x00000218 0x90000010 0x0000C069 0x00000200 0x0000006A 0x00000200 0x90000020 0x00000276 0x00000210 0x00000429 0x00000200 0x90000030 0x000099AB 0x0000027 F 0x00000000 0x00000000 0x90000040 0x0000C069 0x00000200 0x0000 FFEA 0x0000027 F
可见
,
在没有硬件握手的情况下,
需要通过软件来判断当前
Flash
存储器编程或擦除的状态来进行编程操作 。如果
Flash
存储器正处于编程或擦除过程中,
则无法继续对
Flash
存储器进行编程,
需等到Flash
存储器上一次数据编程
(
写入)
完成时才能进行下一次数据编程(
写入)
。 否则,
会得到错误的编程结果,
造成编程后数据校验失败 。大多数
Flash
存储器都提供了一个或几个状态位来表示当前
Flash
存储器编程或擦除的状态,
大多支持通过其数据总线
D7
数据位的状态来判断Flash
存储器当前编程 或擦除的状态。这是大多数Flash
存储器数据手册推荐的 编程轮询算法,
但经过笔者测试,
这种算法比较繁琐,
会造 成部分编程内容不正确,
可采用将编程数据读出、与写入数 据进行比较的简单方法,
实现软件等待状态的插入。说明
: TMS320C6711D
与AM29L V400B Flash
存储 器采用16
位数据连接,DSP EMIF CE1
存储器空间初始 化为32
位总线宽度( CE1
端口连接16
位Flash
存储器) ,
读取/
写入Flash
存储器的32
位数据中高16
位无效 。带有软握手的
Flash
存储器编程函数如下:
/ 3 p rogram_flash :编程AM29L V400B Flash存储器 3/
/ 3 flash_pt r : Flash存储器地址指针 3/
/ 3 source_pt r :待编程的数据地址指针 3/
/ 3 lengt h :数据长度 3/
void p rogram_flash ( unsigned int 3 so urce_pt r , unsigned int 3 flash_pt r , int lengt h) {
int i ;
unsigned int u Temp ,timeo ut ;
/ 3EM IF设置为32位读写方式,控制地址左移2位,以便
控制地址对应EM IF端口的EA [ 19∶2 ]3/
unsigned int 3ct rl_addr1 = ( unsigned int 3) ( (int) flash_
pt r + (0x555 < < 2) ) ;
unsigned int 3ct rl_addr2 = ( unsigned int 3) ( (int) flash_
pt r + (0x2aa < < 2) ) ;
fo r (i = 0 ; i < lengt h ; i + + ) { / /写控制命令序列
3ct rl_addr1 = 0x00aa ; 3ct rl_addr2 = 0x0055 ; 3ct rl_addr1 = 0x00a0 ;
/ /向Flash存储器写入(烧写)数据 3flash_pt r = 3source_pt r ; / /插入等待状态,等待烧写完成 u Temp = 3flash_pt r ; timeo ut = 0 ;
do {timeo ut + = 1 ;
}while (3flash_pt r ! = u Temp & & timeo ut < 0xffff) ; / /地址指针加1
flash_pt r + + ; so urce_pt r + + ; }
}
3 两种在线编程方式的区别
在硬件上加入硬件握手的
Flash
存储器在线编程方式设 计简单,
在应用中只须考虑擦除和编程,
而无须考虑Flash
存 储器的当前状态。当Flash
存储器正处于擦除和编程状态而未完成时
, Flash
存储器产生的忙信号通过Flash
存储器与DSP
之间的硬件连接直接送入DSP ,
由DSP
硬件在其总线访 问周期中自动插入等待周期,
暂停DSP
处理器的执行;
当Flash
擦除和编程状态完成时,
由Flash
存储器产生的就绪信号通过
Flash
存储器与DSP
之间的直接硬件连接将就绪信号送入
DSP ,
解除DSP
的等待状态,
继续程序的执行。而采用软件握手的
Flash
在线编程方式需要程序员在软件中判断Flash
存储器的当前状态。只有当Flash
存储器擦除过程完成时
,
才能对其进行编程;
当Flash
存储器的一次编程(
数据 写入)
过程完成时,
才能进行下一次的编程(
数据写入)
。软 件设计繁琐,
且要经过多次调试。参考文献
[ 1 ] Advanced Micro Devices. AM29L V400B Data Sheet , 2000211.
[ 2 ] Texas Inst rument s. TMS320C6000 EM IF to External Flash Memory , 2002202.
(收稿日期:2010201225)