TMS320C6455入门实践(八)——Flash驱动与程序固化

本文主要介绍Flash驱动、C6455的EMIF接口与程序固化,参考文档为:

Flash 驱动

  Flash的驱动程序肯定要根据具体的Flash型号来写(废话),但大体上应该都差不多。我们用的是Cypress的Flash S29JL064J,目前Cypress已经被infineon收购。
  这是一款总容量64Mbit的Flash,数据位宽可以配置为8bit或者16bit,C6455要求从EMIF启动时,存储器的数据位宽为8bit。Flash的引脚排布、电气特性等只和电路设计时有关。写驱动程序只要关注它的一些操作命令就好了。主要内容都集中在Datasheet的第十章和第十一章。

Flash 命令

cmd

第十章末尾有这样一张表,总结了不同指令的发送方式。有一些地方需要注意一下。

  • Reset指令是往任意地址写0xF0,这个在退出Auto Select模式,或者清除命令超时错误(DQ5)时需要用到。
  • 在Auto Select模式下可以读取Flash的生产厂商ID、DeviceID。需要先往指定的地址写入指定的数据,然后才能在相应的位置读到这些信息。就是如果刚写完就立刻读好像读不到正确的数据,需要稍微等一会儿才行。我在程序中没有另外加延时,而是在往对应地址依次写入0xAA、0x55、0x90后,连续在(BA)X00地址读了两遍,第二次读到的才是当作真正的生产厂商ID,后面再去读DeviceID就没有这样的问题了。
  • Secured Silicon Region是一块独立于Flash本身存储空间的一块区域,可以用于存放Electronic Serial Number(ESN),用于永久地唯一识别这一器件。我们基本用不到。
  • 基本的Program指令比较麻烦,要写一个字节就需要写四次。用Unlock Bypass的模式就可以将写一个字节缩短到写两次。开启Unlock Bypass后如果写完了要用Unlock Bypass Reset来退出这种模式。
  • Erase的指令有两种,一种是整块芯片都擦除,一种是只擦除一个Sector。Flash想要重新编程就要先擦除,擦除是把整块区域都写“1”的过程,往Flash写入只能把“1”改成“0”,而不能把“0”改成“1”。Flash的擦除需要一定时间,编程中需要采用一定方式对擦除结果进行确认,S29JL064J的写入与擦除所需时间如下表所示:
    flashtime
      在擦除单个Sector时,注意Sector的划分,S29JL064J的部分Sector是8k字节的,而其他大部分是64k字节的。
  • 最后还有Erase Suspend和Erase Resume的功能,就是暂停擦除和继续擦除;CFI Query也用的不多,大家感兴趣可以自行查阅。

状态检测

  Flash Datasheet的第十一章就是介绍如何确定当前Flash的状态。

  • DQ7可以用来查询是否写入或者擦除完成。如果我知道某个地址存的数据应该是什么,然后我就去读那个地址,如果读到的数据的第7位(DQ7)和实际数据不符,那就说明写入或者擦除还未完成,这个就常用在数据写入的时候。
  • DQ2和DQ6主要用来指示Flash的擦除状态。这两位都会有一个“翻转”的机制。如果Flash正在擦除某一块Sector,那么连续两次读其中的一个地址上的数据,两次读到的数据总这两位是不一样的。而如果一块Sector处于暂停擦除的状态,那么连续两次读到的数据中,DQ2是会变化的,但DQ6不会变化。
  • DQ5也很重要,它指示写入或者擦除超时。如果DQ5变为“1”,就要用Reset命令复位。

EMIF

  EMIF的异步存储器接口在SPRU971E的第四章有详细的介绍。EMIF每一个CE都对应有一个配置寄存器CEnCFG,如果是异步接口还有一个异步等待周期配置寄存器需要关注,所以在配置上是非常简单的,关键是参数怎样设置。

读时序

emifrd

  上图是EMIF的异步读时序,分为Setup、Strobe和Hold三个阶段,在AOE的上升沿对数据进行采样。我们需要根据Flash的时序要求明确这三个阶段需要设置为几个时钟周期。
  EMIF的时钟是主频的1/3,我们没有有PLL1进行配置,因此主频是外部晶振的频率50MHz,周期20ns,所以EMIF时钟的周期为60ns。

flash

  再看Flash的时序图,主要信息是,在OE或者CE有效后,最多70ns,输出数据就有效了(我们的芯片速度等级是70)。所以我们可以把EMIF的Setup设置成2个EMIF的时钟周期,也就是120ns,那时候Flash的数据肯定有效了。
  Strobe的时间没有什么特殊的要求。
  Hold的时间留一个周期肯定也够了。对于Flash来说,如果地址撤销,那么输出信号就无效了。设置一个周期的Hold,也就是CE和地址都会在OE无效(变高)之后再保持60ns,这段时间内数据都是稳定的,基本能保证采到正确的数据。

写时序

write

  关于Flash的写时序也是类似的,这时候数据在WE的下降沿被采样写入FLASH,S29JL064J对数据的建立时间要求并不高,但要求的保持时间最大为40ns,也就是为了稳妥起见,在WE下降沿之后再让数据至少稳定保持40ns。

CSL的使用

  EMIF的使能是在PERCFG1寄存器中,这个寄存器不需要Unlock就可以改写。
  同样,CSL_emifaInit()没有实际作用。CSL_emifaOpen()获取EMIF配置寄存器的基地址。最后调用CSL_emifaHwSetup(),利用相关的结构体完成配置即可。

其他

  • 文章(六)中提到的那个“.lst”文件,可以用来查看汇编后的机器码,可以将那里面的机器码和hex文件或者code.h文件进行比对,生成的code.h文件是否正确。如果固化不成功,建议先检查Flash读写访问是否能够正常进行;再对Boot Table和bootloader进行检查。
  • 相关工程文件下载链接
  • 后续计划实现从Flash启动程序并加载到DDR2上运行……
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小裘HUST

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值