GD32F303ZET6替代STM32F103ZET6时读写SPI flash W25Q128失败的处理

        今天是第二次来处理GD32F303ZET6读写W25Q128异常的问题了,之前就是因为这个问题耽误了半天的时间,后来不得不换回STM32F103ZET6。

       原STM32F103ZET6读写W25Q128是使用硬件SPI,初始化硬件SPI后会读取W25Q128的ID,在替换成GD32F303ZET6后,直接运行程序,读不到ID,更别说写入和读取数据了。后根据网上搜到的资料(直接搜索比较快),需要把SPI的MISO设置为浮空输入,STM32无要求,不过设置后依然读不到ID,然后又找到这么一条指令:

SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF);
//对选中的SPI的接收FIFO的阈值进行配置
//参考:GD32F303 驱动 W25Q64 - 走看看

        but,STM32的头文件中没有,GD的头文件中也没有,查看GD32F30x的用户手册,并没有关于SPI接收阈值的配置寄存器。不得不放弃这个方案。(头大)

       讲真,查找这些硬件接口异常的问题,还是得借助示波器。

       其实在最开始找关于GD替换STM的一些资料时,就提到了频率的问题,所以在改了MISO为浮空输入后,也把SPI的分频系数改大了,降低了SPI时钟频率,原来的分频系数是:

SPI2_SetSpeed(SPI_BaudRatePrescaler_2);

改为

SPI2_SetSpeed(SPI_BaudRatePrescaler_256);

单步调试进入初始化部分时能够读到W25Q128的ID的,但是后面读写数据依然失败,后来顺着程序往后看,在SPI的读写函数SPI2_ReadWriteByte(u8 TxData);中想到了发送和接收的间隔时间是不是不太够,于是乎在发送后加了个100us的延时,额,WC,居然读写正常了。不过带来的问题就是在读写W25Q128时会致使整个程序卡顿约1S,按键体检就不好了。后来使用ucosIII的带可切换任务的延时函数时,貌似没有有效的执行延时,读写还是失败。。。。。。正当焦头烂额之际,想到了有篇文章提到的“GD32驱动W25Q128时不要使用SPI_I2S_FLAG_BSY位来判断W25Q128的状态”,抱着试一试的态度改了一下。。。。。。奇迹发生了,读写正常,按键也不卡顿了,再把SPI的频率改回SPI_BaudRatePrescaler_2后,效果依然好。修改如下:

u8 SPI2_ReadWriteByte(u8 TxData)
{        
    u32 源程序=0;        
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
        {
        retry++;
        if(retry>20000)return 0;
        }              
    SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
    retry=0;
        
    //增加忙标志判断,解决GD32F303ZET6读写W25Q128失败的问题
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
        {
        retry++;
        if(retry>20000)return 0;
        }    
        retry=0;


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

源程序中retry是u8类型,最大值200,改为u32类型,最大值20000,实际调试中,SPI_I2S_FLAG_BSY等待中,retry值很小,基本在个位数,即解决了问题,又不影响整体时效。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值