OpenEdv-开源电子网

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

请教SPI读取W25Q128的ID值始终不正确

[复制链接]

0

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-1-22
在线时间
2 小时
发表于 2022-3-10 18:24:36 | 显示全部楼层 |阅读模式
本帖最后由 shunshunfei 于 2022-3-10 18:27 编辑

代码
#include "SPI.h"


void SPI_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        SPI_InitTypeDef  SPI_InitStruct;
        
        //使能SPI时钟
        SPI_APBxClock (SPI_CLK,ENABLE);
        //使能SPI引脚相关的引脚时钟
        RCC_APB2PeriphClockCmd(SPI_CS_CLK|SPI_SCK_CLK|SPI_MISO_CLK|SPI_MOSI_CLK ,ENABLE);
        //配置SPI_CLK的引脚
        GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Pin=SPI_SCK_PIN;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(SPI_SCK_PORT,&GPIO_InitStruct);
        //配置SPI_MOSI的引脚
        GPIO_InitStruct.GPIO_Pin=SPI_MOSI_PIN;
        GPIO_Init(SPI_MOSI_PORT,&GPIO_InitStruct);
        //配置SPI_MISO的引脚

        GPIO_InitStruct.GPIO_Pin=SPI_MISO_PIN;
        GPIO_Init(SPI_MISO_PORT,&GPIO_InitStruct);
        
        //配置SPI_CS的引脚
        GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin=SPI_CS_PIN;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(SPI_CS_PORT,&GPIO_InitStruct);
        
        //配置SPI的模式
        SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
        SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;
        SPI_InitStruct.SPI_CPOL= SPI_CPOL_High;
        SPI_InitStruct.SPI_CRCPolynomial=7;
        SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
        SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
        SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
        SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
        SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
        SPI_Init(SPIx,&SPI_InitStruct);
        
        SPI_Cmd(SPIx,ENABLE);
}

//收发一个字节数据
uint8_t SPI_Flash_WR_Byte(uint8_t data)
{
        uint16_t SPI_wait_time=wait_time;
        while(SPI_I2S_GetFlagStatus(SPIx,SPI_I2S_FLAG_TXE)==RESET)
        {
                if((SPI_wait_time--)==0)
                {
                        return Wait_Time_Callback(0);
                }
        }
        SPI_wait_time=wait_time;
        SPI_I2S_SendData(SPIx,data);
        while(SPI_I2S_GetFlagStatus(SPIx,SPI_I2S_FLAG_RXNE)==RESET)
        {
                if((SPI_wait_time--)==0)
                {
                        return Wait_Time_Callback(1);
                }
        }
        return SPI_I2S_ReceiveData(SPIx);
}

//读取FLASH的ID号
uint32_t Read_SPI_ID(void)
{
        uint32_t FLASH_ID=0;
        SPI_CS_LOW();
        SPI_Flash_WR_Byte(W25X_JedecDeviceID);
        FLASH_ID=SPI_Flash_WR_Byte(Dummy_Byte);
        FLASH_ID<<=8;
        FLASH_ID|=SPI_Flash_WR_Byte(Dummy_Byte);
        FLASH_ID<<=8;
        FLASH_ID|=SPI_Flash_WR_Byte(Dummy_Byte);
        SPI_CS_HIGH();
        return FLASH_ID;
}
uint8_t Wait_Time_Callback(uint8_t errorCode)
{
  //等待超时后的处理,输出错误信息
  printf("SPI 等待超时!errorCode = %d",errorCode);
  return 0;
}




#include "stm32f10x.h"  
#include "SPI.h"
int main(void)
{
        uint32_t ID=0;
        SPI_Config();
        usartconfig();
        printf("这是一个SPI实验:\n");
        ID=Read_SPI_ID();
        printf("ID=0x%x\n",ID);
        while(1)
        {
        }
}
串口输出结果
ID=0x522118


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-3-11
在线时间
1 小时
发表于 2022-3-21 14:14:32 | 显示全部楼层
兄弟,这问题解决了吗
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2022-3-11
在线时间
1 小时
发表于 2022-3-21 14:16:38 | 显示全部楼层
19163404369 发表于 2022-3-21 14:14
兄弟,这问题解决了吗

我的是有时输出0x522118,有时是0x0
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2022-3-26
在线时间
4 小时
发表于 2022-3-27 00:11:31 | 显示全部楼层
同上,请各位大哥帮忙看看
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2023-3-7
在线时间
6 小时
发表于 2023-3-7 20:57:36 | 显示全部楼层
兄弟我也是
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2023-3-1
在线时间
5 小时
发表于 2023-3-21 14:33:04 | 显示全部楼层
看一下SPI配置,时钟速率是否合适
回复 支持 反对

使用道具 举报

5

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2023-2-5
在线时间
8 小时
发表于 2023-6-11 22:44:35 | 显示全部楼层
我也是,该怎么解决啊
回复 支持 反对

使用道具 举报

54

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1040
金钱
1040
注册时间
2022-4-20
在线时间
373 小时
发表于 2023-6-14 10:10:59 | 显示全部楼层
弹星者1911 发表于 2023-6-11 22:44
我也是,该怎么解决啊

如果配置没问题的话,可以尝试反复读取ID
比如:
  1. while(某个条件)
  2. {
  3.   读ID;
  4. }
  5. 循环结束,打印ID;
复制代码
又菜又爱指点
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2023-9-5
在线时间
1 小时
发表于 2023-9-5 17:00:52 | 显示全部楼层
我读出来的地址好像是 0x5217
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 17:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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