记spi nor flash的调试心得
flash 调试心得前言调试目的调试步骤检查驱动flash操作改写复位访问模式tips内核下相关文件系统nor和nand的区别前言在工作中或者在开发板上或多或少都会遇到norflash现如今spi接口的也是运用的非常广泛。今天我们就来聊一聊在嵌入式设备上调试flash的一些心得。调试目的一般flash在嵌入式平台上运用是用于uboot、内核文件系统以及数据分区的存储。所以在调试flash只需要达到可读可写可擦除那么一般就说调试OK了我们一般在uboot下调试flash因为一般平台上可以通过其他方式比如网络串口等方式直接下载uboot到ddr中运行从而进一步调试flash况且在uboot下调试命令也比较全。调试步骤在调试前一些准备工作先行。flash的数据手册准备好平台这边数据手册预备好假如已在uboot下已经适配的话驱动部分应该OK可不需要准备。确保硬件通路OK。检查拿到pcb查看flash所在位置观察表面是否有明显磕掉的店电阻电容以及flash管脚是否有明显虚焊。驱动uboot读写norflash使用sf命令假如你的uboot已经适配了flash控制器驱动那么可以加打印或者修改sf读取flashid试试。一般假如flash控制器驱动已经适配那么读id是可以读出来的。没有的话先适配uboot的flash控制器驱动。flash控制器驱动是用于产生flash访问操作的spi波形。驱动适配好了后一般访问spi波形就有了可以对比数据手册是否符合要求的波形。纵览几家flash的厂家他们的寄存器都很相似一些特定功能的寄存器地址都是一样的比如软复位寄存器、flash id获取寄存器、状态寄存器等。一般flash 的id寄存器的9f flash返回3个字节描述flash信息。注意spi访问模式。flash操作一般可以读到flash id 说明flashOK硬件通路也一般OK但是这时候还是不能操作比如写或者擦除。那么接下来几个注意点要说明下。改写可以修改uboot的sf命令让他可以直接读写flash的寄存器而不仅仅支持读写flash的内容数据。一劳永逸的活。复位有些flash上电后不能直接操作flash写flash但是可以读flash寄存器以及读flash的内容。之前遇到MACRONIX的flash就出现过这样的现象。通过设置寄存器软复位就可以进行擦除和写入了。操作步骤各大flash 都类似使能rst 0x66 ,软复位0x99访问模式flash为了提高速度提供了各种模式。如图flash的管脚spi除了标准的cs clk spi的数据管脚为双向而且有4根线。我们为了快速写入数据到flash采用这个32寄存器进行写入写操作选择不同的寄存器表现的模式不同。假如编程用0x32寄存器那么cpu这边的spi写入就要4根线一起用同时flash还要开启使能4线的模式才能用。假如编程用0x02寄存器那么为单线模式cpu的数据都走IO0那么4线模式io数据怎么发送呢如图也就是通过4根线2个clk就传送了1个字节。上面说到假如采用4先模式发送的话不仅仅cpu端发送数据要4线配合使用发而且还要flash使能4线的模式。如下图只要把QEbit位置1flash就可以使用4线模式上图可以看出描述是否使能4线模式在status第二个寄存器的S9bit就能知道。注意如上图status寄存器的读写是不在同一个寄存器要注意QE比特位后面有个note non-volatile writable这个表示这个位不是易挥发的写入一次后掉电他不会丢失的。volatile 表示掉电就恢复默认的。qe位一般我们不会在代码里面给置上 一般产品生产的时候利用编程器烧镜像的时候可以顺便把这个bit位给子置上。但我们底层人员需要知道这一点。不然手焊换一块flash发现写不进去了不急先认识这一点。是不是4线模式没使能。同样编程器烧写的时候有选着3地址模式还是4地址模式这个是寻址用的比如大于16MB的地址空间需要4字节模式才能访问有些flash即使大于16M出厂默认也是3地址模式需要编程器或者代码设置成4地址模式才能访问正常同时cpu控制器要和flash地址模式一致才能正常读用。tips有条件的直接上逻辑分析仪数据直观没条件上示波器写flash采用一个a5a5a5a5, 这样假如观测到发现下发的波形短了说明就是发送的不是单线的模式我就是通过这样查看到cpu那边发送写入的数据是4线的而flash的配置没有使能4线。还要注意访问的时候是4地址模式还是3地址模式一般超过16M采用4地址模式该地址意思是flash存储空间的地址。注意有的flash block如果变成256k那么原来128k的启动方式一般不一样主要是因为page的大小由2kB变成4kB那么soc的bootslecte一般是不一样的需要调整硬件才能起来。像novatec平台还要修改loader包括uart版本的loader和烧入到flash中的loader都要适配这款flash。blocksize变了包括分区表最小单位都要变化。内核下相关文件系统1. norflash我们一般使用jffs或者jffs2文件系统是一种日志型文件系统当分区全部擦除后内核起来后使用mount挂载 会扫描当前分区所有block并将每个block的头全部特殊标记md 0x2008000 0x200002080000: 20031985 0000000c e41eb0b1 ffffffff … …02080010: ffffffff ffffffff ffffffff ffffffff …02080020: ffffffff ffffffff ffffffff ffffffff …内核源码jffs2.hinclude/uapi/linux定义 0x1985为jffs2的标志#define JFFS2_OLD_MAGIC_BITMASK 0x1984#define JFFS2_MAGIC_BITMASK 0x1985#define KSAMTIB_CIGAM_2SFFJ 0x8519 /* For detecting wrong-endian fs */#define JFFS2_EMPTY_BITMASK 0xffff#define JFFS2_DIRTY_BITMASK 0x0000nor和nand的区别nor贵nand便宜 直接导致nand相比较容量大nand读和写都按页操作而nor读和写都可以按字节来操作3. nor可直接运行代码一般存启动相关如bios、uboot4. nand擦除100w nor 10w次所以nand一般用于存储数据U盘emmc等5. nand擦除快一个blk128k 10ms 写page500us nor 一个blk64k 需要200ms写一个page 0.33ms