怎样测CAN的波特率

2020-02-09 11:42发布

请问各位高手
现在遇到一个问题,手头有块板子要和别的设备进行CAN通讯
不过对方CAN通讯的波特率不固定,需要在通讯中板子直接检测对方设备波特率,然后让PIC单片机的选择相应波特率。
如有遇到的请指点下 谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
yyccaa
1楼-- · 2020-02-10 09:27
挨个试,哪个波特率情况下能发出数据,就对的了。不同波特率,不会有发送结束中断~~~
------------------------------------------------------------------------------------
不能用发送进行测试的,那样会干扰总线的正常发送,即使你使用了正确的波特率发送,也额外增加了总线的通信负载,所以应该用接收/监听来确认波特率(监听模式更好,连错误帧都不会发送),因为总线波特率一般是唯一的。

CiA上有段说明的(http://www.can-cia.org/index.php?id=409):

Configuring a wrong bit-rate for a CANopen device is a critical issue. Depending on the data stream stuff-bit, CRC,
form or acknowledgement error occurs and the CANopen device will signal this by transmitting an error frame.
The process of error detection and signaling stops, when the device with the incorrect bit-rate goes into bus-off state.

给楼主一篇CiA的文章,Automatic Baudrate Detection in CANopen Networks
点击此处下载 ourdev_536170.pdf(文件大小:165K) (原文件名:Automatic Baudrate Detection in CANopen Networks.pdf)
jishugengniu
2楼-- · 2020-02-10 12:54
3年前一个同事做过,就用定时器采RXD最小脉宽,计算出波特率,再计算出对应的波特率设置。

是可以的。
aglen
3楼-- · 2020-02-10 13:34
谢谢几位的关注,我现在也觉得 测脉宽很难  测脉宽是测高电平持续时间吗?
最小脉宽也不一定就是一次高电平的持续时间吧?
对7楼的方法,相对容易实现,但是8楼又说不可取,8楼所说的接受/监听,可怎么实现呢,如果对方设备的CAN一直不发数据,怎么接受呢?
不知我这样理解对不对,刚加入工作就遇到难题,请各位帮帮忙 谢谢
aglen
4楼-- · 2020-02-10 18:24
 精彩回答 2  元偷偷看……
yyccaa
5楼-- · 2020-02-10 23:44
“对方CAN通讯的波特率不固定”这个不固定指什么,一般理解,应该是指对方在设计或现场调试时配置一个固定的波特率,运行中不会改变?

如果对方是按照常见波特率设置的话,数量是有限的,一般总是参照广泛使用的can协议(CANOpen,DeviceNet,J1939)所用的那几种波特率。
我上面发的文档里,也就8种,其它协议和CANOpen规定的波特率应该大部分是重复的。
当然如果对方设计者比较bt,喜欢用自定义冷门的波特率,那就只能靠位时间检测了(先询问对方一下,看他的设备可配置几种波特率,can的物理层部分还是比较复杂的,尽量避免位时间检测这种比较费力的做法,工作中和合作方经常沟通是必要的)。

关于“对方设备的CAN一直不发数据”,那你首先得获得对方的通信协议(否则你怎么和对方通信?),看协议或询问对方运行时是否会发数据。如果对方是只接收,那你只能通过发送的成功失败来判断了。

上面我发的那文章中也提到用定时器检测IO的位时间方法,相关的那篇Infineon的应用手册:点击此处下载 ourdev_536294.pdf(文件大小:93K) (原文件名:ap2902510_CAN Baudrate Detection with Infineon CAN devices.pdf)
astudent
6楼-- · 2020-02-11 05:39
谢谢各位高手

一周热门 更多>