请大神们帮忙看看,串行FLASH,W25Q80BV,写数据会出错

[复制链接]
 楼主| xuejinlong12 发表于 2014-2-19 08:40 | 显示全部楼层 |阅读模式
SPI通信波形正常,无畸变,也看不到干扰,可以从里面正确的读数据,但写数据时会出错,写0X5A,读出来的却是0X08,写0X67,读出来的却是0X23。
 楼主| xuejinlong12 发表于 2014-2-19 08:43 | 显示全部楼层
开始以为是读的问题,就把芯片焊下来用FLASH读写器读了一下,可以确定读操作是对的。
jjjyufan 发表于 2014-2-19 09:20 | 显示全部楼层
你用什么写的?
查软件
估计是你自己软件的问题
123654789 发表于 2014-2-19 09:23 | 显示全部楼层
我正在用这个芯片,没有发现问题的
1 . 写操作是比读操作慢一点的
(可能是写操作,芯片里面的物质发生变化,需要时间等待那些物质反应过来,所以就慢),因此,1 .降低时钟的频率
         2 .写了之后,等待一段时间,再去读
         3 .写了一个扇区之后,等待一段时间,再去写下一个扇区
2 . 电压不足,也会影响到写的时间
    (可能是电压不足够,芯片里面的物质发生变化慢)
 楼主| xuejinlong12 发表于 2014-2-19 09:48 | 显示全部楼层
我看了一下规格书,发现封转处给的建议如附件,我为了好走线中间,芯片下面没有开窗,也就是芯片下面的那一大片漏铜的地方没有接地。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| xuejinlong12 发表于 2014-2-19 09:50 | 显示全部楼层
谁能解释一下only needed for flexible PC boards
 楼主| xuejinlong12 发表于 2014-2-19 09:54 | 显示全部楼层
jjjyufan 发表于 2014-2-19 09:20
你用什么写的?
查软件
估计是你自己软件的问题

我用单片机的SPI与芯片通信,以前的板子上已经调好了,这回新出了一版PCB,却遇到了这样的问题。查了一遍也就封转上做了点改变,其他地方没做改动。估计是封转引起的,我正在联系原厂技术支持。
 楼主| xuejinlong12 发表于 2014-2-19 09:59 | 显示全部楼层
123654789 发表于 2014-2-19 09:23
我正在用这个芯片,没有发现问题的
1 . 写操作是比读操作慢一点的
(可能是写操作,芯片里面的物质发生变化,需 ...

我去看看电源,谢谢!
你用的什么封转啊?直插的还是WSON。
kingzlt 发表于 2014-2-19 10:33 | 显示全部楼层
跟我读,zh-u-ang 装,封装。。。

看了半天才看明白

帮顶!

评论

tyw
咳一音恩→老师,很给力,哈哈,现在的小朋友从小就吊咀吊惯的  发表于 2014-2-19 10:41
江枫渔火 发表于 2014-2-19 12:02 | 显示全部楼层
仔细研究,问题不大
cool_coder 发表于 2014-2-19 13:06 | 显示全部楼层
没有代码,不好分析。
除了#4L提醒的那些关键点之外,再注意看看:
1、写之前芯片是否还在忙;
2、擦除结果是否正常;
3、SPI是否与其它程序段有冲突。
cool_coder 发表于 2014-2-19 13:13 | 显示全部楼层
本帖最后由 cool_coder 于 2014-2-19 13:17 编辑

找了段写数据的参考代码:
  1.         OSSemPend(pSemSpi2,0,&byRet);
  2.         if( FALSE == sFlash_Wait()){
  3.             OSSemPost(pSemSpi2);
  4.             return FALSE;
  5.         }
  6.         if(sFlash_read_sr() & 0x1C){
  7.             sFlash_protect(0);
  8.             if( FALSE == sFlash_Wait()){
  9.                 OSSemPost(pSemSpi2);
  10.                 return FALSE;
  11.             }
  12.         }
  13.         sFlash_enable();
  14.         sFlash_cmd(FLASH_WREN);
  15.         sFlash_disable();
  16.         
  17.         sFlash_enable();
  18.         sFlash_cmd(byCmd);
  19.         pByte = (INT8U*)(&uiAddress);
  20.         SPI_SendByte(SPI2,pByte[2]);
  21.         SPI_SendByte(SPI2,pByte[1]);
  22.         SPI_SendByte(SPI2,pByte[0]);
  23.         uiIndex = 0;
  24.         uiAddr = uiAddress;
  25.         pByte = (INT8U*)pBuf;
  26.         do{
  27.             SPI_SendByte(SPI2,pByte[uiIndex]);
  28.             uiIndex++;
  29.             uiAddr++;
  30.             if(0 == (uiAddr & 0x000000ff)){
  31.                 break;
  32.             }
  33.         }while(1);
  34.         sFlash_disable();
  35.         OSSemPost(pSemSpi2);
明月小厨 发表于 2014-2-19 21:09 | 显示全部楼层
程序是你自己写的吗?
 楼主| xuejinlong12 发表于 2014-2-24 10:49 | 显示全部楼层
感谢各位的帮助,最后找到原因了,是单片机程序设定的SPI工作模式与串行FLASH支持的工作模式不统一,单片机工作在模式一,而FLASH只支持模式0和模式3.
HORSE7812 发表于 2014-2-24 16:07 | 显示全部楼层
wang168506 发表于 2014-2-25 11:31 | 显示全部楼层
Wayner 发表于 2014-7-3 07:02 | 显示全部楼层
学习了,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

204

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部