1. 注意Nor Flash的 数据宽度。例如,8-bit, 16-bit等。
它们会在program,erase,read id过程中,产生小小的confusing,
比较好的方式,个人以为,可以定义一个Macro,如
Addr(base, cmd) (*(data_width *)(base + ( cmd <<(data_width/8 - 1) ) ) ),
其中 base 即为当前Flash 片选的基地址,cmd,就是Nor Flash手册中定义的Address cycle的内容
对于这个宏的引用,比如
Addr(0xFF800000, CMD_READ_ID_ADDR1) = CMD_READ_ID_DATA1; 第一个cycle的 地址 和数据
2. 要注意Nor Flash的 数据宽度,会在 PCB 的 layout 有些体现,也就是DQ线的连接,而这个问题在对Nor Flash进行 非word对齐的 word program中,要多加注意
后来和硬件的同事确认了一下,有时硬件为了PCB 总线的方便,可能会将数据线做些调整。
比如,nor flash 的数据线是 DQ0-DQ15,而从GPCM 连过来的数据线做了一个颠倒
Nor Flash的 DQ0-DQ7 连接 GPCM的DQ8-DQ15
而Nor Flash的DQ8-DQ15 连接 GPCM的 DQ0-DQ7
3. sector erase 中, 注意最后一个 操作cycle中的 addr部分,其用来表示要擦除的 sector
诸如, *(U16 *)(base + sec_num << 11) = CMD_SECTOR_ERASE_DATA6;
其中的sec_num来源于 地址总线上的 11-21 bit,具体应该查阅相关的 nor flash 数据手册的定义,在 command sequence的下脚处通常都会指明的
4. block erase中,要擦出的block 来自于地址线上的A21-A15,利用掩码获取到这些位,右移 15位 就得出block number了。