找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5552|回复: 2
打印 上一主题 下一主题
收起左侧

w25q64第一次读状态寄存器有时候失灵,stm32平台

[复制链接]
跳转到指定楼层
楼主
ID:98591 发表于 2018-4-29 20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上电后,stm32f103——spi接口第一次读取25q64的的状态寄存器,全速运行,会一直读不到状态寄存器,读到0xff。使用swd调试单步运行时,读2-5次就能读出来了。
能读出来后再次读就能正常读了。下载到板子上运行,有时候能正常,有时候又读不到导致卡死在程序的循环里。
感觉我的程序好像没问题啊,尝试了好多方法,还是这样。不知道是不是ic的问题。
//SPI2_FLAG_BSY这些都是我对寄存器位操作代码封装的宏定义,字面理解,spi2的标志位_忙位&bit1(x)


#include <gpioG.h>
#include <map.h>
#include <spi2.h>
u8 w2564_sr()//返回状态寄存器的值
{
        while(SPI2_FLAG_BSY);//SPI2_FLAG_BSY这些都是我对寄存器位操作代码封装的宏定义
        PG13OUT=0;     //gpio手动控制w2564片选电平=0
        
SPI2_DR(0X05);//命令:读状态寄存器
        while(!SPI2_FLAG_TXE);
        while(SPI2_FLAG_BSY);
        SPI2_DR(0X55);//发送一个无效数据,为从设备输出数据提供时钟
        while(!SPI2_FLAG_TXE);
        while(SPI2_FLAG_BSY);       
        PG13OUT=1;
        return (SPI2->DR);
}
void delay_busy()
{
        u8 k;
loop:        k=w2564_sr();//经常全速运行会死在这个循环里,要单步执行才出的来,脱机板子上运行时来时不来
        if(k&0x01)      //检查是否处于忙状态
                goto loop;
}
整个程序贴出来面积太大,就不贴了。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:391781 发表于 2021-3-5 11:08 | 只看该作者
我也遇到这个问题。有大佬知道怎么回事吗
回复

使用道具 举报

板凳
ID:391781 发表于 2021-3-5 11:18 | 只看该作者
void SPI_FLASH_WaitForWriteEnd(void)
{
  uint8_t FLASH_Status = 0;

  SPI_FLASH_CS_LOW();

  SPI_FLASH_SendByte(0x05);

  do
  {
    FLASH_Status = SPI_FLASH_SendByte(Dummy_Byte);             //此处断点,循环读出FLASH_Status =0xFF,导致卡死在这里。
  }
  while ((FLASH_Status & WIP_Flag) == SET); /* Write in progress */

  SPI_FLASH_CS_HIGH();
}

其中WIP_Flag=0x01;  
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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