以下确定数字的canbus波特率配置的逻辑是什么?
CAN_InitStructure.CAN_BS1 = CAN_BS1_2tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;
CAN_InitStructure.CAN_Prescaler = 16;
CAN_Init(CAN1, &CAN_InitStructure);
答案 0 :(得分:2)
您忘记了
CAN_InitStructure.SyncJumpWidth = CAN_SJW_1TQ;
比特率将是:
BITRATE = (CANCLOCK / CAN_InitStructure.CAN_Prescaler) / (1 + CAN_InitStructure.CAN_BS1 + CAN_InitStructure.CAN_BS2)
其中CANCLOCK是以Hz为单位的CAN外设时钟。这取决于您的时钟树配置。
您的时间量子频率为TQF = CANCLOCK / CAN_InitStructure.CAN_Prescaler
时间量子本身TQ = 1/TQF
(以秒为单位)
位时间为BITTIME = TQ * (CAN_InitStructure.SyncJumpWidth + CAN_InitStructure.CAN_BS1 + CAN_InitStructure.CAN_BS2)
请记住,xxxx_3tq表示 3 个TQ
答案 1 :(得分:2)
为CAN配置波特率有点麻烦,但是所有CAN控制器的工作方式都非常相似。
您希望每位采样点在理想位置87.5%附近(根据Automation / CANopen建议中的CAN)。要到达那里,您需要告诉您采样点之前和之后有多少个TQ(时间量)。
每个TQ的长度由CAN控制器的时钟确定,并从系统时钟中得出并进行分频,每个TQ的长度为1个时钟周期。 16 TQ通常是理想的,因此您需要在此之后选择一个除数。如果您以16MHz的频率运行系统时钟,则可以选择一个16分频来获得1MHz的CAN时钟。请记住,内部RC振荡器对CAN来说是不行的!您必须使用外部晶体或振荡器才能获得足够的精度。
采样点之前的段通常称为同步段(固定的1个TQ),传播段和相位段1-控制器之间的术语有些不同。这些片段合在一起构成所需波特率的87.5%,采样点之后的片段(通常称为相位片段2)应构成其余部分。
同步跳变宽度(SJW)与波特率计算本身无关,但与此相关。 SJW确定对于给定的波特率,时钟可以偏离多少TQ-对于800kbps或1000kbps,您可以将其设置为3,否则应为1。