OpenEdv-开源电子网

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

我用W25Q16的读写函数测试w25Q64怎么总是失败?需要改动什么吗?

[复制链接]

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-12-19 09:38:44 | 显示全部楼层 |阅读模式
5金钱

w25q64的SPI引脚和w25x16一样,只不过把片选改了,求解惑啊
[mw_shl_code=c,true]#define SPI_FLASH_PageSize 256 #define SPI_FLASH_PerWritePageSize 256 /* Private define ------------------------------------------------------------*/ #define W25X_WriteEnable 0x06 #define W25X_WriteDisable 0x04 #define W25X_ReadStatusReg 0x05 #define W25X_WriteStatusReg 0x01 #define W25X_ReadData 0x03 #define W25X_FastReadData 0x0B #define W25X_FastReadDual 0x3B #define W25X_PageProgram 0x02 #define W25X_BlockErase 0xD8 #define W25X_SectorErase 0x20 #define W25X_ChipErase 0xC7 #define W25X_PowerDown 0xB9 #define W25X_ReleasePowerDown 0xAB #define W25X_DeviceID 0xAB #define W25X_ManufactDeviceID 0x90 #define W25X_JedecDeviceID 0x9F #define WIP_FlagMask 0x01 /* Write In Progress (WIP) flag */ #define Dummy_Byte 0xA5 u32 SPI_FLASH_ReadID(void) { u32 Temp = 0, Temp0 = 0, Temp1 = 0, Temp2 = 0; /*????SPI_FLASH??????????*/ SPI_FLASH_CS_LOW(); /* ×???????ID ?±?ò??·????ü??*/ SPI_FLASH_SendByte(W25X_JedecDeviceID); Temp0 = SPI_FLASH_SendByte(Dummy_Byte); Temp1 = SPI_FLASH_SendByte(Dummy_Byte); Temp2 = SPI_FLASH_SendByte(Dummy_Byte); /*????SPI_FLASH??????????*/ SPI_FLASH_CS_HIGH(); Temp = (Temp0 << 16) | (Temp1 << 8) | Temp2; return Temp; } void SPI_FLASH_Test(void) { __IO uint32_t FlashID = 0; __IO uint32_t DeviceID = 0; /*????SPI_Flash??ID*/ FlashID = SPI_FLASH_ReadID(); printf("\r\n ??????ID?? 0x%X", FlashID); /* ??????????SPI_Flash??ID??·????· */ // if ((FlashID == W25X16_FLASH_ID)) { /* ????SPI FLASH???????? */ SPI_FLASH_SectorErase(FLASH_SectorToErase); printf("\r\n ????SPI FLASH????????: %s", Tx_Buffer); /* ??Tx_Buffer??????SPI FLASH?? */ SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize); /* ??SPI FLASH??????????*/ SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize); /* ?ì?é??????????????????????·????? */ TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize); if(PASSED == TransferStatus1) { printf("\r\n ??????????????????????!\n\r"); } else { printf("\r\n ?í?ó-->????????????????????????!\n\r"); } /* ????SPI FLASH???????? */ SPI_FLASH_SectorErase(FLASH_SectorToErase); /* ??SPI FLASH??????????*/ SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize); /* ?ì?é??????????????·????· */ for (Index = 0; Index < BufferSize; Index++) { if (Rx_Buffer[Index] != 0xFF) { TransferStatus2 = FAILED; } } if(PASSED == TransferStatus2) { printf("\r\n ?????ó??????????0xFF?????·!\n\r"); } else { printf("\r\n ?í?ó-->?????ó????????????0xFF!\n\r"); } if((PASSED == TransferStatus1) && (PASSED == TransferStatus2)) { printf("\r\n W25x16???????é????!\n\r"); } else { printf("\r\n W25x16???????é?§°?!\n\r"); } } // else // { // printf("\r\n W25x16???????é?§°?!\n\r"); // } /*SPI FLASH????????????*/ SPI_Flash_PowerDown(); }[/mw_shl_code]
我的板子上是w25q16芯片,w25Q64的外围电路是照着这个弄得,应该合适的吧 怎么连ID都读不出来……板子上的芯片用惯了,实际用个芯片感觉好难!

W25Q16_W2XQ16.rar

2.49 MB, 下载次数: 2024

最佳答案

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

我们就有驱动W25Q64的代码,比如战舰板的SPI例程,参考下了。
总有一天,要为自由而活
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-19 09:38:45 | 显示全部楼层
我们就有驱动W25Q64的代码,比如战舰板的SPI例程,参考下了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2014-12-19 09:38:45 | 显示全部楼层
回复【12楼】八度空间:
---------------------------------
呵呵,谢谢你的解答,终于调出来了! 竟然是初始化时没有把SPI引脚拉高(GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);),但是试验箱上并没有拉高,为什么也可以出来?哈哈,反正出来了,字库终于写进去了!
总有一天,要为自由而活
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-12-19 12:43:43 | 显示全部楼层
你这个函数的代码发上来看下SPI_FLASH_SendByte()
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2014-12-19 16:40:10 | 显示全部楼层
回复【2楼】八度空间:
---------------------------------
u8 SPI_FLASH_SendByte(u8 byte)
{
    /* Loop while DR register in not emplty */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

    /* Send byte through the SPI1 peripheral */
    SPI_I2S_SendData(SPI1, byte);

    /* Wait to receive a byte */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

    /* Return the byte read from the SPI bus */
    return SPI_I2S_ReceiveData(SPI1);
}
总有一天,要为自由而活
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2014-12-19 17:23:08 | 显示全部楼层
回复【2楼】八度空间:
---------------------------------
老师,我上面那个电路用到w25Q64合适吗
总有一天,要为自由而活
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-12-19 17:51:37 | 显示全部楼层
回复【4楼】LIUYABO:
---------------------------------
完全可以,管脚兼容的,华邦那几个厮
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2014-12-19 17:53:20 | 显示全部楼层
回复【5楼】八度空间:
---------------------------------
谢谢了,我再试试看是不是硬件的问题
总有一天,要为自由而活
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2014-12-19 21:45:03 | 显示全部楼层
回复【5楼】八度空间:
---------------------------------
电路我测了没问题啊,和上面图中一样的。但是程序烧进去就是读写失败,我直接改了个CS片选,其他引脚和板子上的w25Q16共用SPI1引脚,为什么就是不行呢,大神有没有高招啊,教教我
总有一天,要为自由而活
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2014-12-19 22:39:46 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
其实我的意思是我外扩的W25Q64和板子上的w25Q16共用SPI1引脚,不过把CS改成了另一个引脚这样没问题吧
总有一天,要为自由而活
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-19 23:06:43 | 显示全部楼层
回复【9楼】LIUYABO:
---------------------------------
可以的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-19 23:07:43 | 显示全部楼层
回复【9楼】LIUYABO:
---------------------------------
可以
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-12-20 11:54:35 | 显示全部楼层
回复【7楼】LIUYABO:
---------------------------------
只要片选不公用即可,其他无所谓,不要同时选中两个片选就行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2014-12-20 18:42:09 | 显示全部楼层
难道是我的芯片烧坏了,不应该啊 ,我都试了3片了,用万用表把每个引脚都测了的啊 ,用电热风吹吹上去的,才100多度啊。难道还要给SPI线接上拉电阻吗?
总有一天,要为自由而活
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2014-12-21 14:24:41 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
呵呵,谢谢原子哥的解答,终于调出来了! 竟然是初始化时没有把SPI引脚拉高(GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);),但是试验箱上并没有拉高,为什么也可以出来?哈哈,反正出来了,字库终于写进去了!
总有一天,要为自由而活
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
发表于 2015-10-24 21:40:31 | 显示全部楼层
回复【15楼】LIUYABO:
---------------------------------
什么意思,怎么还跟初始化有关系,不是引脚复用了吗?
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-4-20
在线时间
4 小时
发表于 2016-4-21 11:43:55 | 显示全部楼层
LIUYABO 发表于 2014-12-19 09:38
回复【12楼】八度空间:
---------------------------------
呵呵,谢谢你的解答,终于调出来了!&nbsp;竟然 ...

我的ID没问题,但是读写数据怎么不行啊?我的程序和你的一样
SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);
TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
根本读不到数据,为什么?大神,帮帮忙把。。。。。。。。。
回复

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
 楼主| 发表于 2017-6-16 19:54:32 | 显示全部楼层
zi_yang 发表于 2015-10-24 21:40
回复【15楼】LIUYABO:
---------------------------------
什么意思,怎么还跟初始化有关系,不是引脚复用 ...

初始引脚状态和SPI的时序要一致
总有一天,要为自由而活
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-7
在线时间
7 小时
发表于 2017-12-25 09:59:03 | 显示全部楼层
ning23 发表于 2016-4-21 11:43
我的ID没问题,但是读写数据怎么不行啊?我的程序和你的一样
SPI_FLASH_BufferRead(Rx_Buffer, FLASH_Re ...

我的也是,读ID可以,读数据出来全是0.后来测试了,擦除的之后FLASH的状态寄存器会告擦除错误。你的问题后来是怎么解决的?大家有没有遇到过这种情况
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2018-8-15
在线时间
6 小时
发表于 2018-8-15 04:47:43 | 显示全部楼层
我是用原子哥的程序一个字都没动。
但是mcu换成了F103VET6(100脚的),flash换成了W25Q64,一直读不到ID
回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2018-8-15
在线时间
6 小时
发表于 2018-8-16 01:35:31 | 显示全部楼层
终于搞定,是我片选线搞错了。(跟一个LCD屏共用了SPI2,但是我自己搞反了两者片选线,一直忽略了这一点,折腾了足足两天才突然想起来)
回复

使用道具 举报

9

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1690
金钱
1690
注册时间
2014-7-8
在线时间
182 小时
发表于 2019-1-10 16:59:52 | 显示全部楼层
MARK,先谢谢了!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 00:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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