Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
SPI设备在rt_spi_configure时出错
发布于 2019-03-01 20:40:43 浏览:3305
订阅该版
请教各位大神。用的是**rt-thread-4.0.0\bsp\stm32\stm32f407-atk-explorer**这个开发板,在配置spi总线时出错。下面是初始化代码 int rt_hw_spi_dac_init(void) { rt_err_t result; AD568X_Device->spiDevice = (struct rt_spi_device *)rt_device_find(AD568X_SPI_BUS_NAME); if(AD568X_Device->spiDevice != RT_NULL) { rt_kprintf("spi device find succeed!
"); } else { rt_kprintf("spi device find failed!
"); } //设置AD568X的LDAC引脚为低,则DAC的输出数据会实时更新。 rt_pin_mode(AD568X_LDAC,PIN_MODE_OUTPUT); rt_pin_write(AD568X_LDAC,PIN_LOW); //使能GPIOB时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); //将设备挂载到总线上,并初始化了片选引脚 PB12 result = rt_hw_spi_device_attach(AD568X_SPI_BUS_NAME, AD568X_SPI_DEVICE_NAME, GPIOB, GPIO_PIN_12); if(result != RT_EOK) { rt_kprintf("spi device attach failed!
"); } //进行模式配置 { struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; cfg.max_hz = 20 * 1000 *1000; /* 20M */ rt_spi_configure(AD568X_Device->spiDevice, &cfg); } /* register device */ AD568X_Device->Device.type = RT_Device_Class_Block; AD568X_Device->Device.init = AD568X_init; AD568X_Device->Device.open = AD568X_open; AD568X_Device->Device.close = AD568X_close; AD568X_Device->Device.read = AD568X_read; AD568X_Device->Device.write = AD568X_write; AD568X_Device->Device.control = AD568X_control; /* no private */ AD568X_Device->Device.user_data = RT_NULL; rt_device_register(&AD568X_Device->Device, AD568X_SPI_DEVICE_NAME, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); return RT_EOK; } /* 导出到自动初始化 */ INIT_BOARD_EXPORT(rt_hw_spi_dac_init); 如果进行**rt_spi_configure(AD568X_Device->spiDevice, &cfg);**这个配置的时候就会出现下面这样的错误 。 ![QQ截图20190301203620.png](/uploads/201903/01/203641k3qtzusqabset736.png) 如果不配置的话会是这样。 ![QQ截图20190301203805.png](/uploads/201903/01/203823vkfiixwkt0edv4jx.png) 请问下哪位大神知道呀,小弟不胜感激。
查看更多
10
个回答
默认排序
按发布时间排序
yqiu
2019-03-01
这家伙很懒,什么也没写!
英文翻译下,不应该在调度器启动前使用 rt_mutex_take
aozima
2019-03-01
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>INIT_BOARD_EXPORT(rt_hw_spi_dac_init); --- 太早了,调整为系统启动后再初始化ADC。
春和景明
2019-03-03
这家伙很懒,什么也没写!
>太早了,调整为系统启动后再初始化ADC。 --- BOARD肯定是早了。那应该用什么自动初始化呢 Device?那个时候spi_bus是不是还没有初始化呢 commpont吗?
liuyuewei
2019-03-04
这家伙很懒,什么也没写!
>太早了,调整为系统启动后再初始化ADC。 --- 我把它改到mian()里进行了初始化。 int main(void) { // thread_init_adc(); // thread_init_led(); rt_hw_spi_dac_init(); return RT_EOK; } 也不行,会出现总线错误。 之后把这个初始化函数改成这样,由于之前SPI总线和SPI设备名字写的不清楚,重新改一下。 int rt_hw_spi_dac_init(void) { rt_err_t result; //设置AD568X的LDAC引脚为低,则DAC的输出数据会实时更新。 rt_pin_mode(AD568X_LDAC,PIN_MODE_OUTPUT); rt_pin_write(AD568X_LDAC,PIN_LOW); //使能GPIOB时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); //将设备挂载到总线上,并初始化了片选引脚 PB12 result = rt_hw_spi_device_attach("spi2", "spi20", GPIOB, GPIO_PIN_12); if(result != RT_EOK) { rt_kprintf("spi device attach failed!\r\n"); } AD568X_Device->spiDevice = (struct rt_spi_device *)rt_device_find("spi20"); if(AD568X_Device->spiDevice != RT_NULL) { rt_kprintf("spi device find succeed!\r\n"); } else { rt_kprintf("spi device find failed!\r\n"); } { struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB; cfg.max_hz = 20 * 1000 *1000; /* 20M */ rt_spi_configure(AD568X_Device->spiDevice, &cfg); } //进行模式配置 // rt_hw_spi_dac_cfg(); /* register device */ AD568X_Device->Device.type = RT_Device_Class_Block; AD568X_Device->Device.init = AD568X_init; AD568X_Device->Device.open = AD568X_open; AD568X_Device->Device.close = AD568X_close; AD568X_Device->Device.read = AD568X_read; AD568X_Device->Device.write = AD568X_write; AD568X_Device->Device.control = AD568X_control; /* no private */ AD568X_Device->Device.user_data = RT_NULL; rt_device_register(&AD568X_Device->Device, "AD568x", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); return RT_EOK; } 但是依然会有总线错误的问题,之后进行代码跟踪。一级一级的往里进。 rt_spi_configure(AD568X_Device->spiDevice, &cfg); result = rt_mutex_take(&(device->bus->lock), RT_WAITING_FOREVER); RT_ASSERT(rt_object_get_type(&mutex->parent.parent) == RT_Object_Class_Mutex); 在这个函数的时候出现了问题。 看看知道是怎么回事吗。
liuyuewei
2019-03-04
这家伙很懒,什么也没写!
>英文翻译下,不应该在调度器启动前使用 rt_mutex_take --- 是的,应该是在调试器启动后再进行这方面初始化。
liuyuewei
2019-03-04
这家伙很懒,什么也没写!
>太早了,调整为系统启动后再初始化ADC。 --- 找到原因,忘记给这个设备分配空间了。:D
BaiJinHui
2019-11-30
这家伙很懒,什么也没写!
>找到原因,忘记给这个设备分配空间了。 --- 楼主,我也遇到了跟你一样的问题,请问你是怎么解决的?
shellgo
2020-05-20
这家伙很懒,什么也没写!
>找到原因,忘记给这个设备分配空间了。 --- 您好,请教下现在也遇到这个问题 忘记给这个设备分配空间是什么意思啊
aozima
2020-05-20
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
楼主的问题是在非线程环境下使用mutex,原因是调用这个代码过早,应该在线程启动后再调用。
shellgo
2020-05-20
这家伙很懒,什么也没写!
>楼主的问题是在非线程环境下使用mutex,原因是调用这个代码过早,应该在线程启动后再调用。 ... --- 谢谢了,这个问题跟我遇到的问题不一样
撰写答案
登录
注册新账号
关注者
0
被浏览
3.3k
关于作者
liuyuewei
这家伙很懒,什么也没写!
提问
2
回答
7
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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 源码分析笔记 :线程和调度器
2
RT-Thread项目助手v0.2.0 - 支持Env Windows
3
RttreadV5.10上,GD32F450Z RTC时间显示问题
4
rt-smart启动流程分析
5
EtherKit快速上手PROFINET
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
聚散无由
2
篇文章
12
次点赞
Wade
2
篇文章
2
次点赞
xiaorui
1
篇文章
1
次点赞
zhuzhuzhu
1
篇文章
1
次点赞
catcatbing
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部