Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN总线
CANopen_canfestival
CANOpen
菜鸟也出把力 RT-Thread+CanOpen(开源的CanFestival)
发布于 2012-04-28 10:13:47 浏览:98448
订阅该版
现在手头有一个项目,需要驱动一些电机。电机驱动模块外购,支持CanOpen协议(DS301 + DS402)。之前在论坛上搜了一下,发现只有一篇提到。 - [CanOpen](https://club.rt-thread.org/ask/question/472.html) 因为没什么基础,先了解Can总线,再读DS301的DataSheet,又在网上找到了开源的CanOpen协议栈源代码CanFestival学习了一下。 CanFestival算是开源的比较完善的DS301协议栈实现(主站,从站均可以支持),支持Linux,Windows平台,也支持单片机平台,同时也有一些例程提供。了解之后,决定在项目中采用该协议栈。 之前在一个研究性的项目中使用过RT-Thread,手头也有网络收音机的板子(刚好有CAN口)和STM32的评估板(CAN通信至少要两个节点),就尝试`CanFestival + STM32 + RT-Thread`的结合, 1.先将CanFestival移植到STM32。由于有其他单片机平台的移植例程,移植过程不是很复杂。主要是在具体的硬件平台上实现几个函数: - `void setTimer(TIMEVAL value);` - `TIMEVAL getElapsedTime(void);` 定时器的设置以及定时器的中断处理函数的实现。 2.加入RT-Thread。其实如果只是完成简单的CanOpen通信,不一定要上OS,在加入RT-Thread之前,用中断 + 主程序的前后台方式也实现了一个测试例程。不过因为项目比较大,后续还有其他的控制要求,也包括人机界面,还是决定加入RT-Thread。 CanFestival在OS上的移植还是比较简单的,也有Windows上的例程提供。和OS有关的,主要包括创建定时器和CanOpen数据包处理两个线程,同时利用了OS提供的互斥量,完成线程间的协调。 3.在RT-Thread + STM32上实现一个Canfestival提供的例程,TestMasterSlave。如果该例程能顺利跑起来的话,说明Canfestival的移植完成,同时对CanFestival的使用和DS301协议也有进一步的了解(例程的测试只是第一步,后续需要利用CanFestival的API接口实现控制功能)。 先将相关代码发上来: ![CanFestival.rar](/uploads/779_8c94087824bb5908a83caa94f854ad74.rar) 将CanFestival.rar解压到RT-Thread的Components目录下。 ![project.rar](/uploads/779_57b1cf8da3c72a82bf461700e9fe60d1.rar) 将project.rar解压到RT-Thread的`bsp/stm32f10x`目录下。 用MDK打开。工程中包含两个工程,一个主站,一个从站。分别编译,写入两块开发板(我这边是STM32评估板做Master, 网络收音机板做Slave。主从的区别主要在与CanFestival相关的 - Master.c, - Slave.c, - TestMaster.c, - TestSlave.c文件中, 后面两个Test打头的是用Beremiz(CanFestival是它的子项目)生成的数据字典文件;主从与开发板关系不大,只是几个LED的口不同而已,线程的实现都是完全一样的。 ![PC抓到的Can数据包.JPG](/uploads/779_313849d65fd528c1babd4208cce1f4eb.jpg) 不好意思,有点长。待续...
查看更多
103
个回答
默认排序
按发布时间排序
softwind
2012-04-28
这家伙很懒,什么也没写!
Canfestival的主页 [http://www.canfestival.org/](http://www.canfestival.org/) 国内关于Can和CanOpen能找到的比较好的网站 [http://www.dndev.com/cgi-bin/forum/forums.cgi?forum=2](http://www.dndev.com/cgi-bin/forum/forums.cgi?forum=2)
prife
2012-04-28
这家伙很懒,什么也没写!
好贴!顶!楼主辛苦
softwind
2012-04-28
这家伙很懒,什么也没写!
由于本人还是菜鸟一枚,关于提交的例程,还有几点与RT-Thread或者说与OS的使用相关的基础知识,即是说明,也是问题,还请各位方家指教。 1)CanFestival中有两个与移植相关的关键函数,canDispatch()和TimeDispatch()。这两个操作是互斥的,在一般的OS,例如Windows上是利用Mutex实现的;单片机平台上是利用关中断或者直接利用不能嵌套的同级中断实现。TimeDispatch()对时间的要求相对比较严格,执行的时间也不太长,我直接放在中断中调用;而canDispatch()在线程中调用,相关代码: ``` void can_recv_thread(void* parameter) { recv_sem = rt_sem_create("recvsem", 0, RT_IPC_FLAG_FIFO); tran_sem = rt_sem_create("transem", 0, RT_IPC_FLAG_FIFO); can_slave_init(); test_slave(); /* Infinite loop*/ while(1) { rt_sem_take(recv_sem, RT_WAITING_FOREVER); { uint32_t next; Message *pmsg; next = rx_read; pmsg = &rx_msg_buf[next]; /* Disable the Interrupt sources */ TIM5->DIER &= (uint16_t)~TIM_IT_CC1; canDispatch(&TestSlave_Data, pmsg); /* Enable the Interrupt sources */ TIM5->DIER |= TIM_IT_CC1; next++; if(next >= RX_BUF_LEN) next = 0; rx_read = next; } } } ``` ``` void TIM5_IRQHandler(void) { uint16_t capture = 0; if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) { TIM_ClearITPendingBit(TIM5, TIM_IT_CC1); last_time_set = TIM_GetCounter(TIM5); TimeDispatch(); } } ``` 通过关中断实现与TimeDispatch()的互斥。 也可以创建一个单独的定时器线程,等待在信号量上;在定时中断中发送信号量;然后在调用canDispatch()和TimeDispatch()之前加入rt_mutex_take(); 2)下面是我不太有把握的地方,请高手不吝赐教 CAN数据包的接收在中断中进行: ``` void USB_LP_CAN1_RX0_IRQHandler(void) { { Message *pmsg; uint32_t i, next; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); next = (rx_save + 1) ; if(next >= RX_BUF_LEN) next = 0; if(next == rx_read) return; pmsg = &rx_msg_buf[rx_save]; /**< message's ID */ pmsg->cob_id = (UNS16)RxMessage.StdId; /**< remote transmission request.(0 if not rtr, 1 if rtr) */ if(RxMessage.RTR == CAN_RTR_REMOTE) pmsg->rtr = 1; else pmsg->rtr = 0; /**< message's length (0 to 8) */ pmsg->len = (UNS8)RxMessage.DLC; for(i = 0; i < pmsg->len; i++) pmsg->data[i] = RxMessage.Data[i]; rx_save = next; rt_sem_release(recv_sem); } } ``` 接收到的数据包放在一个循环队列中,然后发送信号量到can_recv_thread()线程。这应该算典型的生产者和消费者问题。我看了RT-Thread编程指南的相关章节,对这个问题也有不同的解决方法,既要用到信号量,也有对临界资源的加锁操作。我这里只有一个生产者,一个消费者。生产者负责写入,修改尾指针;消费者读取,修改头指针。在上面的程序中,recv_sem相当于空闲单元的资源计数器,如果头尾指针的读取和写入都是原子操作,那么操作该队列的时候是否可以不加锁?
bernard
2012-04-28
这家伙很懒,什么也没写!
非常好,非常好,大力支持 不知道lz后续时间如何,如果有可能希望能够把这块维护起来。另外关于CanOpen的实现,我得先看看它的许可证协议。
bernard
2012-04-28
这家伙很懒,什么也没写!
许可证协议问题不算太大: ``` Free software CANopen framework CanFestival focuses on providing an ANSI-C platform independent CANOpen? stack that can be built as master or slave nodes on PCs, Real-time IPCs, and Microcontrollers. Runtime code is licensed LGPLv2, whereas accompanying developer tools are licensed GPLv2. CanFestival was made free in 2001, and grow since thank to user community source code contributions. ``` 另外,这块东西也可以考虑在RT-Thread中变成一个独立的应用模块。RealTouch中有CAN模块吗?如果没有,考虑在ART上把这套东西给折腾起来。
softwind
2012-04-28
这家伙很懒,什么也没写!
>非常好,非常好,大力支持 > >不知道lz后续时间如何,如果有可能希望能够把这块维护起来。另外关于CanOpen的实现,我得先看看它的许可证协议。 --- 项目本身是工作的一部分,时间没有问题,只是能力比较有限。 此次提交的代码只是个开始,主要是测试CanFestival协议栈的移植,后续要以此为基础进行下一步的开发。对我而言,不管是RT-Thread,还是CanFestival,还有很多需要深入的地方。我会尽力而为,有新的进展我也会汇报上来。 也希望对Can和CanOpen有兴趣或比较了解的同学多提宝贵意见。
bernard
2012-04-28
这家伙很懒,什么也没写!
建议加个maillist吧,这样有什么问题也可以在邮件列表中沟通。 CAN是工业总线中极为常用的一种,我也希望RT-Thread在其中能够做好。
grissiom
2012-04-29
这家伙很懒,什么也没写!
顶!
softwind
2012-04-29
这家伙很懒,什么也没写!
>建议加个maillist吧,这样有什么问题也可以在邮件列表中沟通。 > >CAN是工业总线中极为常用的一种,我也希望RT-Thread在其中能够做好。 --- 好。 申请加入不成功,邮件总是被退回来。
rt-thread-cnusers+subscribe@googlegroups.com
没错吧?
bernard
2012-04-29
这家伙很懒,什么也没写!
web方式的你能够访问吗? [http://groups.google.com/group/rt-thread-cnusers](http://groups.google.com/group/rt-thread-cnusers) 如果能够访问,那么可以在上面提交加入。
撰写答案
登录
注册新账号
关注者
5
被浏览
98.4k
关于作者
softwind
这家伙很懒,什么也没写!
提问
41
回答
153
被采纳
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
使用百度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
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
a1012112796
13
个答案
1
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部