Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SPI
25系列FLASH
5
RT-thread 两种方式读取到W25Q16的ID,高低位是反过来的
发布于 2021-11-10 14:48:55 浏览:1322
订阅该版
```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.3k
关于作者
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
使用百度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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部