主题中讨论的其他器件:HALCOGEN
如果可用、请共享 API 以更改 Halcogen 生成的驱动程序中的 CAN 比特率。
此外、
请告诉我更改比特率的过程。 我是否需要再次进入初始化模式以更改比特率?
2.如何确定以下参数的值?
a.预分频器、b. Phase_Seg2、c. Phase_Seg1、d. Prop_Seg、e.同步跳转宽度
3.这些值如何导致所需的比特率?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
如果可用、请共享 API 以更改 Halcogen 生成的驱动程序中的 CAN 比特率。
此外、
请告诉我更改比特率的过程。 我是否需要再次进入初始化模式以更改比特率?
2.如何确定以下参数的值?
a.预分频器、b. Phase_Seg2、c. Phase_Seg1、d. Prop_Seg、e.同步跳转宽度
3.这些值如何导致所需的比特率?
是的。 要更改 CAN 位时序、需要进入"初始化模式"并启用"配置更改"。 下面是位时序配置流程。
步骤1:设置控制寄存器的"Init"位。
步骤2:将控制寄存器中的"cce"位置位
步骤3: 等待 Init 位被置位
步骤4: 将位定时值写入位定时寄存器(BTR)
步骤5:清除 CCE 位、然后清除 Init 位
步骤6:等待"Init"位清零
2.如何确定以下参数的值?
a.预分频器、b. Phase_Seg2、c. Phase_Seg1、d. Prop_Seg、e.同步跳转宽度
[/报价]a:波特率预分频器用于确定采样时钟周期。 一个周期被称为时间份额(Tq)。
有两个预分频器:BRP (0~63)和 BRPE。 BRPE 是 BRP 扩展。 实际预分频器=(BRP+1)+(BRP<<6)(参见 CAN BTR 寄存器)
如果 CAN 时钟为75MHz、BRP=10、BRP=1、那么预分频器=(10+1)+ 64 = 75
TQ =波特率预分频器/ CAN 时钟= 75/75MHz = 1us = 1000ns
B. CAN 位时间由非重叠段组成。 这些段中的每一个都由整数单位组成、称为时间份额(Tq)
标称位时间(tbit)= tSyncSeg + tPropSeg + TPS1 + tPS2
Sync_Seg 是标称位时间中的第一个段、用于同步总线上的节点。 位边沿应出现在 SyncSeg 内。 此段固定为1Tq。
Prop_Seg 用于补偿节点之间的物理延迟。 传播延迟被定义为总线线路上信号传播时间总和的两倍,包括与总线驱动器相关的延迟。
PHASE_Seg1和 PHASE_Seg2用于补偿总线上的边沿相位误差。 可通过重新同步来延长 PS1或缩短 PS2。 Phase_Seg1 充当缓冲器、可延长缓冲器以与位流重新同步。 Phase_Seg2类似于相位段1、但它发生在采样点之后而不是之前。 可以缩短 PHASE_Seg2以与位流重新同步。
SJW 是在每个周期内为了调整节点间振荡器不匹配而延长或缩短位采样周期的最长时间。
请使用 HALCOGen 计算这些参数或使用 Excel 电子表格作为参考:
如前一篇文章所述、标称位时间(tbit)= tSyncSeg + tPropSeg + TPS1 + tPS2
CAN 波特率= 1/tbit
采样点位于相位段1的末尾。 采样点是在位时间内读取和解释逻辑电平的点。
下面是 API 编写的内容。 如果我正确、请告诉我。 我从 Halcogen 获取了比特率参数。 但是、正如您提到的"等待 Init 位被设置" 和"等待"Init"位被清除" 、我如何确保它?
void can1UpdateBAUD_500KB (void)
{
/*设置控制寄存器的"Init"位*/
canREG1->CTL |=(uint32) 0x00000001U;
/*设置控制寄存器中的"cce"位*/
canREG1->CTL |=(uint32)(1U <<6U);
/**- 500Kbit/s 的设置位时序
*-设置波特率预分频器扩展
*-设置 TSeg2
*-设置 TSeg1
*-设置样本跳转宽度
*-设置波特率预分频器
*
canREG1->BTR =(uint32)((uint32) 0U << 16U)|
(uint32)((uint32)(2U-1U)<<12U)|
(uint32)(((uint32)((3U + 2U)- 1U)<<8U)|
(uint32)((uint32)(2U-1U)<<6U)|
(uint32) 19U;
/*清除控制寄存器中的"cce"位*/
canREG1->CTL &=~(uint32)(1U <<6U);
/*清除控制寄存器的"Init"位*/
canREG1->CTL &=~(uint32)(1U <<0U);
}