OpenEdv-开源电子网

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

求助:原子哥例程写W25Q16死在while

[复制链接]

2

主题

16

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-3-2
在线时间
6 小时
发表于 2017-3-2 10:28:09 | 显示全部楼层 |阅读模式
1金钱
求助,搞了3天了,多谢!
编译环境:ECLIPSE+GCC
移植的HAL库例程,操作W25Q16, 总是死在读寄存器的While循环里。 完全移植的原子哥的例程。
是编译器问题?编译器优化选项选择的None。
1,死在下面的While里,  我加了一个指示灯,一直在闪。 函数ReadSR返回的byte我用串口发出来是08。按道理不应该停在while里?
2,第二个问题是读W25Q16寄存器1值是08,  写入00,读出来还是08。。。。。?  写函数也是例程中的函数。
3,W25Q16读倒是能读,全是FF。


//等待空闲
void W25QXX_Wait_Busy(void)
{
        while((W25QXX_ReadSR(1)&0x01)==0x01);   // 等待BUSY位清空
        //Delay(200);
}

uint8_t W25QXX_ReadSR(uint8_t regno)
{
        uint8_t byte=0,command=0;
    switch(regno)
    {
        case 1:
            command=W25X_ReadStatusReg1;    //读状态寄存器1指令
            break;
        case 2:
            command=W25X_ReadStatusReg2;    //读状态寄存器2指令
            break;
        case 3:
            command=W25X_ReadStatusReg3;    //读状态寄存器3指令
            break;
        default:
            command=W25X_ReadStatusReg1;
            break;
    }
        W25QXX_CS_L;//使能器件
        Led2_on();
        Delay(100);
        SPI1_ReadWriteByte(command);            //发送读取状态寄存器命令
        byte=SPI1_ReadWriteByte(0Xff);          //读取一个字节
        W25QXX_CS_H;//取消片选
        Led2_off();
        Delay(100);
        return byte;
}

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

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-3-2
在线时间
6 小时
 楼主| 发表于 2017-3-2 19:21:03 | 显示全部楼层
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-3-2
在线时间
6 小时
 楼主| 发表于 2017-3-2 23:32:14 | 显示全部楼层
看来真是无解了……:(
回复

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2017-3-3 09:51:34 | 显示全部楼层
void w25qxx_wake_up(void)   
{  
        W25QXX_CS_PIN_WRITE(0);       
                           
        spi_read_write_byte(W25X_WAKE_UP);

        W25QXX_CS_PIN_WRITE(1);  
        delay_us(1);
}
试下这句话
态度决定一切
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-3-2
在线时间
6 小时
 楼主| 发表于 2017-3-6 15:58:55 来自手机 | 显示全部楼层
冰封嗜魔 发表于 2017-3-3 09:51
void w25qxx_wake_up(void)   
{  
        W25QXX_CS_PIN_WRITE(0);       

多谢,我试一下。
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2017-3-6 16:15:48 | 显示全部楼层
一直是BUSY,要看下你的外围电路,是不是没有释放总线。
首先看下SPI你的几个IO口是不是模式设置对了,然后看原理图,是否IO都加了上拉。
当然如果用的是开发板,那就是软件的问题了。while里面加个超时退出试试。
活到老,学到老。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-3-2
在线时间
6 小时
 楼主| 发表于 2017-3-7 21:43:15 | 显示全部楼层
kingnike 发表于 2017-3-6 16:15
一直是BUSY,要看下你的外围电路,是不是没有释放总线。
首先看下SPI你的几个IO口是不是模式设置对了,然 ...

谢谢。  我不做读写的操作, 在main 里面指放  wait_busy 这个函数,也会死在里面。
我在wait_busy函数里用串口把 寄存器 的值发出来,发现=08,有点奇怪,最后一位busy确实是0, 但是就是跳不出while循环。。
我怀疑是不是Eclipse的GCC编译器对这个函数编译哪里出错了。 我改成全局变量,加上volatile都没用。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-3-2
在线时间
6 小时
 楼主| 发表于 2017-3-7 22:58:42 | 显示全部楼层
kingnike 发表于 2017-3-6 16:15
一直是BUSY,要看下你的外围电路,是不是没有释放总线。
首先看下SPI你的几个IO口是不是模式设置对了,然 ...

包括我写寄存器,写完了读出来, 然后用串口发出来=08, 貌似就是写不进去的样子。
W25QXX_Write_SR(1,0x00);
                W25QXX_Write_SR(2,0x00);

                temp=W25QXX_ReadSR(1);

                HAL_UART_Transmit_IT(&Uart1Handle,temp,1);
                        while((USART1_TX_STA&0x8000)!=0x8000)
                        {
                           ;
                        }
                        USART1_TX_STA=0;
                        temp=W25QXX_ReadSR(2);
                         HAL_UART_Transmit_IT(&Uart1Handle,temp,1);
                        while((USART1_TX_STA&0x8000)!=0x8000)
                        {
                           ;
                        }
                        USART1_TX_STA=0;
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-3-2
在线时间
6 小时
 楼主| 发表于 2017-3-7 23:01:41 | 显示全部楼层
冰封嗜魔 发表于 2017-3-3 09:51
void w25qxx_wake_up(void)   
{  
        W25QXX_CS_PIN_WRITE(0);       

不行啊。  我现在是2个问题,  第一个是写寄存器写不进去,读出来总是08,我上面的帖子有写。

第二个问题是貌似编译器对下面的函数过敏,W25QXX_ReadSR(1)=0x08, 但是while还会一直运行。
void W25QXX_Wait_Busy(void)
{
        while((W25QXX_ReadSR(1)&0x01)==0x01);   // 等待BUSY位清空
        //Delay(200);
}
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2017-3-8 08:31:03 | 显示全部楼层
你把代码弄上来,我在这边帮你验证一下,我是KEIL
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 02:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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