精华内容
下载资源
问答
  • 是一个计算CAN总线波特率的小的但很有用的工具,最主要的是它是自动的。希望对正在研究CAN通信的小伙伴有所帮助
  • 如何计算CAN通信波特率

    千次阅读 2019-09-25 13:31:17
    CAN通信波特率计算是一个难点,要正确计算设置CAN波特率。CAN2.0协议中定义标称位速率为一理想的发送器在没有重新同步的情况下,每秒发送的位数量,也就是我们说的波特...

    0?wxfmt=jpeg

    0

    CAN通信波特率的计算是一个难点,要正确计算设置CAN波特率。CAN2.0协议中定义标称位速率为一理想的发送器在没有重新同步的情况下,每秒发送的位数量,也就是我们说的波特率。

    0?wx_fmt=jpeg位时间由若干个时间单元(Tq)或者称为时间份额组成。那么位CAN消息中最小的时间份额由下式计算:

    0?wx_fmt=jpeg

    PRESDIV 为预分频因子, Fcanclk为CAN模块时钟源频率。

    CAN2.0协议中规定要求每一位可以划分为几个不重叠时间片段,分别是:

    同步段(Synchronization segment)

    传播段(Propagation segment)

    相位缓冲段1(Phase segment 1)

    相位缓冲段2(Phase segment 2)

    0?wx_fmt=jpeg

    同步段:

    位时间的同步段用于同步总线上不同的节点。这一段内要有一个跳变沿。

    传播段:

    传播段用于补偿网络内的物理延时时间。它是总线上输入比较器延时和输出驱动器延时总和的两倍。

    相位缓冲段 1、相位缓冲段 2 PHASE SEG1 PHASE SEG2):

    相位缓冲段用于补偿边沿阶段的误差。这两个段可以通过重新同步加长或缩短。

    采样点:

    采样点是读总线电平并解释各位的值的一个时间点。采样点位于相位缓冲段1( PHASE_SEG1)之后。

    信息处理时间 (INFORMATION PROCESSING TIME

    信息处理时间是一个以采样点作为起始的时间段。采样点用于计算后续位的位电平。

    同步段(SYNC_SEG)为 1 个时间份额;传播段( PROP_SEG)的长度可设置为 1, 2, …, 8 个时间份额;缓冲段 1 ( PHASE_SEG1)的长度可设置为 1, 2, …, 8 个时间份额;相位缓冲段 2( PHASE_SEG2 )的长度为阶段缓冲段 1 ( PHASE_SEG1 )和信息处理时间( INFORMATIONPROCESSINGTIME)之间的最大值;信息处理时间少于或等于 2 个时间份额。一个位时间总的的时间份额值可以设置在 8—25 的范围。

    在清楚了位时间的构成后,我们以飞思卡尔kv4x系列MCU为例说明如何计算CAN波特率

    我们知道飞思卡尔KV4xMCU的CAN模块有两种时钟源可选,外设时钟时钟源和晶振时钟源,所以分两种情况来说明

    例子:假设系统使用8M晶振,经过PLL倍频后输出144M作为系统时钟,外设也是144M,要求设定波特率为250kbps,CAN模块选择外设时钟源。如果使用peripheral clock 则设置 CAN_CTRL1 bit13 为1。

    配置波特率主要是配置控制寄存器1

    对照数据手册配置波特率:

    首先配置预分频参数PRESDIV 为47

    则可计算:

    0?wx_fmt=jpeg

    配置寄存器传播段域为2,则传播段时间 = (2 + 1)Tq

    配置寄存器相位缓冲段1域为3,则相位缓冲段1时间 = (3+1)Tq

    配置寄存器相位缓冲段2域为3,则相位缓冲段2时间 = (3+1)Tq

    同步段不用配置,固定为1个Tq

    则波特率 = 1/(1+3+4+4)Tq 将(2) 带入可计算出:

    0?wx_fmt=jpeg

    其他波特率值可类似计算,具体应用时候还要参考数据手册的限制条件,这四个值都有范围限制。

    例子:假设系统使用8M晶振,经过PLL倍频后输出144M作为系统时钟,外设也是144M,要求设定波特率为250kbps,CAN模块选择晶振时钟源。

    首先配置预分频参数PRESDIV 为3

    0?wx_fmt=jpeg0?wx_fmt=jpeg

    其他波特率值可类似计算,具体应用时候还要参考数据手册的限制条件,这四个值都有范围限制。

    在CAN 驱动中如果使用外部8M晶振作为CAN模块时钟源,必须配置CAN_CTRL1 bit13为0,选择can模块使用外部时钟,同时必须正确配置MCG_C2和OSC_CR寄存器,才能正常工作,否则CAN模块不能正常通讯。

    MCG_C2 |=MCG_C2_EREFS_MASK;

    // Enable ERCLK clock to FlexCAN

    OSC_CR |= OSC_CR_ERCLKEN_MASK | OSC_CR_EREFSTEN_MASK;

    各位亲,是否学会了如何计算CAN通讯波特率呢?如果你喜欢本文,请分享给你的朋友。

    0?wx_fmt=bmp0?wx_fmt=bmp

    0

    展开全文
  • 最近看一下CAN通信,翻出来之前做过的STM32 CAN通信的项目代码,有些概念比较模糊了,如波特率是怎么计算的。 最近接触rt-thread比较多,想把之前的CAN通信的代码,移植到RTOS上。 CAN波特率 如果主机与从机,...

    前言

    • 最近看一下CAN通信,翻出来之前做过的STM32 CAN通信的项目代码,有些概念比较模糊了,如波特率是怎么计算的。
    • 最近接触rt-thread比较多,想把之前的CAN通信的代码,移植到RTOS上。

     

    CAN波特率

    如果主机与从机,波特率不一致,很难正常的通信。

    /*
     * 函数名:CAN_Mode_Config
     * 描述  :CAN的模式 配置
     * 输入  :无
     * 输出  : 无
     * 调用  :内部调用
     */
    static void CAN_Mode_Config(void)
    {
        CAN_InitTypeDef        CAN_InitStructure;
        /************************ CAN通信参数设  *********************************/
        /*CAN寄存器初始化*/
        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);         /* CAN单元初始化 */
        CAN_InitStructure.CAN_TTCM=DISABLE;         //MCR-TTCM  关闭时间触发通信模式使能
        CAN_InitStructure.CAN_ABOM=DISABLE;         //MCR-ABOM  自动离线管理 
        CAN_InitStructure.CAN_AWUM=DISABLE;         //MCR-AWUM  使用自动唤醒模式
        CAN_InitStructure.CAN_NART=ENABLE;          //MCR-NART  禁止报文自动重传 DISABLE-自动重传   ENABLE-不自动重传
        CAN_InitStructure.CAN_RFLM=DISABLE;         //MCR-RFLM  接收FIFO 锁定模式 DISABLE-溢出时新报文会覆盖原有报文  
        CAN_InitStructure.CAN_TXFP=DISABLE;         //MCR-TXFP  发送FIFO优先级 DISABLE-优先级取决于报文标示符 
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;  	//正常工作模式
    
        /************************ CAN通信波特率设置 **********************************/
        #if 0
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //BTR-SJW 重新同步跳跃宽度 1个时间单元
        CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;      //BTR-TS1 时间段1 占用了5个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;      //BTR-TS1 时间段2 占用了3个时间单元
        CAN_InitStructure.CAN_Prescaler =4;         //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+5+3)/4=1Mbps
        #endif
    
        #if 0
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //BTR-SJW 重新同步跳跃宽度 1个时间单元
        CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;      //BTR-TS1 时间段1 占用了2个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_1tq;      //BTR-TS1 时间段2 占用了1个时间单元
        CAN_InitStructure.CAN_Prescaler =9;         //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+2+1)/9=1Mbps
        #endif
    
        #if 1
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //BTR-SJW 重新同步跳跃宽度 1个时间单元
        CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;      //BTR-TS1 时间段1 占用了2个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_1tq;      //BTR-TS1 时间段2 占用了1个时间单元
        CAN_InitStructure.CAN_Prescaler =18;        //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+2+1)/18=0.5Mbps
        #endif
    
        #if 0
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //BTR-SJW 重新同步跳跃宽度 1个时间单元
        CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;      //BTR-TS1 时间段1 占用了2个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;      //BTR-TS1 时间段2 占用了3个时间单元
        CAN_InitStructure.CAN_Prescaler =12;        //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+3+2)/12=0.5Mbps
        #endif
    
    
        #if 0
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //BTR-SJW 重新同步跳跃宽度 1个时间单元
        CAN_InitStructure.CAN_BS1=CAN_BS1_7tq;      //BTR-TS1 时间段1 占用了7个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_4tq;      //BTR-TS1 时间段2 占用了4个时间单元
        CAN_InitStructure.CAN_Prescaler =6;         //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+7+4)/6=0.5Mbps
        #endif
    
        #if 0
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //BTR-SJW 重新同步跳跃宽度 1个时间单元
        CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;     //BTR-TS1 时间段1 占用了13个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;      //BTR-TS1 时间段2 占用了2个时间单元
        CAN_InitStructure.CAN_Prescaler =9;         //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+13+2)/9=250Kbps
        #endif
    
        #if 0
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //BTR-SJW 重新同步跳跃宽度 1个时间单元
        CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;      //BTR-TS1 时间段1 占用了8个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;      //BTR-TS1 时间段2 占用了7个时间单元
        CAN_InitStructure.CAN_Prescaler =9;         //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+8+7)/9=250Kbps
        #endif
    
        #if 0
        if (CAN_Init(CAN1, &CAN_InitStructure) == CAN_InitStatus_Failed)
        {
            printf("Initialize CAN failed!\n\r");
        }
        else
        {
            printf("Initialize CAN Success!\n\r");
        }
        #endif
        CAN_Init(CAN1, &CAN_InitStructure);
    }

     

    计算方法

     

    这里的500Kbps,是怎么计算出来的?

     

        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;      //BTR-SJW 重新同步跳跃宽度 1个时间单元
        CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;      //BTR-TS1 时间段1 占用了2个时间单元
        CAN_InitStructure.CAN_BS2=CAN_BS2_1tq;      //BTR-TS1 时间段2 占用了1个时间单元
        CAN_InitStructure.CAN_Prescaler =18;        //BTR-BRP 波特率分频器  定义了时间单元的时间长度 36/(1+2+1)/18=0.5Mbps

     

    通过查看STM32F103 的参考手册,找到了答案

     

     

     

    计算过程

     

    注意STM32 CAN 属于APB1总线,APB1总线,默认配置最大主频(36Mhz),而不是72Mhz。

     

     

    波特率 = 1 / 位时间
    
    位时间 = (1*tq + tbs1 + tbs2),注意,这里与 CAN_SJW_1tq 无关!!
    
    如果:tbs1 = 2 , tbs2 = 1,则: 位时间 =  (1+2+1)tq = 4 tq。
    
    注意:这里,还有个分频, 分频分的不是主频(71MHz),是CAN总线的APB1 频率,手册上写着,36MHz,也就是 主频的2分频。
    
    系统默认初始化后,APB1总线频率,设置为 36MHz。
    
    这里CAN控制器,可以把APB1 继续分频,如 18,那么,CAN控制器频率:36Mhz / 18 = 2 Mhz。
    
    波特率: =  1 /  4 * (1/2Mhz) = 0.5Mhz = 500 Kbps

     

     

     

    总结

     

    CAN通信,是比较好用的串行总线,不仅用于汽车上,一些工业总线场合短距离的通信,也可以说使用。

    CAN通信,波特率、滤波器设置,都需要清楚,才能真正用好。

     

     

     

    展开全文
  • CAN 波特率的计算对于很多CAN学习者来说理解起来不是很容易,因此作者总结了CAN波特率计算的一些要点,希望对大家有帮助。
  • STM32所有系列(F0,F1,F2,F3,F4,)CAN总线波特率计算工具,同时也计算出采样点百分比(Sample-Point)以供参考(比如CANopen 和DeviceNet默认是87.5%,ARINC 825默认是75%)这个对于CAN总线协议破解很有用!...
  • CAN总线波特率计算方法

    千次阅读 2021-04-08 10:11:05
    CAN总线波特率计算方法1.位时间2.计算公式3.举例4.参考文章 1.位时间 1个位时间包含4个功能段,分别是同步段,传播段,相位缓冲段1,相位缓冲段2。为了便于编程,有些时候会把传播段和相位缓冲段1合并成一个时间段。...

    CAN总线波特率计算方法

    1.位时间

    1个位时间包含4个功能段,分别是同步段,传播段,相位缓冲段1,相位缓冲段2。为了便于编程,有些时候会把传播段和相位缓冲段1合并成一个时间段。位时间的数值相当于1/波特率,就是一位在CAN总线上传递的时间。这一位的值(1或0)由采样点的电平决定。
    在这里插入图片描述
    在这里插入图片描述
    相关参数定义如下:

    Prescaler:分频很容易理解,控制器的时钟频率进行分频后会得到CAN的时钟,CAN时钟的一个时间周期就是之前提到的最小时间段tscl,也称作时间份额,代表的是CAN控制器工作时的最小时间单位。

    SYNC_SEG:同步段用于同步总线上各个节点,固定长度为1个tscl。其中应该有一个跳变沿。

    PROP_SEG:传播段用于补偿信号通过网络和节点传播的物理延迟,长度应能保证2倍的信号在总线的延迟,长度为1到8个tscl。

    PHASE_SEG:相位缓冲段用于补偿跳变沿的相位误差,相位缓冲段1的结尾是采样点位置。相位缓冲段1和2长度均为1到8个tscl。

    TSEG1 = PROP_SEG + PHASE_SEG1。

    TSEG2 = PHASE_SEG2。

    位时间 = SYNC_SEG + TSEG1 + TSEG2,长度为8到25个tscl。

    采样点 = (SYNC_SEG + TSEG1)÷位时间。

    SJW:同步跳转宽度定义了在重新同步时可以缩短或延长的最大时钟周期数。因为重新同步时,相位缓冲段1会延长或是相位缓冲段2缩短。同步跳转宽度取值为1到4,同时必须不大于PHASE_SEG1的时间份额数。

    2.计算公式

    在这里插入图片描述
    根据上图,可以知道位时间计算公式如下:
    在这里插入图片描述
    这里的tTSEG1和tTSEG2定义如下:
    在这里插入图片描述

    TSEG1和TSEG2就是BTR1寄存器里设置的数值,位时间简写如下:
    在这里插入图片描述
    那么CAN总线控制器SJA1000的时间频率与CAN 波特率的关系如下:
    在这里插入图片描述
    这里,ClockFrequency是外部晶振xtal输入频率。除以2,是因为保证预分频处理是偶数,即2*prescalar!
    prescalar的定义如下:
    在这里插入图片描述
    其中,BRP就是BTR0寄存器里定义的数值,所以可以得到:
    在这里插入图片描述

    3.举例

    以ST Mircroelectronics bxCAN为例,计算波特率为500kbit/s时的各参数数值。
    在这里插入图片描述
    有下图可知有两种配置方法:
    在这里插入图片描述
    把参数代入bxCAN的CAN_BTR寄存器,
    在这里插入图片描述
    可以确定公式
    在这里插入图片描述
    是正确的!

    最后需要注意两点:
    1.SAM的确定:低频时,选SAM=1,即采样3次。高频100K以上时,取SAM=0,即采样1次。
    2.采样点CiA推荐值如下!
    在这里插入图片描述

    4.参考文章

    1.STM32中CAN波特率的计算
    2. CAN总线波特率计算
    3. CAN Bit Time Calculation

    展开全文
  • CAN总线波特率计算方法

    千次阅读 2020-03-19 10:39:52
    CAN总线波特率计算方法can配置 can配置 之前学习can总线的时候,总是遇到can波特率修改,一般情况下用原子的代码默认就行了,都没有研究过为什么要这么配置。有句名言说的比较好:出来混,早晚是要还的…有一天,...

    CAN总线波特率的计算方法

    can配置

    之前学习can总线的时候,总是遇到can波特率修改,一般情况下用原子的代码默认就行了,都没有研究过为什么要这么配置。有句名言说的比较好:出来混,早晚是要还的…有一天,突然想看看为啥这么配置,百度出来一大堆,还有好搓是错误的,阅读量还不小,后来就啃手册,终于搞清楚了怎么配置。。。can配置一般单片机都有如下几个寄存器:
    SYNC_SEG: 同步段 一般默认是1
    PROP_SEG:propagation segment 传播段
    PSEG1:
    PSEG2:
    PRESDIV: 分频因子

    好多专业的数据手册看的人懵B,还好发现有一张图。一目了然啊:
    在这里插入图片描述
    1.先看can时钟(我这里时15M)
    2.看can时钟分频因子:(我这里设置成2)
    3,设置PROP_SEG;(我设置成7)
    4.设置PSEG1:(我设置7)
    5.设置PSEG2:(我设置2)

    6.计算:ftq=can时钟/(can时钟分频因子 +1)=15/3=5M
    baudrate=ftq/
    (1+ (PROP_SEG+PSEG1+2) + (PSEG2+1))=
    5M/(1+7+7+2+2+1)=250K

    注:在stm32中 的
    在这里插入图片描述
    BS1=(PROP_SEG+PSEG1+2)
    BS2=(PSEG2+1)

    另外尽可能的把采样点设置为 CiA 推荐的值:

    75% when 波特率 > 800K
    80% when 波特率 > 500K
    87.5% when 波特率 <= 500K

    为了方便我做了一个计算器:
    在这里插入图片描述
    有需要可以下载
    https://download.csdn.net/download/nopear6/12255858

    展开全文
  • CAN波特率计算器

    2019-01-14 20:59:55
    用于计算can通信波特率,非常好用,做can通信必备工具。
  • STM32 CAN波特率配置表

    2018-07-21 08:17:36
    STM32 CAN波特率配置表是常用波特率配置时,各个参数的取值,非常方便。文件是压缩包,内部以图片格式保存的配置表。
  • CAN波特率计算

    千次阅读 2017-11-02 15:19:04
    其中较难设置的部分就是通信波特率计算CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。 实际上,CAN总线的波特率是...
  • CAN波特率计算公式

    2021-09-13 23:56:30
    波特率计算公式 假设:fbus = 32M 总线时钟 时间段: 时间段1:CAN_BS1 时间段2:CAN_BS2 Tq时钟周期(时间段): 时间段1:CAN_BS1 = CAN0BTR1_TSEG[10:13]的十进制数值 + 1 注释 CAN0BTR1_TSEG[10:13] = ( 0 ~ 15 )...
  • 网址 http://www.bittiming.can-wiki.info/ 功能说明 选择不同的厂家,可以显示其CAN外设中关于波特率参数的寄存器定义。 ...输入外设频率和CAN通信波特率,可以计算出寄存器参数: 列出的可能值: ...
  • 网上搜过一些资料了解关于can通信的一些硬件知识,其实我认为can硬件知识大体了解就可以了,最重要的应用还是在can通信软件代码上的实现,因为can硬件提供了基础,在此基础上懂得怎样对can进行波特率配置以及过滤器...
  • STM32波特率设置对应寄存器,开发STM32的CAN通信的工程师朋友们能用上。
  • 记得最早是在15年就给大家推送过关于CAN通信波特率的设置,当时是以NXP的kinetis系列之KV46为例子来给大家介绍的,最近推送了几篇有关CAN通信的文章,后台又有...
  • CAN总线采用的是异步串行通信,也就是没有单独的时钟线来保证各个收发器之间时钟的一致,每个收发器是按事先设置的波特率来对总线上的电平进行分位。因此波特率设置准确对CAN总线的稳定通信来说非常重要。  CAN总线...
  • STM32中CAN波特率计算

    千次阅读 2018-09-14 11:00:49
    车辆使用的250K 的波特率,使用STM32制作的控制板中的CAN波特率计算 波特率=APB1Clock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler (PS:CAN_SJW表示重新同步跳跃宽度,不参与波特率计算,其值可以编程为1到4个时间...
  • STM32CAN波特率简易计算 CAN总线通信的各节点通信时会产生相位差,所以要进行位同步,两个节点保持步调一致。 CAN_SJW:重新同步跳跃宽度(SJW) 。定义了在每位中可以延长或缩短多少个时间单元的上限。其值可以编程...
  • 用于计算MCP2515的CAN通信波特率
  • STM32的CAN波特率计算

    万次阅读 2017-06-23 16:38:28
    波特率=APB1Clock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler eg:APB1Clock=36Mhz,CAN_BS1=3,CAN_BS2=5,CAN_Prescaler=32  36000k/9/32=125k/s 另外,尽可能地把采样点设置为CiA推荐的值: CiA 波特率 75% >800K ...
  • CAN通信波特率与每秒收发帧数

    千次阅读 2017-07-22 10:26:29
    波特率: 上两图来自STM32F4XX中文参考手册 波特率与帧时间计算 上图片来自:点击打开链接 如何测量CAN总线的波特率? 点击打开链接
  • CAN波特率计算的内幕

    2011-02-12 14:49:23
    Can控制器器只需要进行少量的...其中较难设置的部分就是通信波特率计算CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。
  • CAN总线采用的是异步串行通信,也就是没有单独的时钟线来保证各个收发器之间时钟的一致,每个收发器是按事先设置的波特率来对总线上的电平进行分位。因此波特率设置准确对CAN总线的稳定通信来说非常重要。 CAN总线里...
  • DSP CAN波特率配置

    千次阅读 2020-07-02 14:01:41
  • 飞思卡尔s12系列CAN波特率计算

    千次阅读 2018-10-25 16:13:10
    最近在看飞思卡尔s12系列CAN部分,发现波特率计算这块没有一个讲的详细的,在数据手册里也没有详细说明。 经过仔细研究,特将CAN部分波特率计算总结出来。 引用部分CAN波特率计算资料如下:     简单介绍一个...
  • 使用STM32Cube MX为STM32 CAN总线快速上手教程_HAL库_CAN协议_STM32 前言 博主也是刚接触CAN协议的新手,如有不对的地方欢迎交流 本文旨在使用STM32Cube MX快速上手STM32 CAN协议配置教程,目的在于 “会用” CAN...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,803
精华内容 1,121
关键字:

can通信波特率计算