一般嵌入式系统使用的程序存储器都是NOR,也有部分系统使用NAND,需要额外的驱动。对于NOR首先要明确自己系统为ADMUX(地址和数据部分复用)还是一般的并行FLASH(数据和地址分开),这两种型号在连接上区别还是比较大的。
对于并行的FLASH相对比较简单,只有地址线、数据线、/WR、/RD、/CS,以及低位控制和一些锁存,我们只要配好/CS的等待周期,一般都没有什么问题。
对于ADMUX的操作时序比较复杂,有2种工作模式:异步和burst,一般复位初始化的时候FLASH默认工作在异步模式,后续可以配置成burst模式。相对于异步模式,burst可以实现对地址的连续访问,在FLASH内部实现地址的累加,所以速度快很多,但配置也比较复杂。
另外有一些共同之处系统设计的时候同样需要考虑:
1)首先必须要明确BLOCK和BANK的分配情况,不同型号FLASH的BLOCK大小是不一样的,FALASH的datasheet一般按照word描述的,比如32K对应64KBbyte,64K对应128KByte,在FLASH的开始或者结束一般会保留一些容量小的block,比如16KByte。系统设计的时候同样注意,特别是文件系统设计的时候,不小心把大BLOCK和小BLOCK一起使用,很容易引起异常复位,原因是你不小心以为大小都一样。
2)要注意FLASH的Single bank和mulit bank,驱动是不同的,区别可以简单解释如下,对于multi bank可以同时对一个bank擦写,且对另外一个bank进行取指,可以提高系统的效率,single bank则不能进行这样操作,必须老实的等每个操作完成,才能进行下一个bank的操作。而就是mulit bank的这样一个优化,对于新手可能会陷入无助的复位问题解决,假如文件系统划分不合理,代码区和文件划分到同一个bank,那么可能就会出现同一个bank正在擦写,而又要在这个bank取指,结果就是取指异常,引起系统未定义指令终止。所以系统设计的时候一定不要把代码区和文件系统划分到同一个bank,single bank的FALSH可以除外,或者对于mulit bank的FALSH你也使用single bank的驱动。
3)有些FLASH和单片机A0在硬件上是不引出的,所以输出FLASH指令操作序列的时候要特别小心,进行一下移位。
4)不同厂家的指令可能不同。
5)假如系统要兼容不同厂家的FLASH,需要在开机读取ID来选择Driver。
一些基础知识可以在Google上查询,这里不进行名词解释了,另外更深入的这里也不好描述
阅读(1461) | 评论(0) | 转发(0) |