Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
SPI
SPI驱动写法的问题
发布于 2019-10-24 10:29:31 浏览:1368
订阅该版
* 本帖最后由 bevis 于 2019-10-24 10:31 编辑 * 根据文档SPI读写方式有几种,在实际应用中使用rt_spi_send_then_recv更容易失败 ,使用 rt_spi_transfer_message反而更容易成功,文档说两者都是一样的关系。以下是我写的两套写法,自认为读写流程都是一样的。结果使用rt_spi_transfer_message成功,前者接口却是失败的。 难道这两套流程不一样吗???函数名: ```uint8_t spiTxRx(const uint8_t *txData, uint8_t *rxData, uint16_t length)``` 第一段使用rt_spi_send_then_recv -- 执行结果失败, 我说的失败,不是SPI驱动失败,而是SPI设备读写初始化运行失败 ``` if((NULL == txData) && (NULL == rxData)) { return i; } if(length > 128) { return i; } if(txData != NULL) { memcpy(tx_buff, txData, length); if(rxData != NULL) { rt_spi_send_then_recv(spi_dev_st25r, tx_buff, length, rx_buff, length); memcpy(rxData, rx_buff, length); } else // RX NULL, 输入缓冲不能为空 { rt_spi_send_then_recv(spi_dev_st25r, txData, length, RT_NULL, 0); } } else // TX NULL { if(rxData != NULL) { rt_spi_send_then_recv(spi_dev_st25r, RT_NULL, 0, rx_buff, length); memcpy(rxData, rx_buff, length); } } rt_thread_mdelay(5); return i;``` 第二段rt_spi_transfer_message -- 成功 ``` uint8_t i=0; if((NULL == txData) && (NULL == rxData)) { return i; } if(length > 128) { return i; } struct rt_spi_message msg1, msg2; if(txData != NULL) { if(rxData != NULL) // RX 非空 { msg1.send_buf = txData; // 发送缓存 msg1.recv_buf = rx_buff;// 接收缓存 msg1.length = length; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = RT_NULL; msg2.length = 0; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(spi_dev_st25r, &msg1); memcpy(rxData, rx_buff, length); } else // RX NULL { msg1.send_buf = txData; // 发送缓存 msg1.recv_buf = RT_NULL; msg1.length = length; // 发送长度 msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = RT_NULL; msg2.length = 0; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(spi_dev_st25r, &msg1); } } else // TX NULL { if(rxData != NULL) // RX 非空 { msg1.send_buf = RT_NULL; msg1.recv_buf = RT_NULL; msg1.length = 0; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = rx_buff; // 接收缓存 msg2.length = length; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(spi_dev_st25r, &msg1); memcpy(rxData, rx_buff, length); } } rt_thread_mdelay(5); return i;```
查看更多
2
个回答
默认排序
按发布时间排序
aozima
2019-10-24
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
[i=s] 本帖最后由 aozima 于 2019-10-24 14:29 编辑 [/i] 逻辑分析仪解君愁。 另外, 只发不收是 rt_spi_send, 只收不发是 rt_spi_recv. 先发再收是 rt_spi_send_then_recv rt_spi_send_then_send 和 rt_spi_send 是一样的,但是方便使用,他们底层都是通过 rt_spi_transfer 和 msg 搭配来实现的。
james_s
2021-04-14
这家伙很懒,什么也没写!
代码上看不出来啥问题, 使用逻辑分析仪截图出来看看
撰写答案
登录
注册新账号
关注者
1
被浏览
1.4k
关于作者
bevis
这家伙很懒,什么也没写!
提问
79
回答
266
被采纳
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
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
FRDM-MCXN94 7Flash实践--W25Q64
2
NXP MCXN947测评(一)开箱+环境配置
3
stm32f103的adc+dma多通道采集数据
4
恩智浦FRDM-MCX947上的 IIC(硬件) 实践
5
栈溢出及中断向量偏移BUG记录与分析
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
CAN总线
Hardfault
FinSH
USB
文件系统
RT-Thread
DMA
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
cubemx
flash
I2C
UART
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
BSP
ADC
keil_MDK
socket
中断
编译报错
MicroPython
Debug
SDIO总线
GD32
msh
rt_mq_消息队列_msg_queue
ulog
C++_cpp
SFUD
本月问答贡献
xiaorui
20
个答案
3
次被采纳
Juggernaut
12
个答案
3
次被采纳
踩姑娘的小蘑菇
12
个答案
2
次被采纳
小小李sunny
10
个答案
2
次被采纳
a1012112796
8
个答案
1
次被采纳
本月文章贡献
ZVML_9668
4
篇文章
6
次点赞
Lu_盼盼
4
篇文章
3
次点赞
Z_Y
3
篇文章
5
次点赞
ThinkCode
2
篇文章
2
次点赞
oxlm
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部