zoukankan      html  css  js  c++  java
  • STM32——CAN总线波特率和位时序详解

    本人用的单片机是STM32F407,其它型号的单片机类似,可做参考!

    一、标准CAN协议位时序概念

    由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯。
    同时,CAN还使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
    为了实现这个位同步,CAN协议将每个位的时序分解为四段:SS段、PTS段、PSB1段、PBS2段。同时定义最小的时间单位:Tq,四个段的长度用x个Tq表示,加起来就是一个位的时序。

    用一个图来表示可能会形象一点,如图一个位的时序就是19Tq。

    以上就是CAN标准协议定义的位时序,而STM32的外设简化了这个标准。

     二、STM32中CAN总线位时序概念

    STM32的CAN外设位时序中只包含3段:同步段SYNC_SEG、位段BS1(合并了PTS段和PSB1段)和位段BS2。

    其中SYNC_SEG的长度固定为1Tq,其它两段的长度可在CAN_BTR中设置。

    这里我们要注意一个细节,BS1段的时间长度其实是等于我们写入的值+1的,同样BS2段也是。

    三、波特率的计算

    在设定了BS1段和BS2段的长度后,我们就可以确定每个CAN数据位的长度了。

    BS1段时间:Ts1 = Tq * (TSI1[3:0] + 1)
    BS2段时间:Ts1 = Tq * (TSI2[2:0] + 1)
    一个数据位的时间:T1bit = 1Tq + Ts1 + Ts2

    根据一个数据位的时间可知:波特率 = 1/T1bit

    这个式子还有Tq一个未知数了。 

    在CAN外设配置中还有一个与波特率有关的参数是BRP(波特率预分频器)

             

    我使用的STM32F407的CAN1外设是挂载在APB1总线上的,它的默认时钟频率为45M,Tpclk=1/45M。

    根据BRP参数的定义:Tq = BRP[9:0] * Tpclk

    这样Tq的值就算出来了,带入上面波特率的计算公式就可以求得CAN总线传输的波特率了。

  • 相关阅读:
    (双指针 二分) leetcode 167. Two Sum II
    (双指针) leetcode 485. Max Consecutive Ones
    (双指针) leetcode 27. Remove Element
    (String) leetcode 67. Add Binary
    (数组) leetcode 66. Plus One
    (N叉树 BFS) leetcode429. N-ary Tree Level Order Traversal
    (N叉树 递归) leetcode 590. N-ary Tree Postorder Traversal
    (N叉树 递归) leetcode589. N-ary Tree Preorder Traversal
    (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree
    (BST 递归) leetcode98. Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/Irvingcode/p/11802541.html
Copyright © 2011-2022 走看看