Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN总线
修复了stm32f4平台的can驱动。
发布于 2019-06-15 15:04:15 浏览:4945
订阅该版
1,关注到5天前GitHub上面rtt的master分支对stm32 f1系列hal库进行了升级,这次commit提到了对can驱动改动比较大;联想之前几个帖子说can驱动为了兼容f1的库文件导致stm32f4平台的can驱动编译通不过,但是发现这次并没有同步更新can驱动。猜测这下应该是f1和f4平台的can驱动同时都挂了。把代码clone下来,找个stm32f1和stm32f4的bsp一编译发现果然编译通不过报错很多。 ![13捕获.PNG](/uploads/201906/15/142230anecn1e989nknsg9.png) ![12捕获.PNG](/uploads/201906/15/142223mbem9ksztmhzlqt1.png) 这跟之前这几个帖子中只出现在stm32f4平台的编译报错基本一样的问题:由于hal库升级,库文件使用的结构体和宏定义变了。相关帖子见下: - [求助can驱动的编译问题](https://club.rt-thread.org/ask/question/9a6afbb5cc1cdae1.html) - [drv_can.c编译报错](https://club.rt-thread.org/ask/question/a4e4568740e914e0.html) - [求助,can的驱动文件编译为什么报错](https://club.rt-thread.org/ask/question/57ca1a9617323da3.html) 2,对比了一下新的stm32f1和stm32f4库文件中关于can模块的定义,发现基本相同,那么这下可以一起把f1和f4上的编译错误修复了。经过一番对原驱动中使用的宏定义和数据结构的替换,终于在`stm32f103-fire-arbitrary`这个bsp上成功实现收发数据。 ![14捕获.PNG](/uploads/201906/15/143620jww8scv8jtk3jhr8.png) 3,然后立马用`stm32f429-atk-apollo`这个bsp编译了一下,然鹅直接用进行数据手法发现并没有收发成功,于是请出saleae16逻辑分析仪监视can总线得到如下的结果: ![15捕获.PNG](/uploads/201906/15/144242bsxg9v7byvvl3t79.png) 明明我要发的ID是1,这下变成了5,而且can调试器也没有发送ack,这说明数据帧是错的。于是又抓取了一下在stm32f1板子上正常通信时的can帧如下: ![16捕获.PNG](/uploads/201906/15/144833fd8f1xx69c1jf3ly.png) 对比发现这两帧基本相似,只是错误的那帧在时间上稍微偏了一点点,应该是波特率不对。于是去看波特率设置部分的代码,看到使用了一个波特率表: ```c #if defined (SOC_SERIES_STM32F1) static const struct stm_baud_rate_tab can_baud_rate_tab[] = { {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 3)}, {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_5TQ | CAN_BS2_3TQ | 5)}, {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 6)}, {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 12)}, {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 24)}, {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 30)}, {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 60)}, {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 150)}, {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_3TQ | 300)} }; #elif defined (SOC_SERIES_STM32F4) static const struct stm_baud_rate_tab can_baud_rate_tab[] = { {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 3)}, {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_4TQ | 4)}, {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 6)}, {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 12)}, {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 24)}, {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 30)}, {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 60)}, {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 150)}, {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_4TQ | 300)} }; #endif ``` 这里把f1和f4分开列了一个表,我用的f429的can模块所在的APB1时钟是45M,按这个表计算1M波特率的话: `45X1024/3/(1+9+4)=1097`而如果按照stm32f407的APB1时钟42计算的话: `42X1024/3/(1+9+4)=1024`很明显这个老的驱动是对stm32f407的时钟配置的波特率表,所以咋们应该只需要针对stm32f429单独设置一个波特率表就好了,在代码中加入如下波特率表: ```c #elif defined (SOC_STM32F429IG) static const struct stm_baud_rate_tab can_baud_rate_tab[] = { {CAN1MBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 3)}, {CAN800kBaud, (CAN_SJW_2TQ | CAN_BS1_8TQ | CAN_BS2_5TQ | 4)}, {CAN500kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 6)}, {CAN250kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 12)}, {CAN125kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 24)}, {CAN100kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 30)}, {CAN50kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 60)}, {CAN20kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 150)}, {CAN10kBaud, (CAN_SJW_2TQ | CAN_BS1_9TQ | CAN_BS2_5TQ | 300)} }; ``` 经过测试在stm32f407-atk-explorer,stm32f429-atk-apollo两个bsp中也测试通过 4,注意:把下面的硬件滤波器这一项关了: ```c RT-Thread Components → Device Drivers → Enable CAN hardware filter ``` 新的can驱动(drv_can.c和drv_can.h)和测试例程(app_can.c)见附件,在stm32f4中将drv_can.c和drv_can.h替换掉原来的驱动,将app_can.c扔applications即可。 - [app_can.c](/uploads/201906/15/172646a0k34adu1k0l8kvd.attach) - [drv_can.h](/uploads/201906/15/150322qzghgkykggghz3nt.attach) - [drv_can.c](/uploads/201906/15/150322bnqqrxmzdcqb6nct.attach)
查看更多
25
个回答
默认排序
按发布时间排序
aozima
2019-06-15
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
楼主V5
WillianChan
2019-06-15
-
期待楼主的更多分享
Any
2019-06-15
这家伙很懒,什么也没写!
我下载下来了,编译下到板子后,shell里输入can_write_test后会卡死,不知道哪里配置错了。menuconfig里已经关闭了CAN的HDR。 ------------------------------------------------------------------------------------------------------------------------------------------- 晕,我好像又忘了配置CAN芯片的STB管脚了。 ------------------------------------------------------------------- 确实可以了。
Any
2019-06-15
这家伙很懒,什么也没写!
接收这里,好像有点问题,接收到一帧信息后,msh里输出来的是msg里原来存的数据。 接收到第二帧信息后,msh里才输出上次接收到的数据。
zhangjun
2019-06-15
这家伙很懒,什么也没写!
[i=s] 本帖最后由 zhangjun 于 2019-6-15 17:43 编辑 [/i] >接收这里,好像有点问题,接收到一帧信息后,msh里输出来的是msg里原来存的数据。 >接收到第二帧信息后,msh ... --- 我上传了新的can测试程序文件,重新下测试文件app_can.c就好了。之前在测试程序里总是先打印后读取数据,所以数据滞后。
Any
2019-06-17
这家伙很懒,什么也没写!
>我上传了新的can测试程序文件,重新下测试文件app_can.c就好了。之前在测试程序里总是先打印后读取数据, ... --- 可以了。感谢。
Any
2019-06-17
这家伙很懒,什么也没写!
[i=s] 本帖最后由 Any 于 2019-6-17 17:01 编辑 [/i] 楼主会再研究下硬件过滤器工程的实现吗?目前drv_control()里该功能是待完成状态。 can.h文件的rt_can_filter_item结构体: ``` 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*/ }; ``` 里面的ind指针不知道是做什么用的? mask应该是屏蔽模式的掩码,hdr是过滤器号码?
RT-WH
2019-06-18
这家伙很懒,什么也没写!
![110,0](https://www.rt-thread.org/qa/forum.php?mod=image&aid=9191&size=300x300&key=f2020c582a45bf4e&nocache=yes&type=fixnone) 楼主 下载了本帖提供的drv_can.c drv_can.h app_can.c 还是报错了怎么回事呢?
zhangjun
2019-06-18
这家伙很懒,什么也没写!
>楼主 下载了本帖提供的drv_can.c drv_can.h app_can.c 还是报错了怎么回事呢? > ... --- 这是针对新版本hal库的can驱动修复,看你的工程工程报错猜测,你可能是使用的老版本hal库的stm32F1系列工程,这个不需要更新.
RT-WH
2019-06-18
这家伙很懒,什么也没写!
>这是针对新版本hal库的can驱动修复,看你的工程工程报错猜测,你可能是使用的老版本hal库的stm32F1系列工程 ... --- 我直接 git pull 拉去官网的 发现你跟新了 但是报错的 官网不是用的俄最新hal库吗
撰写答案
登录
注册新账号
关注者
1
被浏览
4.9k
关于作者
zhangjun
这家伙很懒,什么也没写!
提问
1
回答
514
被采纳
7
关注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
组件 lwip v2.0.3 版本使用 netdev网卡的 ping 功能
2
简单两步配置RTT源码阅读环境 vsc+clangd
3
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
4
LVGL使用字库IC芯片显示中文
5
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
热门标签
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
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
807
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部