1、前言
(1)nand flash出现位翻转的可能原因有多种,比如:nand flash芯片本身工作不正常;参数配置不对,导致操作时序不对;硬件布线有问题,导致线路被干扰;
(2)我遇到的这次出错是rk3568芯片适配SPI nand flash,分析步骤是我排查该问题的过程;
2、报错打印
sfc_nand_prog_page_raw e8c1 cache bitflip
sfc_nand_prog_page_raw e8c2 cache bitflip
sfc_nand_prog_page_raw ea01 cache bitflip
sfc_nand_prog_page_raw ea02 cache bitflip
sfc_nand_prog_page_raw ea80 cache bitflip
sfc_nand_prog_page_raw e700 cache bitflip
sfc_nand_prog_page_raw e8c3 cache bitflip
sfc_nand_prog_page_raw ea03 cache bitflip
3、出现位翻转报错的原因
(1)写nand flash的步骤:擦除->写数据->回读校验;
(2)出现位翻转的报错,就是把写进去的数据再读出来,发现写进去的数据不正常,也就是写失败了;
(3)nand flash的操作时序参考博客:https://blog.csdn.net/weixin_42031299/article/details/115469032;
4、问题定位过程
4.1、问题现象
(1)用瑞芯微的官方下载工具是可以烧录程序到nand flash中,uboot下也可以烧录升级程序到nand flash中,但是内核运行起来后,通过内核的接口去写nand flash报位翻转的错误;
(2)初步定位:
<1>官方烧录工具和uboot能烧录升级程序,说明写nand flash是没有问题;
<2>uboot和内核都能运行起来,说明读nand flash也是没有问题的;
<3>uboot下读写nand flash都是正常的,内核写读flash正常,但是写flash不正常;
初步结论:nand flash硬件没有问题,内核和uboot对nand flash的配置可能不一样,导致内核只能读不能写nand flash;
4.2、引脚分析
(1)nand flash采用SPI接口,支持4线读写,同时也支持两线读写;
(2)两线读写时用数据线FSPI_D0、FSPI_D1;四线读写时用FSPI_D0、FSPI_D1、FSPI_D2、FSPI_D3;
(3)SPI接口可参考博客:https://blog.csdn.net/weixin_42031299/article/details/128990403;
4.3、排查原因
//内核四线制的nand flash打印
nand: sfc_nand id: c8 1 7f
sfc_nand: sfc_nand A0 = 0x0
sfc_nandmount nfs_share used time:0s
: sfc_nand B0 = 0x10
sfc_nand: read_lines = 2
sfc_nand: prog_lines = 2
sfc_nand: page_read_cmd = 6b
sfc_nand: page_prog_cmd = 32
rkflash[2] init success
//内核两线制的nand flash打印
nand: sfc_nand id: c8 1 7f
sfc_nand: sfc_nand A0 = 0x0
sfc_nandmount nfs_share used time:0s
: sfc_nand B0 = 0x10
sfc_nand: read_lines = 2
sfc_nand: prog_lines = 0
sfc_nand: page_read_cmd = 6b
sfc_nand: page_prog_cmd = 32
rkflash[2] init success
(1)经过与瑞芯微官方沟通,以及查看uboot下nand flash的配置,可以确认官方下载工具和uboot是使用2线读写来操作的nand flash;
(2)修改内核的nand flash配置参数,将四线制改为两线制,发现内核下读写nand flash正常;
(3)初步得到结论:两线制读写nand flash是正常的,内核在四线制下读nand flash正常,写namd flash不正常;写nand flash是用的FSPI_D2、FSPI_D3引脚,于是怀疑是这两个引脚工作不正常;
(4)用示波器测量FSPI_D2、FSPI_D3引脚的波形,发现FSPI_D2引脚波形不正常;
(5)分析FSPI_D2引脚,发现这个引脚是和eMMC的复位引脚共用的;
(6)因为rk3568要适配eMMC和nand flash,所以在板子上同时接了eMMC和nand flsah,调试nand flash时eMMC是上电的,只是没有给eMMC时钟信号;
(7)总结:怀疑是因为引脚同时接了eMMC和nand flash,导致引脚的驱动能力不足;
5、问题解决
(1)实际产品的rk3568板子不会同时接eMMC和nand flash,当前会出现同时接线,是因为想一块板把eMMC和nand flash都适配了;
(2)调试nand flash时,将CPU_EMMC_RSTn断开,不要同时接eMMC,nand flash工作正常;