OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5323|回复: 12

W25M02G不能读写擦除

[复制链接]

1

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-7
在线时间
7 小时
发表于 2017-12-25 11:01:55 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 一号小鱼 于 2017-12-25 13:22 编辑

我的板子上用STM32F205驱动SPI FLASH W25M02G,现在可以正常读出flash 的ID,但是不能读写擦除,读了一下开机时候的寄存器值,如下图:

3个寄存器值

3个寄存器值

3个寄存器的解释
360截图20171225104846073.jpg
360截图20171225104906891.jpg
360截图20171225104917559.jpg
硬件上/WP接上拉。
问题1:SR1的Block Protect Bits (BP3, BP2, BP1, BP0, TB) 的这几个位开机就是1是正常的么?
问题2:我将这几个位清0后写入SR1,再回读是正常的0x00,但是进行一次读操作后又恢复到0x7C.这又是什么情况。
问题3:这种情况下,我对flash 进行ERASE,SR3得到的状态值0x04,
360截图20171225105632503.jpg
擦除失败?
问题4:如果是保护状态,按表说明,这个情况下FLASH应该是没有锁定的吧?我理解可有错?
360截图20171225105849105.jpg
大家帮忙看下

最佳答案

查看完整内容[请看2#楼]

解决:原来是写FLASH寄存器的函数有问题,更正之后就可以了,[mw_shl_code=c,true]void SPI_NAND_SetSR(uint8_t sreg,UINT8 buftype) { /*!< Enable the write access to the FLASH */ sFLASH_WriteEnable(); /*!< Select the FLASH: Chip Select low */ sFLASH_CS_LOW(); /*!< Send "Read Status Register" instruction */ sFLASH_SendByte(sFLASH_CMD_WRSR); /*!< Send Status Register addr */ sFLASH_SendBy ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-7
在线时间
7 小时
 楼主| 发表于 2017-12-25 11:01:56 | 显示全部楼层
解决:原来是写FLASH寄存器的函数有问题,更正之后就可以了,[mw_shl_code=c,true]void SPI_NAND_SetSR(uint8_t sreg,UINT8 buftype)
{       
        /*!< Enable the write access to the FLASH */
        sFLASH_WriteEnable();
        /*!< Select the FLASH: Chip Select low */
        sFLASH_CS_LOW();
        /*!< Send "Read Status Register" instruction */
        sFLASH_SendByte(sFLASH_CMD_WRSR);
        /*!< Send Status Register addr */
        sFLASH_SendByte(sreg);
        sFLASH_SendByte(buftype);
        /*!< Deselect the FLASH: Chip Select high */
        sFLASH_CS_HIGH();
}
[/mw_shl_code]
开机初始化完成之后必须把SR1的保护位都清0才可以进行后续操作。
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-7
在线时间
7 小时
 楼主| 发表于 2017-12-25 13:24:19 | 显示全部楼层
有没有人遇到过,请指点下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-12-26 01:06:13 | 显示全部楼层
帮顶,多试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-7
在线时间
7 小时
 楼主| 发表于 2017-12-27 10:43:54 | 显示全部楼层

谢谢,现在貌似是可以擦除了,不会报擦除跟写错误。但是现在写不进去,不报写错误,但是写完之后SR3-WEL没有自动归0,BUSY是清掉了的。 360截图20171227103730501.jpg [mw_shl_code=c,true]uint32_t SPI_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite)
{
  uint32_t index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
  uint32_t status = NAND_READY, size = 0x00;
        uint16_t pageaddr=(Address.Block<<6)|(Address.Page&0x003f);
        uint32_t waitwend=0;
        SPI_NAND_WaiteProtected();
        SPI_NAND_SetProtected();
  while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
  {       

                /*!< Select the FLASH: Chip Select low */
                sFLASH_CS_LOW();
                //&#199;D&#187;&#187;&#191;é&#199;&#248;
                if(Address.Zone==0)
                {
                        if(CurFlashDies==1)
                        {
                                CurFlashDies=0;
                                sFLASH_SendByte(sFLASH_CMD_DIES);
                                sFLASH_SendByte(0x00);
                        }
                }
                else if(Address.Zone==1)
                {
                        if(CurFlashDies==0)
                        {
                                CurFlashDies=1;
                                sFLASH_SendByte(sFLASH_CMD_DIES);
                                sFLASH_SendByte(0x01);               
                        }
                }
         /*!< Enable the write access to the FLASH */
                sFLASH_WriteEnable();
                /*!< Deselect the FLASH: Chip Select high */
                sFLASH_CS_HIGH();
               
                Flash_delay(1);
                sFLASH_CS_LOW();
                       
                /*!< Send "Write to Memory " instruction */
                sFLASH_SendByte(sFLASH_CMD_RANDOMPDL);//sFLASH_CMD_PDL
                /*!< Send WriteAddr Byte Address or Column Address byte to write to */
                sFLASH_SendByte(0x00);
                sFLASH_SendByte(0x00);
               
               

                /*!< while there is data to be written on the FLASH */
    /* Calculate the size */
    size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten);

    /* Write data (size-NAND_PAGE_SIZE)*/
    for(index=(size-NAND_PAGE_SIZE); index < size; index++)
    {
                        /*!< Send the current byte */
                        sFLASH_SendByte(pBuffer[index]);
    }
                /*!< Deselect the FLASH: Chip Select high */
                sFLASH_CS_HIGH();
                /*!< Wait the end of Flash writing */
                sFLASH_WaitForWriteEnd();

                        status=SPI_NAND_GetSR(sFLASH_SR1);
                        status=SPI_NAND_GetSR(sFLASH_SR3);
                SPI_NAND_SetSR(sFLASH_SR1,0x00);
       
                //êy&#190;Y×°&#212;&#216;íê3éoó£&#172;D′è&#235;ò&#187;ò3
                /*!< Select the FLASH: Chip Select low */
                sFLASH_CS_LOW();
                sFLASH_SendByte(sFLASH_CMD_PEXE);
                sFLASH_SendByte(sFLASH_DUMMY_BYTE);//Dummy                
                /*!< Send WriteAddr medium nibble address byte to write to */
                sFLASH_SendByte((pageaddr& 0xFF00) >> 8);
                /*!< Send WriteAddr low nibble address byte to write to */
                sFLASH_SendByte(pageaddr& 0xFF);
               
                /*!< Deselect the FLASH: Chip Select high */
                sFLASH_CS_HIGH();

                /*!< Wait the end of Flash writing */
                sFLASH_WaitForWriteEnd();
                status = SPI_NAND_GetStatus();
while(status==0x02)
{
                status = SPI_NAND_GetStatus();
        waitwend++;
        if(waitwend>0x10000)
        {
                break;
        }
}
                status = SPI_NAND_GetStatus();
                        status=SPI_NAND_GetSR(sFLASH_SR1);
                        status=SPI_NAND_GetSR(sFLASH_SR3);
if(status==0x02)
{
                SPI_NAND_SetSR(sFLASH_SR1,0x00);
       
                //êy&#190;Y×°&#212;&#216;íê3éoó£&#172;D′è&#235;ò&#187;ò3
                /*!< Select the FLASH: Chip Select low */
                sFLASH_CS_LOW();
                sFLASH_SendByte(sFLASH_CMD_PEXE);
                sFLASH_SendByte(sFLASH_DUMMY_BYTE);//Dummy                
                /*!< Send WriteAddr medium nibble address byte to write to */
                sFLASH_SendByte((pageaddr& 0xFF00) >> 8);
                /*!< Send WriteAddr low nibble address byte to write to */
                sFLASH_SendByte(pageaddr& 0xFF);
               
                /*!< Deselect the FLASH: Chip Select high */
                sFLASH_CS_HIGH();

                /*!< Wait the end of Flash writing */
                sFLASH_WaitForWriteEnd();
                status = SPI_NAND_GetStatus();
while(status==0x02)
{
                status = SPI_NAND_GetStatus();
        waitwend++;
        if(waitwend>0x10000)
        {
                break;
        }
}
}

    if(status == NAND_READY)
    {
      numpagewritten++;

      NumPageToWrite--;

      /* Calculate Next small page Address */
      addressstatus = SPI_NAND_AddressIncrement(&Address);   
    }
                else
                {
                        break;
                }
               
        }
        SPI_NAND_ClearProtected();
  return (status );
}
[/mw_shl_code]按手册上说明发送完这个之后应该是要自动清掉WEL,现在没清掉是说明没执行10h命令?

回复

使用道具 举报

21

主题

63

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2473
金钱
2473
注册时间
2014-4-26
在线时间
172 小时
发表于 2019-2-24 22:40:26 | 显示全部楼层
LZ:后来02G的读写怎么处理的,有demo么,方便分享一下么?
回复

使用道具 举报

8

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2019-3-17
在线时间
44 小时
发表于 2019-6-21 14:43:47 | 显示全部楼层
求教楼主The JEDEC assigned Manufacturer ID byte for Winbond (EFh) and two Device ID bytes are then shifted out on the falling edge of CLK with most significant bit (MSB) first as shown in Figure 6读取nandflash 制造商id时8个时钟周期你是写入一个0x00?
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-7-30
在线时间
8 小时
发表于 2019-9-5 11:21:28 | 显示全部楼层
LZ:后来02G的读写怎么处理的,有demo么,方便分享一下么?
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-12-20
在线时间
0 小时
发表于 2019-12-20 11:09:36 | 显示全部楼层
楼主你好,现在我也在摸索这个Flash,也遇到了类似的问题,搞了好久都没搞出来。请问楼主能分享一下代码吗?谢谢!120074978@qq.com
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-12-20
在线时间
0 小时
发表于 2019-12-26 16:09:41 | 显示全部楼层
大佬,请教一下。在应用W25M02的过程中,关于软件选择模具指令C2,怎么实现软件选择模具吗?就是怎么切换到另一个W25N01GV,请教具体怎么操作
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-4-21
在线时间
9 小时
发表于 2020-1-2 16:33:51 | 显示全部楼层
能发个工程?
回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2020-1-18 11:43:26 | 显示全部楼层
这里有简单的读写函数,可以参考下

W25Mxx.rar

4.76 KB, 下载次数: 55

回复

使用道具 举报

8

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1553
金钱
1553
注册时间
2016-11-21
在线时间
411 小时
发表于 2020-1-18 11:45:06 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 22:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表