Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN总线
stm32f103can接收,使用过滤器后读出的数都是0.
发布于 2019-06-06 16:28:01 浏览:3459
订阅该版
* 本帖最后由 Any 于 2019-6-6 16:52 编辑 * 请教,stm32f103使用bsp/stm32/stm32xxxx下的bsp,使用的drv_can.c驱动。 如果注释掉 #define RT_CAN_USING_HDR,则能正常接收can信息。 但是不注释掉的话,虽然每次接收都能进中断,也能调用到回调函数,但是打印出来的数,都是0. 在can.c里的rt_hw_can_isr()函数里这部分: ```if (listmsg != RT_NULL) { rt_memcpy(&listmsg->data, &tmpmsg, sizeof(struct rt_can_msg)); ```可以将tmpmsg的数据放到listmsg->data里,并且两者里的数据都和电脑端发送的数据一致。 但是在_can_int_rx()函数里这部分: ```if (listmsg != RT_NULL) { rt_memcpy(data, &listmsg->data, sizeof(struct rt_can_msg));```读出来的数,确实0,然后发现,此时的listmsg是RT_NULL. 向上找,发现 ```if (hdr >= 0 && can->hdr && hdr < can->config.maxhdr && !rt_list_isempty(&can->hdr[hdr].list)) { listmsg = rt_list_entry(can->hdr[hdr].list.next, struct rt_can_msg_list, hdrlist); ```这个if判断没有成功,最后的&can->hdr[hdr].list是空的。 然后又掉过头来,查看rt_hw_can_isr(),可能是这里没保存对。 ```#ifdef RT_CAN_USING_HDR hdr = tmpmsg.hdr; if (can->hdr != RT_NULL) { RT_ASSERT(hdr < can->config.maxhdr && hdr >= 0); if (can->hdr[hdr].connected) { rt_list_insert_before(&can->hdr[hdr].list, &listmsg->hdrlist); listmsg->owner = &can->hdr[hdr]; can->hdr[hdr].msgs++; } }```发现这里的if(can->hdr[hdr].connected)没有判断成功,.connected一直是0. 搜索文件,发现只有在rt_can_control()里有对.connected设置为1. ```if (pfilter->actived) { while (count) { if (pitem->hdr >= can->config.maxhdr || pitem->hdr < 0) { count--; pitem++; continue; } level = rt_hw_interrupt_disable(); if (!can->hdr[pitem->hdr].connected) { rt_hw_interrupt_enable(level); rt_memcpy(&can->hdr[pitem->hdr].filter, pitem, sizeof(struct rt_can_filter_item)); level = rt_hw_interrupt_disable(); can->hdr[pitem->hdr].connected = 1; can->hdr[pitem->hdr].msgs = 0; rt_list_init(&can->hdr[pitem->hdr].list); } rt_hw_interrupt_enable(level); count--; pitem++; } }```但是,发现程序启动时,这里被执行一次,但是,pitem->hdr为0xFFFFFFFF,所以下边的.connected = 1根本没有被执行过。 而pitem->hdr是作为参数传递进来的,进一步追踪,在can.h里发现: ```#define RT_CAN_FILTER_ITEM_INIT(id,ide,rtr,mode,mask,ind,args) \ {(id), (ide), (rtr), (mode), (mask), -1, (ind), (args)} ```根据结构体: ```struct rt_can_filter_item { rt_uint32_t id : 29; rt_uint32_t ide : 1; rt_uint32_t rtr : 1; rt_uint32_t mode : 1; rt_uint32_t mask; rt_int32_t hdr; #ifdef RT_CAN_USING_HDR rt_err_t (*ind)(rt_device_t dev, void *args , rt_int32_t hdr, rt_size_t size); void *args; #endif /*RT_CAN_USING_HDR*/ };```可以确定hdr由倒数第三个参数决定的,这里是-1,所以pitem->hdr就是0xFFFFFFFF. 那么,这里为什么是-1呢?
查看更多
6
个回答
默认排序
按发布时间排序
Any
2019-06-17
这家伙很懒,什么也没写!
>应该不对,mode定义时候是“ rt_uint32_t mode : 1;"也就是说mode只有一位,非1即0,不会有2,3的情况 ... --- mode估计是过滤器工作模式吧?列表模式或掩码模式。
yqiu
2019-06-06
这家伙很懒,什么也没写!
使用 CAN 有这么多问题啊,下周就开始梳理下 CAN 驱动了,争取都理清楚,易使用。
Pekingbear
2019-06-11
这家伙很懒,什么也没写!
请教楼主一个问题, rt_can_filter_item结构体中的mode代表什么,没明白是设置什么模式
Any
2019-06-11
这家伙很懒,什么也没写!
>请教楼主一个问题, rt_can_filter_item结构体中的mode代表什么,没明白是设置什么模式 ... --- can.h里的: ``` #define RT_CAN_MODE_NORMAL 0 #define RT_CAN_MODE_LISEN 1 #define RT_CAN_MODE_LOOPBACK 2 #define RT_CAN_MODE_LOOPBACKANLISEN 3 ```
Pekingbear
2019-06-16
这家伙很懒,什么也没写!
>can.h里的: --- 应该不对,mode定义时候是“ rt_uint32_t mode : 1;"也就是说mode只有一位,非1即0,不会有2,3的情况
Any
2019-06-17
这家伙很懒,什么也没写!
>应该不对,mode定义时候是“ rt_uint32_t mode : 1;"也就是说mode只有一位,非1即0,不会有2,3的情况 ... --- 你说的对,我搞错了。 我也不知道mode表示的是什么了。
撰写答案
登录
注册新账号
关注者
1
被浏览
3.5k
关于作者
Any
这家伙很懒,什么也没写!
提问
4
回答
68
被采纳
0
关注TA
发私信
相关问题
1
我也来传一个CANOpen移植,RTT+STM32F107+CanOpenNode
2
谁有STM32裸跑的CANopen程序啊???
3
CAN驱动程序框架
4
CAN驱动接口如何规范一下
5
RTT无法进入线程.Cannot access Memory
6
编译提示arm-none-eabi/bin/ld: cannot find crt0.o: No such file o
7
rtt 2.1.0 正式版 mdk4 bsp/stm32 编译canapp.c错误
8
STM32F10XCAN驱动使用的问题
9
2.1版本stm32f10x分支bxcan驱动波特率设置的bug
10
rtthread2.1.0下,找不到can1设备
推荐文章
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-thred的stm32h723对应bsp包CubeMX添加其他外设报错
2
RT-Thread中的time溢出问题,时间戳溢出,解决方法
3
ART-PI使用env驱动ETH网卡,pc和板子可以ping通
4
SystemView线程名字不显示
5
只用网页也能跑RT-Smart 无门槛腾讯Cloud studio + smart-build快速构建
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
9
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
YZRD
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部