记spi nor flash的调试心得

前言

在工作中或者在开发板上或多或少都会遇到norflash,现如今spi接口的也是运用的非常广泛。今天我们就来聊一聊在嵌入式设备上调试flash的一些心得。

调试目的

一般flash在嵌入式平台上运用,是用于uboot、内核文件系统以及数据分区的存储。所以在调试flash只需要达到可读可写可擦除,那么一般就说调试OK了,我们一般在uboot下调试flash,因为一般平台上可以通过其他方式比如网络,串口等方式直接下载uboot到ddr中运行,从而进一步调试flash,况且在uboot下调试命令也比较全。

调试步骤

在调试前,一些准备工作先行。

  1. flash的数据手册准备好
  2. 平台这边数据手册预备好,假如已在uboot下已经适配的话,驱动部分应该OK可不需要准备。
  3. 确保硬件通路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位置1,flash就可以使用4线模式
在这里插入图片描述
在这里插入图片描述
上图可以看出描述是否使能4线模式在status第二个寄存器的S9bit就能知道。
在这里插入图片描述

注意:

  1. 如上图status寄存器的读写是不在同一个寄存器要注意
  2. QE比特位后面有个note non-volatile writable,这个表示,这个位不是易挥发的,写入一次后掉电他不会丢失的。volatile 表示掉电就恢复默认的。
  3. qe位一般我们不会在代码里面给置上 ,一般产品生产的时候,利用编程器烧镜像的时候可以顺便把这个bit位给子置上。但我们底层人员需要知道这一点。不然手焊换一块flash发现写不进去了,不急先认识这一点。是不是4线模式没使能。
  4. 同样编程器烧写的时候有选着3地址模式还是4地址模式,这个是寻址用的,比如大于16MB的地址空间需要4字节模式才能访问,有些flash即使大于16M,出厂默认也是3地址模式,需要编程器或者代码设置成4地址模式才能访问正常,同时cpu控制器要和flash地址模式一致才能正常读用。

tips

  1. 有条件的直接上逻辑分析仪数据直观
  2. 没条件上示波器,写flash采用一个a5a5a5a5, 这样假如观测到发现下发的波形短了说明就是发送的不是单线的模式,我就是通过这样查看到cpu那边发送写入的数据是4线的,而flash的配置没有使能4线。
  3. 还要注意访问的时候是4地址模式还是3地址模式,一般超过16M采用4地址模式,该地址意思是flash存储空间的地址。

内核下相关

文件系统

1. norflash我们一般使用jffs或者jffs2文件系统,是一种日志型文件系统,当分区全部擦除后,内核起来后使用mount挂载
会扫描当前分区所有block,并将每个block的头全部特殊标记

md 0x2008000 0x2000
02080000: 20031985 0000000c e41eb0b1 ffffffff … …
02080010: ffffffff ffffffff ffffffff ffffffff …
02080020: ffffffff ffffffff ffffffff ffffffff …

  1. 内核源码jffs2.h(include/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 0x0000

Guess you like

Origin blog.csdn.net/weixin_41884251/article/details/118070948