Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BSP
关于QSPI的BUG,以及BSP驱动W25Q256FV的问题
发布于 2020-06-19 08:48:37 浏览:3467
订阅该版
最近项目用来了QSPI驱动W25Q256FV这款芯片。 由于SFUD有这款芯片的驱动,就找了bsp stm32l475-atk-pandora下的port 烧录后的现象是可以识别芯片,但是读写不正常。 然后就仔细检查了port文件: 有bug的是下面一段代码 ```c void w25qxx_enter_qspi_mode(struct rt_qspi_device *device) { char status = 0; /* 0x38 enter qspi mode */ char instruction = 0x38; char write_status2_buf[2] = {0}; /* 0x31 write status register2 */ write_status2_buf[0] = 0x31; status = w25qxx_read_status_register2(device); if (!(status & 0x02)) { status |= 1 << 1; w25qxx_write_enable(device); write_status2_buf[1] = status; rt_qspi_send(device, &write_status2_buf, 2); rt_qspi_send(device, &instruction, 1); rt_kprintf("flash already enter qspi mode
"); rt_thread_mdelay(10); } } ``` `rt_qspi_send(device, &write_status2_buf, 2)` 是明显有问题的, 修改成`rt_qspi_send(device, write_status2_buf, 2);` 本以为问题就解决了,但是没想到还一直有问题。 没办法,接上逻辑分析仪,看了下时许, 发现`rt_qspi_send(device, write_status2_buf, 2)`这句spi没有发送对应指令,这个指令是开启QSPI,问题应该在这里。 一开始没想是内核代码的问题,一追踪才发现,QSPI内核代码有这样的判断 ```c if (length > 1) { if (device->config.medium_size > 0x1000000 && length >= 5) { /* medium size greater than 16Mb, address size is 4 Byte */ message.address.content = (ptr[1] << 24) | (ptr[2] << 16) | (ptr[3] << 8) | (ptr[4]); message.address.size = 32; message.address.qspi_lines = 1; count += 4; } else if (length >= 4) { /* address size is 3 Byte */ message.address.content = (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]); message.address.size = 24; message.address.qspi_lines = 1; count += 3; } else { return -RT_ERROR; } } ``` 所以当length>1后,内核认为一定存在address,所以对于2-3长度的数据都不予处理,直接报错, 所以这`rt_qspi_send(device, write_status2_buf, 2);`这句直接报错返回了。 这显然是不合理的,先不说在send函数中做了逻辑判断。 关键是qspi发送就不应该有这个逻辑,个人理解这里应该qspi内核的一个bug。 这里`rt_qspi_send(device, write_status2_buf, 2)`对应的是如下时序, ![20200619092423.jpg](/uploads/202006/19/092507sxptx3ynmd4d2nxy.jpg) 也是开启芯片QSPI的方法。 至于为什么有的人可以驱动成功,我也查了一些资料,有人说W25Q256有JV和FV两种,JV不需要开启QSPI就可以用QSPI读取,而FV需要开启,不知道是不是这原因导致. 这边为了让驱动能正确运行,我临时修改了一点代码,只是临时解决下问题: ```c if (length > 1) { if (device->config.medium_size > 0x1000000 && length >= 5) { /* medium size greater than 16Mb, address size is 4 Byte */ message.address.content = (ptr[1] << 24) | (ptr[2] << 16) | (ptr[3] << 8) | (ptr[4]); message.address.size = 32; message.address.qspi_lines = 1; count += 4; } else if (length >= 4) { /* address size is 3 Byte */ message.address.content = (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]); message.address.size = 24; message.address.qspi_lines = 1; count += 3; }else if(length == 2){ message.address.content = 0 ; message.address.qspi_lines = 0; message.address.size = 0; }else return -RT_ERROR; } ```
查看更多
5
个回答
默认排序
按发布时间排序
LeeTS
2021-03-13
这家伙很懒,什么也没写!
看完您这个问题,吓得我赶紧跟踪了一下我的代码, 发现的确如网页所述`gd25q80c_enter_qspi_mode()`内的`rt_qspi_send`的确数据根本就没发出去,我回读status2里的QE位也没有被置位, 就是FLASH根本就没有进去`QUAD SPI`模式,但奇怪的是我使用`SFUD`读写都正常啊 难道flash没进入qspi模式也能正常工作,可能这也是好多人没发现问题的原因
cychen
2020-07-20
这家伙很懒,什么也没写!
这个问题我很早就发过
X_Machine
2021-03-13
这家伙很懒,什么也没写!
很久不登陆,就为点赞
Juggernaut
2021-03-13
①②③
这个问题一直存在
hbq19891025
2021-12-02
这家伙很懒,什么也没写!
W25Q256FV我的这个芯片初始化失败,不知什么原因 ![image.png](https://oss-club.rt-thread.org/uploads/20211202/82902f7b31171678f0b0bb011dc229e7.png.webp)
撰写答案
登录
注册新账号
关注者
1
被浏览
3.5k
关于作者
yushigengyu
这家伙很懒,什么也没写!
提问
15
回答
25
被采纳
0
关注TA
发私信
相关问题
1
STM32 407 串口接收数据 系统卡死
2
RTT nrf24l01 设备驱动程序
3
stm32f10x串口只能发送数据,无法接收
4
第一次尝试移植rt-thread 到stm32F103系列问题
5
有人把stm32L07xx的bsp移到rtt上来了吗?求一个
6
rt-thread线程调度异常在stm32f103芯片上
7
RTT是否支持STM32F429
8
请问谁有 STM32F40x HAL + RT-THREAD 模板
9
rt-thread在stm32f411下的移植问题
10
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部