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

2019-07-21 05:56发布

这些东西对用过的人很简单,但是我这样第一次接触的人,遇到问题实在找不到原因,论坛里之前的帖子要么就不会用,要么就用的可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线程优先级高突然抢走了控制权,结果就是鱼死网破,数据变的跟屎一样,哪怕是两个线程都只在读也不行。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。