OpenEdv-开源电子网

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

w25q64 ID读取不对但可以写入和读取数据

[复制链接]

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-6-23
在线时间
10 小时
发表于 2020-6-24 14:10:47 | 显示全部楼层 |阅读模式
1金钱
FLASH的ID应该是0xEF4017,为什么我读出来的是0x684017,而且后面写入和读取数据的时候,是没有问题的,请问这是哪里的问题,帮忙看一下
这是主函数:
  1. #include "stm32f10x.h"
  2. #include "bsp_usart.h"
  3. #include "bsp_spi_flash.h"

  4. uint8_t Readbuff[256];
  5. uint8_t Writebuff[256];

  6. int main(void)
  7. {
  8.         uint32_t id;
  9.         uint8_t i=0;
  10.         USART_Config();
  11.         printf("\n这是一个SPI_FLASH通讯试验\n");
  12.         SPI_FLASH_Config();       
  13.         id = SPI_Read_ID();
  14.         printf("id=0x%x \r\n",id);
  15.         SPI_Erase_Sector(0);
  16.         for(i=0; i<255; i++)
  17.         {
  18.                 Writebuff[i]=i;
  19.         }
  20.         SPI_Write_Data(0, Writebuff, 256);
  21.         SPI_Read_Data(0, Readbuff, 256);
  22.         for(i=0; i<255; i++)
  23.         {
  24.                 printf("0x%x ",Readbuff[i]);
  25.                 if(i%16 == 0)
  26.                         printf("\r\n");
  27.         }
  28.         while(1)
  29.         {
  30.                
  31.         }
  32. }
复制代码
下面是SPI_FLASH的函数:
  1. #include "bsp_spi_flash.h"

  2. void SPI_FLASH_Config(void)
  3. {
  4.         GPIO_InitTypeDef  GPIO_InitStructure;
  5.         SPI_InitTypeDef          SPI_InitStructure;
  6.        
  7.         //打开GPIO时钟
  8.         FLASH_SPI_GPIO_APBxClkCmd(FLASH_SPI_SDA_GPIO_CLK,ENABLE);
  9.         //打开I2C外设时钟
  10.         FLASH_SPI_APBxClkCmd(FLASH_SPI_CLK,ENABLE);
  11.        
  12.         // 将SPI_SCK的GPIO配置为推挽复用输出模式
  13.         GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_GPIO_PIN;
  14.         GPIO_Init(FLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
  15.         // 将SPI_MISO的GPIO配置为推挽复用输出模式
  16.         GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_GPIO_PIN;
  17.         GPIO_Init(FLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
  18.         // 将SPI_MOSI的GPIO配置为推挽复用输出模式
  19.         GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_GPIO_PIN;
  20.         GPIO_Init(FLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
  21.         // 将SPI_CS的GPIO配置为推挽普通输出模式(软件控制)
  22.         GPIO_InitStructure.GPIO_Pin = FLASH_SPI_CS_GPIO_PIN;
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_Init(FLASH_SPI_CS_GPIO_PORT, &GPIO_InitStructure);
  26.        
  27.         FLASH_SPI_CS_HIGH;
  28.        
  29.         //配置SPI的工作参数
  30.         //波特率配置为2分频18M
  31.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  32.         //时钟模式配置为模式3
  33.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  34.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  35.         //不使用CRC校验,赋值无效
  36.         SPI_InitStructure.SPI_CRCPolynomial = 0;
  37.         //数据宽度为8位
  38.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  39.         //传输方向配置为双线双向通信
  40.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  41.         //数据配置高位先行
  42.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  43.         //模式配置为主机模式
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  45.         //CS线使用软件控制
  46.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  47.        
  48.         //初始化SPI
  49.         SPI_Init(FLASH_SPIx,&SPI_InitStructure);
  50.         //使能SPI
  51.         SPI_Cmd(FLASH_SPIx, ENABLE);
  52. }
  53. //发送并接收数据
  54. uint8_t SPI_FLASH_Seng_Byte(uint8_t data)
  55. {
  56.         //检测并等待TX发送缓冲区为空
  57.         while(SPI_I2S_GetFlagStatus(FLASH_SPIx,SPI_I2S_FLAG_TXE) == RESET);
  58.         //发送数据
  59.         SPI_I2S_SendData (FLASH_SPIx, data);
  60.         //检测并等待RX接收缓冲区为非空
  61.         while(SPI_I2S_GetFlagStatus(FLASH_SPIx,SPI_I2S_FLAG_RXNE) == RESET);
  62.         //接收数据
  63.         return SPI_I2S_ReceiveData(FLASH_SPIx);
  64. }

  65. //等待FLASH传输结束
  66. void SPI_WaitForWriteEnd()
  67. {
  68.         uint8_t status_reg;
  69.         FLASH_SPI_CS_LOW;
  70.         SPI_FLASH_Seng_Byte(READ_STATUS);
  71.         do{
  72.                 status_reg = SPI_FLASH_Seng_Byte(DUMMY);
  73.         }while((status_reg&0x01) == 1);
  74.         FLASH_SPI_CS_HIGH;
  75. }
  76. //写使能,每次写之前都要操作
  77. void SPI_Write_Enable()
  78. {
  79.         FLASH_SPI_CS_LOW;
  80.         SPI_FLASH_Seng_Byte(WRITE_ENABLE);
  81.         FLASH_SPI_CS_HIGH;
  82. }
  83. //读取flash的ID号
  84. uint32_t SPI_Read_ID(void)
  85. {
  86.         uint32_t FLASH_ID = 0;
  87.         FLASH_SPI_CS_LOW;
  88.         SPI_FLASH_Seng_Byte(READ_JEDEC_ID);
  89.         FLASH_ID = SPI_FLASH_Seng_Byte(DUMMY);
  90.         FLASH_ID <<= 8;
  91.         FLASH_ID |= SPI_FLASH_Seng_Byte(DUMMY);
  92.         FLASH_ID <<= 8;
  93.         FLASH_ID |= SPI_FLASH_Seng_Byte(DUMMY);
  94.         FLASH_SPI_CS_HIGH;
  95.         return FLASH_ID;
  96. }
  97. //擦除指定扇区
  98. void SPI_Erase_Sector(uint32_t addr)
  99. {
  100.         SPI_Write_Enable();
  101.         SPI_WaitForWriteEnd();
  102.         FLASH_SPI_CS_LOW;
  103.         SPI_FLASH_Seng_Byte(Sector_Erase);
  104.         SPI_FLASH_Seng_Byte((addr>>16)&0xff);
  105.         SPI_FLASH_Seng_Byte((addr>>8)&0xff);
  106.         SPI_FLASH_Seng_Byte(addr&0xff);
  107.         FLASH_SPI_CS_HIGH;
  108.         SPI_WaitForWriteEnd();
  109. }
  110. //读取FLASH数据
  111. void SPI_Read_Data(uint32_t addr, uint8_t *Readbuff, uint32_t NumByteToRead)
  112. {
  113.         FLASH_SPI_CS_LOW;
  114.         SPI_FLASH_Seng_Byte(READ_DATA);
  115.         SPI_FLASH_Seng_Byte((addr>>16)&0xff);
  116.         SPI_FLASH_Seng_Byte((addr>>8)&0xff);
  117.         SPI_FLASH_Seng_Byte(addr&0xff);
  118.         while(NumByteToRead--)
  119.         {
  120.                 *Readbuff = SPI_FLASH_Seng_Byte(DUMMY);
  121.                 Readbuff++;
  122.         }
  123.         FLASH_SPI_CS_HIGH;
  124.         SPI_WaitForWriteEnd();
  125. }
  126. //写FLASH数据
  127. void SPI_Write_Data(uint32_t addr, uint8_t *Writebuff, uint32_t NumByteToWrite)
  128. {
  129.         SPI_Write_Enable();
  130.         SPI_WaitForWriteEnd();
  131.         FLASH_SPI_CS_LOW;
  132.         SPI_FLASH_Seng_Byte(WRITE_DATA);
  133.         SPI_FLASH_Seng_Byte((addr>>16)&0xff);
  134.         SPI_FLASH_Seng_Byte((addr>>8)&0xff);
  135.         SPI_FLASH_Seng_Byte(addr&0xff);
  136.         while(NumByteToWrite--)
  137.         {
  138.                 SPI_FLASH_Seng_Byte(*Writebuff);
  139.                 Writebuff++;
  140.         }
  141.         FLASH_SPI_CS_HIGH;
  142.         SPI_WaitForWriteEnd();
  143. }

复制代码


1592978635(1).jpg

最佳答案

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

0x684017应该不是W25Q64芯片,应该是BY25Q64芯片,因为测试过这家FLASH芯片
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-6-24 14:10:48 | 显示全部楼层
0x684017应该不是W25Q64芯片,应该是BY25Q64芯片,因为测试过这家FLASH芯片
一分耕耘一分收获。
回复

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-6-23
在线时间
10 小时
 楼主| 发表于 2020-6-24 14:12:44 | 显示全部楼层
最后一张是用串口读出来的,可以看到读出来的ID是0x684017      后面的数据写入是0x00-0xfe,读出来的也是对的。
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4930
金钱
4930
注册时间
2015-1-10
在线时间
618 小时
发表于 2020-6-24 15:21:48 | 显示全部楼层
本帖最后由 阿侑kevin 于 2020-6-24 15:22 编辑

我猜片子是仿的,就是差点证据
回复

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-6-23
在线时间
10 小时
 楼主| 发表于 2020-6-24 15:28:07 | 显示全部楼层
zhangxiaoxin 发表于 2020-6-24 14:12
最后一张是用串口读出来的,可以看到读出来的ID是0x684017      后面的数据写入是0x00-0xfe,读出来的也是 ...

你的意思是w25q64这个芯片是仿的,不是正品,所以厂商ID不对吗
回复

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2020-6-23
在线时间
10 小时
 楼主| 发表于 2020-6-24 17:03:57 | 显示全部楼层
yklstudent 发表于 2020-6-24 16:00
0x684017应该不是W25Q64芯片,应该是BY25Q64芯片,因为测试过这家FLASH芯片

老哥稳啊,仔细看了一下丝印,Boyamicro25q64ASSIG,  然后查了一下某宝,确实是你说的这个型号
不过无所谓了,现在FLASH读ID和读写全部是0,我感觉我已经把他烧掉了,重新买一个
还是谢谢老哥
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 00:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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