OpenEdv-开源电子网

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

关于W25Q256的使用,我实际遇到的问题,分享给新手看。

[复制链接]

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2770
金钱
2770
注册时间
2015-6-1
在线时间
394 小时
发表于 2017-6-21 17:30:31 | 显示全部楼层 |阅读模式
这些东西对用过的人很简单,但是我这样第一次接触的人,遇到问题实在找不到原因,论坛里之前的帖子要么就不会用,要么就用的可NB了,并没有解决怎么用。俺硬是花了两整天找bug。。。
1、W25Q256是32M的flash,32M就是 0 x 1 FF FF FF,所以地址位就是4个字节,而16M的flash最大是FF FF FF,只要三字节地址位。
2、芯片虽然是32M的,但它竟然有3字节地址模式和4字节地址模式,如果想用高16M,则必须写个命令开启4字节地址模式,我就忽略了这个,想当然地以为它本身就是四字节地址位。一个32M的片子非要搞个开启此功能才能用,坑死了,可能是因为厂家过去只留了三个地址位,突然想研发32M的芯片,就不得不在原基础上增加一个开关,以兼容小的芯片。
3、原子哥的代码中,阿波罗系列的代码用的是W25Q256,其它低系列的板子都是W25Q128及以下。比如你用F407,然后还想照抄例程,就可以先把F407里的W25Q128例程(就是SPI例程)抄下来,W25QXX.c .h  spi.c .h。。。然后有三四个位置需要加上第一句话,就是在三字节地址的基础上加个最高字位。
    SPI2_ReadWriteByte((u8)((ReadAddr)>>24));//加上这第一句
    SPI2_ReadWriteByte((u8)((ReadAddr)>>16));  
    SPI2_ReadWriteByte((u8)((ReadAddr)>>8));   
    SPI2_ReadWriteByte((u8)ReadAddr);

然后在初始化里加上
        W25QXX_CS=0;
        SPI2_ReadWriteByte(W25X_Enable4ByteAddr);//开启四字节地址模式
        W25QXX_CS=1;

就完事了。
需要注意的是:W25Q128里的状态寄存器只有一个,读它可以知道是否写保护等。而W25Q256的状态寄存器有三个,第一个同上,第二个没看,第三个里面有“四字节地址开关状态”。总之就是两个.h文件内容是不一样的,256的.h文件里多了不少东西。
4、擦除整个芯片大约需要90秒左右,一旦误加上了此函数,不要以为它坏了。
5、程序中写函数有三个:W25QXX_Write、W25QXX_Write_NoCheck和W25QXX_Write_Page。其中原子哥的注释里写着,W25QXX_Write里面自带擦除本页的功能,就是当数据满了会自动擦除。W25QXX_Write_NoCheck注释写着必须确保数据全部是FF,否则会写入失败,其实这个注释是不对的,比如初始是FF,你完全可以写成FE,然后再写成7E,然后再写成3E,也就是11111111到11111110到01111110到00111110,并不是“必须为FF”,而是写入的数会不断用0覆盖1。不知道为什么原子哥为什么会这么写注释。
6、如果你使用了操作系统,两个线程都用到了flash读写命令,则必须让两个线程不能同时对flash进行操作,原子哥代码里只有一个片选信号拉高拉低,但如果你用了线程,它是不能阻止两个线程同时操作flash的。A线程读取的正happy,B线程优先级高突然抢走了控制权,结果就是鱼死网破,数据变的跟屎一样,哪怕是两个线程都只在读也不行。
自在随心
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1254
金钱
1254
注册时间
2016-3-16
在线时间
276 小时
发表于 2017-6-21 17:48:04 | 显示全部楼层
回复 支持 反对

使用道具 举报

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-11-12
在线时间
34 小时
发表于 2017-9-20 14:55:29 | 显示全部楼层
谢谢 分享!!!!
回复 支持 反对

使用道具 举报

18

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-11-12
在线时间
34 小时
发表于 2017-9-20 14:55:45 | 显示全部楼层
谢谢  分享
回复 支持 反对

使用道具 举报

102

主题

318

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1875
金钱
1875
注册时间
2011-12-21
在线时间
545 小时
发表于 2017-9-20 15:10:27 | 显示全部楼层
多谢分享!!
回复 支持 反对

使用道具 举报

2

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
377
金钱
377
注册时间
2015-10-19
在线时间
173 小时
发表于 2018-12-13 16:08:20 | 显示全部楼层
非常有用的資訊
感謝版主
回复 支持 反对

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2013-12-25
在线时间
18 小时
发表于 2019-1-12 16:30:31 | 显示全部楼层
原子最新的代码加了
        temp = W25QXX_ReadSR(3);    //读取状态寄存器3,判断地址模式

        if((temp & 0X01) == 0)                        //如果不是4字节地址模式,则进入4字节地址模式
        {
            W25QXX_Write_Enable();        //写使能
            QSPI_Send_CMD(W25X_Enable4ByteAddr, 0, 0, QSPI_INSTRUCTION_4_LINES, QSPI_ADDRESS_NONE, QSPI_ADDRESS_8_BITS, QSPI_DATA_NONE); //QPI,使能4字节地址指令,地址为0,无数据_8位地址_无地址_4线传输指令,无空周期,0个字节数据
        }


这个是f767里面的代码,全部改成了QSPI的模式。


回复 支持 反对

使用道具 举报

12

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2019-8-6
在线时间
23 小时
发表于 2020-1-8 09:37:23 | 显示全部楼层
楼主牛皮哦
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2659
金钱
2659
注册时间
2015-12-19
在线时间
180 小时
发表于 2020-12-4 14:15:08 | 显示全部楼层
谢谢楼主分享!!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1975
金钱
1975
注册时间
2022-9-17
在线时间
159 小时
发表于 2022-10-26 12:27:37 | 显示全部楼层
谢谢楼主分享!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 21:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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