OpenEdv-开源电子网

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

W25Q128 无法读到设备ID 读到的数据全为0xff

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-1-24
在线时间
6 小时
发表于 2018-1-25 23:23:59 | 显示全部楼层 |阅读模式
1金钱
W25Q128 完全按照原子的设置来配置SPI2,但无法读到设备ID ,读到的数据全为0xff,使用调试功能发现SPI2->DR寄存器里的值一直都为0xff,即使写入0x00,依旧只能读到0xff
有人碰到过类似的情况吗?

最佳答案

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

已解决,重写下就搞定了,逐字核对代码完全一样,完全搞不清楚原因,可能是某个地方粗心没检测出来吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-1-24
在线时间
6 小时
 楼主| 发表于 2018-1-25 23:24:00 | 显示全部楼层
已解决,重写下就搞定了,逐字核对代码完全一样,完全搞不清楚原因,可能是某个地方粗心没检测出来吧
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-1-26 01:13:30 | 显示全部楼层
说明你驱动就有问题啊
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2018-1-26 08:51:48 | 显示全部楼层
1、抓波形2、贴上你的代码吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-1-24
在线时间
6 小时
 楼主| 发表于 2018-1-26 12:24:44 | 显示全部楼层
正点原子 发表于 2018-1-26 01:13
说明你驱动就有问题啊

驱动是直接移植资料A盘里的程序,基本未做改动,看了波形,NSS,CLK,MOSI都正常,只有MISO的信号波形非常乱。
代码如下:
void W25QXX_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  // PB12 推挽
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_12);

        SPI2_Init();                           //初始化SPI
        SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式
        uint16_t aa =W25QXX_ReadID();//读取FLASH ID.
}

void SPI2_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

        GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                //串行同步时钟的空闲状态为高电平
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

        SPI_Cmd(SPI2, ENABLE); //使能SPI外设

        SPI2_ReadWriteByte(0xff);//启动传输


}
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
  assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
        SPI2->CR1&=0XFFC7;
        SPI2->CR1|=SPI_BaudRatePrescaler;        //设置SPI2速度
        SPI_Cmd(SPI2,ENABLE);

}
u8 SPI2_ReadWriteByte(u8 TxData)
{
        u8 retry=0;
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
                {
                retry++;
                if(retry>200)return 0;
                }
        SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
        retry=0;

        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
                {
                retry++;
                if(retry>200)return 0;
                }
        return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据
}

u16 W25QXX_ReadID(void)
{
        u16 Temp = 0;
//        W25QXX_CS=0;
        SET_CS_LOW();
        SPI2_ReadWriteByte(0x90);//发送读取ID命令
        SPI2_ReadWriteByte(0x00);
        SPI2_ReadWriteByte(0x00);
        SPI2_ReadWriteByte(0x00);
        Temp|=SPI2_ReadWriteByte(0xFF)<<8;
        Temp|=SPI2_ReadWriteByte(0xFF);
//        W25QXX_CS=1;
        SET_CS_HIGH();
        return Temp;
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-1-27 00:47:27 | 显示全部楼层
naimo 发表于 2018-1-26 12:24
驱动是直接移植资料A盘里的程序,基本未做改动,看了波形,NSS,CLK,MOSI都正常,只有MISO的信号波形非常 ...

那你用的是不是我们板子啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

22

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-1-16
在线时间
74 小时
发表于 2018-1-27 10:56:15 | 显示全部楼层
楼主能说一下这个函数是什么意思吗?

SPI2_ReadWriteByte(0xff);//启动传输

这个函数控制的DR寄存器具体是怎么运行的?
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-1-24
在线时间
6 小时
 楼主| 发表于 2018-1-29 20:48:51 | 显示全部楼层
Miracle223 发表于 2018-1-27 10:56
楼主能说一下这个函数是什么意思吗?

SPI2_ReadWriteByte(0xff);//启动传输

由于SPI工作的特性,是双向传输的,当有一个字节的数据被发送出去后,就会收到一个字节的反馈
回复

使用道具 举报

22

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-1-16
在线时间
74 小时
发表于 2018-1-30 08:03:17 | 显示全部楼层
naimo 发表于 2018-1-29 20:48
由于SPI工作的特性,是双向传输的,当有一个字节的数据被发送出去后,就会收到一个字节的反馈

不管我写入的是啥,反回的一直都是0
回复

使用道具 举报

0

主题

39

帖子

0

精华

高级会员

Rank: 4

积分
501
金钱
501
注册时间
2017-4-14
在线时间
56 小时
发表于 2018-1-30 08:22:14 | 显示全部楼层
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-1-24
在线时间
6 小时
 楼主| 发表于 2018-1-30 10:08:43 | 显示全部楼层
Miracle223 发表于 2018-1-30 08:03
不管我写入的是啥,反回的一直都是0

有示波器吗?看下SPI的波形,看看NSS,CLK,MOSI这三个引脚是否有波形
回复

使用道具 举报

22

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-1-16
在线时间
74 小时
发表于 2018-1-30 11:15:11 | 显示全部楼层
naimo 发表于 2018-1-30 10:08
有示波器吗?看下SPI的波形,看看NSS,CLK,MOSI这三个引脚是否有波形

能说一下用什么上位机看波形吗?
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-1-24
在线时间
6 小时
 楼主| 发表于 2018-1-30 11:36:04 | 显示全部楼层
Miracle223 发表于 2018-1-30 11:15
能说一下用什么上位机看波形吗?

。。。。示波器就行,物理的,实体的示波器,不用上位机
回复

使用道具 举报

22

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-1-16
在线时间
74 小时
发表于 2018-1-30 11:40:24 | 显示全部楼层
naimo 发表于 2018-1-30 11:36
。。。。示波器就行,物理的,实体的示波器,不用上位机

好吧,,这种东西真搞不到,,还是谢谢老哥指点
回复

使用道具 举报

4

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2018-1-5
在线时间
56 小时
发表于 2020-8-4 19:21:49 | 显示全部楼层
我也遇到了这个问题,请问怎么解决的
回复

使用道具 举报

4

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2018-1-5
在线时间
56 小时
发表于 2020-8-4 19:22:41 | 显示全部楼层
同样的电路,同样的程序,驱动W25Q128FVSIG就行,但是驱动W25Q128JVSIQ就不行
回复

使用道具 举报

5

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1793
金钱
1793
注册时间
2015-3-13
在线时间
273 小时
发表于 2022-1-13 23:05:00 | 显示全部楼层
楼主的问题解决了吗?    我也是W25Q128只能读不能写?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 17:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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