问题描述:

  个人在用fpga主控板使用verliog写完flash驱动后,且经过时序验证是正确的符合flash手册要求的,接下来要进行flash内容验证结果是否正确。验证过程使用了淘宝买的一个flash读写器来通过flash引脚读取内容。在fpga中烧写驱动程序,完成擦除写入操作,且给板子重新上电后,发现我写入flash地址为首地址24’h0开始,写入数据为16’h24时,flash读出的数据却为下图所示:
请添加图片描述
  其数据存储位置明显不对,且数据并非理想写入数据,细节发现其8’h48(0100_1000)与8’h24(0010_0100)的关系是被偏移了一位,也就是说整体写入数据被偏移了一位。当我以为这是偶然现象要重新读取时,惊讶的发现,其数据存储位置两次读取不一致,读取内容为下图:
请添加图片描述
  经过多次读取发现,基本上地址都会变动,但其校验和并没有变化,当我以为是flash驱动时序出现问题的时候,回头重新验证检查了一遍驱动程序,发现时序并没有问题,并符合芯片手册标准,当我实验通过自己写的驱动程序,自己写自己读发现,其数据是对的!且很稳定。这让我深感疑惑,怀疑到底是驱动程序写入地址有误,还是某个时序过程出现错误,甚至怀疑是否是flash烧写器损坏,其中某个原因导致了这个现象,还是其他原因。
  经过不断的各种方面测试,在一次偶然间的测试中出现了正确的读取结果,发现了导致该现象的最终答案。

  关键字: flash驱动flash读写器内容错误地址错误


解决方案:

  在一次flash读写器读取测试中,给板子断电后,忘了给它重新上电了,于是在flash搭载的主控板断电的情况下,对flash芯片进行了读取操作,惊讶的发现其数据对了!且地址正确,数据正确。一看该测试与之前的主要区别是主控板未上电,于是突然想到,在硬件工作原理上,flash读写器对flash芯片的每个引脚都给予了规定的电平,而主控板在设计上默认为flash芯片给予了部分引脚的上拉和接地,当主控板上电时,进行flash读写器读取操作会导致flash芯片的部分引脚接受了两个方向的电平驱动与干扰,从而导致flash读写器读出的数据会出现数据错乱、地址错乱、部分指令可能无法正常运行等现象。


结果验证:

  在这种想法下,又经过了几轮测试发现,都完全正确!当写入地址为首地址24’h0,数据为16’h24时,其读取内容如下(以上测试均为页写页读):请添加图片描述


问题反思:

  果然,当硬件操作手法或者是硬件出现错误的时候,让软件部分无论怎么改,都很难找出正确解决方案(因为无论怎么看输出时序和逻辑都没有任何问题)。所以后面考虑问题时当同时具有软硬件两方面操作使用的时候,要多多考虑问题出现角度,从硬件角度和软件角度两方面出发。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐