Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SPI
25系列FLASH
5
RT-thread 两种方式读取到W25Q16的ID,高低位是反过来的
发布于 2021-11-10 14:48:55 浏览:1464
订阅该版
```c #include "W25Q16.h" struct rt_spi_device *spi_dev_w25q; void W25Q16_thread() { __HAL_RCC_GPIOA_CLK_ENABLE(); rt_hw_spi_device_attach("spi1", W25Q_SPI_DEVICE_NAME, GPIOA, GPIO_PIN_2); spi_dev_w25q = (struct rt_spi_device *)rt_device_find(W25Q_SPI_DEVICE_NAME); if (!spi_dev_w25q) { rt_kprintf("spi sample run failed! can't find %s device!\r\n", W25Q_SPI_DEVICE_NAME); } else { rt_kprintf("spi sample run success\r\n"); { struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0 and Mode 3 */ cfg.max_hz = 50 * 1000 * 1000; /* 50M */ rt_spi_configure(spi_dev_w25q, &cfg); } rt_uint8_t w25x_read_id = 0x90; rt_uint8_t id1[5] = {0}; rt_uint8_t w25x_read_id2[4] = {0x90,0x00,0x00,0x00}; rt_uint8_t id2[2] = {0}; rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id1, 5); rt_kprintf("w25q ID is:%x%x\r\n", id1[3], id1[4]); rt_spi_send_then_recv(spi_dev_w25q, w25x_read_id2, 4, id2, 2); rt_kprintf("w25q ID is:%x%x\r\n", id2[0], id2[1]); } } ``` ![QQ图片20211110144833.png](https://oss-club.rt-thread.org/uploads/20211110/fc0676338b8b626eb80236465bf4f41e.png)
查看更多
3
个回答
默认排序
按发布时间排序
出出啊
2021-11-10
恃人不如自恃,人之为己者不如己之自为也
这个是字节顺序变了吧,0x14和0xef两个字节的顺序变了 https://blog.csdn.net/qq_38944028/article/details/109000828 可以测试下发送数据改为0x90000001时,查看回复的设备ID顺序。
李肯陪你玩赚嵌入式
认证专家
2021-11-10
2022年度和2023年度RT-Thread社区优秀开源布道师,COC深圳城市开发者社区主理人,专注于嵌入式物联网的架构设计
见datasheet: ![image.png](https://oss-club.rt-thread.org/uploads/20211110/e261a4616fdbac3d1c9c844d0248a18e.png.webp) 猜测你的代码, ```c t_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id1, 5); rt_kprintf("w25q ID is:%x%x\r\n", id1[3], id1[4]); ``` 这样发送,芯片侧没有确切收到90 00 00 00,所以它按第2种情况返回了; 建议还是遵循datasheet的说法,直接发90 00 00 00就可以。
NoneKnowsMe
2024-11-06
这家伙很懒,什么也没写!
遇到了和题主一样的现象: ```c struct rt_spi_device *spi_dev_w25q; char name[RT_NAME_MAX]="spi3_0"; rt_uint8_t w25q_read_id1[4] = {0x90,0x00,0x00,0x00};// 指令码0x90表示芯片的ID,先读Manufacturer ID后读Device ID rt_uint8_t w25q_read_id2[4] = {0x90,0x00,0x00,0x01};// 指令码0x90表示芯片的ID,先读Device ID后读Manufacturer ID rt_uint8_t id[6] = {0}; ``` ```c /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */ rt_spi_send_then_recv(spi_dev_w25q, &w25q_read_id1, 4, id, 5); rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x%x%x%x%x\n", id[0], id[1], id[2], id[3], id[4], id[5]); /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */ struct rt_spi_message msg1, msg2; msg1.send_buf = &w25q_read_id2; msg1.recv_buf = RT_NULL; msg1.length = 4; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = id; msg2.length = 5; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(spi_dev_w25q, &msg1); rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x%x%x%x%x\n", id[0], id[1], id[2], id[3], id[4], id[5]); ``` 执行结果: ```shell use rt_spi_send_then_recv() read w25q ID is:ef17ef17ef0 use rt_spi_transfer_message() read w25q ID is:17ef17ef170 ``` 截图: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20241106/3b8005346a1bf3b476116bf0f7460673.png) 我能理解顺序不同是因为w25q_read_id1和w25q_read_id2的内容最后一个字节0x00和0x01的差别导致的。 不能理解的点: 1、为什么ef和17会反复出现 2、如果把指令码都改成: ```c rt_uint8_t w25q_read_id1[4] = {0x90,0x00,0x00,0x00};// 指令码0x90表示芯片的ID,先读Manufacturer ID后读Device ID rt_uint8_t w25q_read_id2[4] = {0x90,0x00,0x00,0x00};// 指令码0x90表示芯片的ID,先读Device ID后读Manufacturer ID ``` 但是发送命令时只发1个字节(0x90),读到的结果就是00 00 00 17 ef 00。 发送命令时发4个字节(0x90,0x00,0x00,0x00),读到的结果就是ef 17 ef 17 ef 00。 ```c rt_spi_send_then_recv(spi_dev_w25q, &w25q_read_id1, 1, id, 5); rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x%x%x%x%x\n", id[0], id[1], id[2], id[3], id[4], id[5]); // ... struct rt_spi_message msg1, msg2; msg1.send_buf = &w25q_read_id2; msg1.recv_buf = RT_NULL; msg1.length = 4; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = id; msg2.length = 5; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(spi_dev_w25q, &msg1); rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x%x%x%x%x\n", id[0], id[1], id[2], id[3], id[4], id[5]); ``` 测试结果: ```shell use rt_spi_send_then_recv() read w25q ID is:00017ef0 use rt_spi_transfer_message() read w25q ID is:ef17ef17ef0 ``` 截图: ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20241106/721faa8ebf2252ea30c13a9709d7daf7.png)
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
Yuanq
这家伙很懒,什么也没写!
提问
11
回答
0
被采纳
0
关注TA
发私信
相关问题
1
BBB的SPI驱动
2
求个SPI上挂两个或多个设备的使用例子
3
SPI设备有个bug
4
spi flash 的fatfs使用一段时间后读写文件出现故障
5
SPI驱动
6
请教rt_spi_configure函数理解
7
SPI FLASH挂载的问题
8
SPI-FLASH 文件系统 SPIFFS
9
求助一个完整的 spi flash 驱动
10
关于同时使用文件系统与SPI FLASH的问题
推荐文章
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
【RT-Thread】【ci】【scons】将ci.attachconfig.yml和scons结合使用
2
Rt-thread中OTA下载后,bootloader不搬程序
3
ulog 日志 LOG_HEX 输出时间改为本地日期时间
4
在RT-Thread Studio中构建前执行python命令
5
研究一了一段时间RTT,直接标准版上手太难,想用nano,但又舍不得组件
热门标签
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
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
xusiwei1236
8
个答案
2
次被采纳
踩姑娘的小蘑菇
1
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
bernard
4
个答案
1
次被采纳
RTT_逍遥
3
个答案
1
次被采纳
本月文章贡献
聚散无由
2
篇文章
15
次点赞
catcatbing
2
篇文章
5
次点赞
Wade
2
篇文章
4
次点赞
Ghost_Girls
1
篇文章
7
次点赞
xiaorui
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部