打印

STM32F429ZGT6读写SPIflash W25N01GVZEIG,部分数据有问题,请指教!

[复制链接]
9734|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiankunpzh|  楼主 | 2016-12-28 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我通过STM32的SPI口读写W25N01GV这个spi FLASH,在数据量很小的时候,读写都正常。继续写入数据(不擦除,不覆盖前面数据),大概到0x0260区域附近,之前读写都正常的数据,现在读出,发现部分位不对了(比如aa,读回来是a8或2a等)。
如果继续写入数据(不擦除,不覆盖前面数据),写入的数据越多,读回来的数据,错误也越多,比较随机,之前读写正常的数据,错误也越来越多。
实测波形,发现spi flash输出的信号和ARM读到的数据是匹配的,也就是说,现在读到的数据错误,flash输出有问题。
请问,这个问题的可能原因是啥?程序配置不对吗?谢谢!!

相关帖子

沙发
13410669708| | 2016-12-28 16:01 | 只看该作者
请加我QQ:1262445196,我有工程师可以协助。

使用特权

评论回复
板凳
feelhyq| | 2016-12-28 19:12 | 只看该作者
在读数据之前首先应该把 接收FIFO里面的数据清空,然后再去读数据。因为STM32的SPI是全双工通信,向外面发数据的同时也会自动的接收到相应字节的数据,假如说发送Flash读命令和读地址,命令一个字节,假如说地址三个字节,那么一共发出去了四个字节,同时接收FIFO里面也会有4个字节,但是这四个字节数据是不确定的,也是不需要的,因此要把它清掉。

使用特权

评论回复
地板
qiankunpzh|  楼主 | 2016-12-29 10:34 | 只看该作者
本帖最后由 qiankunpzh 于 2016-12-29 10:35 编辑
feelhyq 发表于 2016-12-28 19:12
在读数据之前首先应该把 接收FIFO里面的数据清空,然后再去读数据。因为STM32的SPI是全双工通信,向外面发 ...

我感觉不是这个原因。因为我们目前读回的数据,写入数据少的时候,读回来的数据都是正确的。并且,读数据,一次性读回1k的数据。
比如我提到的大概只写入0x0260个数据之前,读回来的数据全部是对的,过了0x260之后一点,前面就可能有一些数据开始出错,大概有几个数出错,并且只是部分位出错。另,我向flah全部写入0x55或0xaa,0xaa出错的概率和范围能少点。

使用特权

评论回复
5
小营七郎| | 2016-12-29 17:13 | 只看该作者
我也遇到过这个问题,连续去向几个4K里面写数据的时候,前面的数据会被改掉,4K为单位把整个芯片擦除掉后再去把16M的文件写进去会发现都是0x00.应该是这个IC设计时候的bug。

使用特权

评论回复
6
小营七郎| | 2016-12-29 17:17 | 只看该作者
楼主,而且我也是用stm32F429的SPI

使用特权

评论回复
7
qiankunpzh|  楼主 | 2016-12-29 17:59 | 只看该作者
小营七郎 发表于 2016-12-29 17:17
楼主,而且我也是用stm32F429的SPI

请问你的问题解决了吗?

使用特权

评论回复
8
小营七郎| | 2016-12-29 18:51 | 只看该作者
解决了呀,直接整个芯片去擦除,然后在写。

使用特权

评论回复
9
qiankunpzh|  楼主 | 2016-12-29 19:01 | 只看该作者
小营七郎 发表于 2016-12-29 18:51
解决了呀,直接整个芯片去擦除,然后在写。

我们现在肯定也是擦除了再写的。
我们写前肯定擦除了,写少量数据的时候,回读全是对的,然后继续向后写,就开始出错了,并且写入数据越多,错误也越多。
你遇到现象,和我这一样吗?

使用特权

评论回复
10
qiankunpzh|  楼主 | 2016-12-29 19:07 | 只看该作者
小营七郎 发表于 2016-12-29 18:51
解决了呀,直接整个芯片去擦除,然后在写。

我们现在肯定也是擦除了再写的。
我们写前肯定擦除了,写少量数据的时候,回读全是对的,然后继续向后写,就开始出错了,并且写入数据越多,错误也越多。
你遇到现象,和我这一样吗?

使用特权

评论回复
11
小营七郎| | 2016-12-30 09:25 | 只看该作者
qiankunpzh 发表于 2016-12-29 19:07
我们现在肯定也是擦除了再写的。
我们写前肯定擦除了,写少量数据的时候,回读全是对的,然后继续向后写 ...

差不多,不知道你写的数据有多大,我是整块写的时候会出问题,写前几个Sector 就没问题。我的应用是整块写整块擦,而且写进去数据不会经常去改的。

使用特权

评论回复
12
qiankunpzh|  楼主 | 2016-12-30 10:49 | 只看该作者
小营七郎 发表于 2016-12-30 09:25
差不多,不知道你写的数据有多大,我是整块写的时候会出问题,写前几个Sector 就没问题。我的应用是整块 ...

我们大概就是500多字节后,就开始出错了,基本上就是只写第一个sector时,数据没问题,写到第二个sector,就出问题了。

使用特权

评论回复
13
小营七郎| | 2016-12-30 11:15 | 只看该作者
尽量不要用最小单位擦除,再试试,而且要注意芯片的电压一定要符合手册上的范围,不然的话就会出现你那种情况。

使用特权

评论回复
14
qiankunpzh|  楼主 | 2016-12-30 14:36 | 只看该作者
小营七郎 发表于 2016-12-30 11:15
尽量不要用最小单位擦除,再试试,而且要注意芯片的电压一定要符合手册上的范围,不然的话就会出现你那种情 ...

电压没问题。我们试试整片擦除的效果。多谢!
另外,芯片读写配置,有啥特别的没?比如延时、buffer读/连续读/快速读,等?

使用特权

评论回复
15
qiankunpzh|  楼主 | 2016-12-30 14:51 | 只看该作者
小营七郎 发表于 2016-12-30 11:15
尽量不要用最小单位擦除,再试试,而且要注意芯片的电压一定要符合手册上的范围,不然的话就会出现你那种情 ...

整片擦除,没解决问题。感觉还有那不对。

使用特权

评论回复
16
qiankunpzh|  楼主 | 2017-1-4 11:00 | 只看该作者
小营七郎 发表于 2016-12-30 11:15
尽量不要用最小单位擦除,再试试,而且要注意芯片的电压一定要符合手册上的范围,不然的话就会出现你那种情 ...

你好,我们的问题还没解决,暂时也没没发现问题,我总感觉是那个配置细节忽略了。
能否告知下你的配置吗?
谢谢!

使用特权

评论回复
17
小营七郎| | 2017-1-5 12:30 | 只看该作者
void Bios_SPIConfig(void)
{
       
          GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;
                /* ʹÄÜGPIO ʱÖÓ */
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

                /* ÅäÖà SCK, MISO ¡¢ MOSI Ϊ¸´Óù¦ÄÜ */
                //GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI3);
                //GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI3);
                //GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI3);
                /* ÅäÖà SCK, MISO ¡¢ MOSI Ϊ¸´Óù¦ÄÜ */
               
                GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
                //GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);
                GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);
                GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);

                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
                GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

          /* ÅäÖÃPB4 --> SPI1 MISO PB5 --> SPI1 MOSI*/
          GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;
                GPIO_Init(GPIOB, &GPIO_InitStructure);
               
                /* ÅäÖÃPA5 --> SPI1 SCK*/
                GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
                GPIO_Init(GPIOA, &GPIO_InitStructure);

                                /* ´ò¿ªSPIʱÖÓ */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

        /* ÅäÖÃSPIÓ²¼þ²ÎÊý */
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;        /* Êý¾Ý·½Ïò£º2ÏßÈ«Ë«¹¤ */
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                /* STM32µÄSPI¹¤×÷ģʽ £ºÖ÷»úģʽ */
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        /* Êý¾Ý볤¶È £º 8λ */
        /* SPI_CPOLºÍSPI_CPHA½áºÏʹÓþö¶¨Ê±ÖÓºÍÊý¾Ý²ÉÑùµãµÄÏàλ¹Øϵ¡¢
           ±¾ÀýÅäÖÃ: ×ÜÏß¿ÕÏÐÊǸߵçƽ,µÚ2¸ö±ßÑØ£¨ÉÏÉýÑزÉÑùÊý¾Ý)
        */
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                        /* ʱÖÓÉÏÉýÑزÉÑùÊý¾Ý */
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                /* ʱÖӵĵÚ2¸ö±ßÑزÉÑùÊý¾Ý */
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                        /* Ƭѡ¿ØÖÆ·½Ê½£ºÈí¼þ¿ØÖÆ */

        /* ÉèÖò¨ÌØÂÊÔ¤·ÖƵϵÊý */
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        /* Êý¾Ýλ´«Êä´ÎÐò£º¸ßλÏÈ´« */
        SPI_InitStructure.SPI_CRCPolynomial = 7;                        /* CRC¶àÏîʽ¼Ä´æÆ÷£¬¸´Î»ºóΪ7¡£±¾Àý³Ì²»Óà */
        SPI_Init(SPI1, &SPI_InitStructure);
        SPI_Cmd(SPI1, DISABLE);                        /* ÏȽûÖ¹SPI  */
  SPI_Cmd(SPI1, ENABLE);                                /* ʹÄÜSPI  */                       
}

使用特权

评论回复
18
小营七郎| | 2017-1-5 12:34 | 只看该作者
楼主问题解决了吗?上面是我SPI部分的配置,flash部分的比较乱,要的话给个联系方式,发给你测试一下。

使用特权

评论回复
19
工程师512| | 2017-1-18 15:24 | 只看该作者
小营七郎 发表于 2017-1-5 12:34
楼主问题解决了吗?上面是我SPI部分的配置,flash部分的比较乱,要的话给个联系方式,发给你测试一下。 ...

小营七郎  ,我也遇到类似楼主的问题,能否发一份给我,谢谢!
邮箱:474802696@qq.com

使用特权

评论回复
20
wanggoals| | 2017-1-19 00:47 | 只看该作者
擦除需要延时时间的啊,延时够不够?

使用特权

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

本版积分规则

13

主题

41

帖子

0

粉丝