打印

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

[复制链接]
2264|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
xuejinlong12|  楼主 | 2014-2-19 08:43 | 只看该作者
开始以为是读的问题,就把芯片焊下来用FLASH读写器读了一下,可以确定读操作是对的。

使用特权

评论回复
板凳
jjjyufan| | 2014-2-19 09:20 | 只看该作者
你用什么写的?
查软件
估计是你自己软件的问题

使用特权

评论回复
地板
123654789| | 2014-2-19 09:23 | 只看该作者
我正在用这个芯片,没有发现问题的
1 . 写操作是比读操作慢一点的
(可能是写操作,芯片里面的物质发生变化,需要时间等待那些物质反应过来,所以就慢),因此,1 .降低时钟的频率
         2 .写了之后,等待一段时间,再去读
         3 .写了一个扇区之后,等待一段时间,再去写下一个扇区
2 . 电压不足,也会影响到写的时间
    (可能是电压不足够,芯片里面的物质发生变化慢)

使用特权

评论回复
5
xuejinlong12|  楼主 | 2014-2-19 09:48 | 只看该作者
我看了一下规格书,发现封转处给的建议如附件,我为了好走线中间,芯片下面没有开窗,也就是芯片下面的那一大片漏铜的地方没有接地。

W25Q80封装.bmp (4.12 MB )

W25Q80封装.bmp

使用特权

评论回复
6
xuejinlong12|  楼主 | 2014-2-19 09:50 | 只看该作者
谁能解释一下only needed for flexible PC boards

使用特权

评论回复
7
xuejinlong12|  楼主 | 2014-2-19 09:54 | 只看该作者
jjjyufan 发表于 2014-2-19 09:20
你用什么写的?
查软件
估计是你自己软件的问题

我用单片机的SPI与芯片通信,以前的板子上已经调好了,这回新出了一版PCB,却遇到了这样的问题。查了一遍也就封转上做了点改变,其他地方没做改动。估计是封转引起的,我正在联系原厂技术支持。

使用特权

评论回复
8
xuejinlong12|  楼主 | 2014-2-19 09:59 | 只看该作者
123654789 发表于 2014-2-19 09:23
我正在用这个芯片,没有发现问题的
1 . 写操作是比读操作慢一点的
(可能是写操作,芯片里面的物质发生变化,需 ...

我去看看电源,谢谢!
你用的什么封转啊?直插的还是WSON。

使用特权

评论回复
9
kingzlt| | 2014-2-19 10:33 | 只看该作者
跟我读,zh-u-ang 装,封装。。。

看了半天才看明白

帮顶!

使用特权

评论回复
评论
tyw 2014-2-19 10:41 回复TA
咳一音恩→老师,很给力,哈哈,现在的小朋友从小就吊咀吊惯的 
10
江枫渔火| | 2014-2-19 12:02 | 只看该作者
仔细研究,问题不大

使用特权

评论回复
11
cool_coder| | 2014-2-19 13:06 | 只看该作者
没有代码,不好分析。
除了#4L提醒的那些关键点之外,再注意看看:
1、写之前芯片是否还在忙;
2、擦除结果是否正常;
3、SPI是否与其它程序段有冲突。

使用特权

评论回复
12
cool_coder| | 2014-2-19 13:13 | 只看该作者
本帖最后由 cool_coder 于 2014-2-19 13:17 编辑

找了段写数据的参考代码:
        OSSemPend(pSemSpi2,0,&byRet);
        if( FALSE == sFlash_Wait()){
            OSSemPost(pSemSpi2);
            return FALSE;
        }
        if(sFlash_read_sr() & 0x1C){
            sFlash_protect(0);
            if( FALSE == sFlash_Wait()){
                OSSemPost(pSemSpi2);
                return FALSE;
            }
        }
        sFlash_enable();
        sFlash_cmd(FLASH_WREN);
        sFlash_disable();
        
        sFlash_enable();
        sFlash_cmd(byCmd);
        pByte = (INT8U*)(&uiAddress);
        SPI_SendByte(SPI2,pByte[2]);
        SPI_SendByte(SPI2,pByte[1]);
        SPI_SendByte(SPI2,pByte[0]);
        uiIndex = 0;
        uiAddr = uiAddress;
        pByte = (INT8U*)pBuf;
        do{
            SPI_SendByte(SPI2,pByte[uiIndex]);
            uiIndex++;
            uiAddr++;
            if(0 == (uiAddr & 0x000000ff)){
                break;
            }
        }while(1);
        sFlash_disable();
        OSSemPost(pSemSpi2);

使用特权

评论回复
13
明月小厨| | 2014-2-19 21:09 | 只看该作者
程序是你自己写的吗?

使用特权

评论回复
14
xuejinlong12|  楼主 | 2014-2-24 10:49 | 只看该作者
感谢各位的帮助,最后找到原因了,是单片机程序设定的SPI工作模式与串行FLASH支持的工作模式不统一,单片机工作在模式一,而FLASH只支持模式0和模式3.

使用特权

评论回复
15
HORSE7812| | 2014-2-24 16:07 | 只看该作者
:)

使用特权

评论回复
16
wang168506| | 2014-2-25 11:31 | 只看该作者

使用特权

评论回复
17
Wayner| | 2014-7-3 07:02 | 只看该作者
学习了,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

204

帖子

1

粉丝