CAN波特率计算

计算方法

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

/*
* 函数名: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);
}

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

st-img

计算过程

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

st-img

  1. 波特率 = 1 / 位时间
  2. 位时间 = (1*tq + tbs1 + tbs2),注意,这里与 CAN_SJW_1tq 无关!!
  3. 如果:tbs1 = 2 , tbs2 = 1,则:位时间 =  (1+2+1)tq = 4 tq。
  4. 注意:这里,还有个分频, 分频分的不是主频(71MHz),是CAN总线的APB1 频率,手册上写着,36MHz,也就是 主频的2分频。
  5. 系统默认初始化后,APB1总线频率,设置为 36MHz。
  6. 这里CAN控制器,可以把APB1 继续分频,如 18,那么,CAN控制器频率:36Mhz / 18 = 2 Mhz。
  7. 波特率:=  1 /  4 * (1/2Mhz) = 0.5Mhz = 500 Kbps
  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GD32是一款单片机芯片,支持CAN通信协议。而CAN通信需要设置波特率才能实现数据传输,因此需要对GD32进行波特率计算。 首先,波特率是指数据传输时每秒钟传输的位数。在CAN通信中,波特率计算需要考虑以下几个因素: 1. Tq:CAN通信周期的时间,通常是由时间触发器提供的,可通过预设分频系数调整周期长度。 2. Bit time:每个传输单位的时间,可通过时序控制器进行设置,通常由同步段、传输段和重复段组成。 3. Sync Seg:同步段的长度,通常是Bit time的1/4到1/8。 4. Prop Seg:传输段的长度,表示在信号从发射器传输到接收器时的时延,通常为1-8个Tq。 5. Phase Seg1:第一重传输段的长度,通常为1-8个Tq。 6. Phase Seg2:第二重传输段的长度,通常为1-8个Tq。 根据上述参数,GD32的CAN波特率计算公式为: 波特率 = 时钟频率 / (Tq x (Sync Seg + Prop Seg + Phase Seg1 + Phase Seg2 + 1)) 其中,时钟频率指GD32的主频,Sync Seg、Prop Seg、Phase Seg1和Phase Seg2为通过寄存器设置的参数,Tq为CAN周期的时长。在实际应用中,可以根据需要调整参数值,以满足不同的波特率需求。 总结来说,GD32的CAN波特率计算需要考虑多个参数,其中包括时钟频率、CAN周期时长和各个传输段的长度等。通过设置这些参数,可以实现不同波特率的CAN数据传输。 ### 回答2: GD32是一种微控制器芯片系列,它支持CAN总线通信协议。在使用GD32进行CAN总线通信时,需要设置正确的波特率来保证正常的数据传输。一般来讲,GD32支持的CAN波特率范围为1Mbps到125Kbps。如果需要计算具体的波特率数值,可以使用以下公式: CAN波特率 = 系统时钟频率 / (分频器系数 * (时间段1 + 时间段2 + 1)) 其中,系统时钟频率是GD32的主时钟频率,分频器系数可以设定为1到1024之间的整数,时间段1和时间段2分别表示CAN总线的两个时间段,它们的值也可以设定为1到16之间的整数。 具体地,可以通过以下步骤来计算GD32的CAN波特率: 1. 确定系统时钟频率。在GD32的时钟配置中,可以设置CPU时钟频率、AHB总线时钟频率和APB总线时钟频率。需要根据具体的需求来选择合适的时钟频率。 2. 选择合适的分频器系数。GD32的CAN模块支持的分频器系数为1到1024之间的整数,选择哪一个分频器系数,可以根据需要得到的波特率范围来决定。一般来说,分频器系数越小,得到的波特率就越高。 3. 设定时间段1和时间段2的值。时间段1和时间段2的值决定了CAN总线的两个时间段的长度,一般来说,这两个值要尽量相等,可以设定为1到16之间的整数。 通过以上步骤,可以得到一个合适的CAN波特率。在设置CAN模块的波特率时,需要把计算出的数值配置到相应的寄存器中,以确保CAN总线的正常通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值