Thread 中讨论的其他器件:controlSUITE、 C2000WARE
我需要对 CAN 位时序的 CAN_regs 进行一些澄清。 具体来说、位时序寄存器 CAN_BTR、字段 TSEG1 (位11-8)。 我正在阅读《TMS320F2837xS Delfino 微控制器技术参考手册》、该手册于2017年9月修订。第2268页表21-13中的寄存器字段说明显示其采样点之前的时间段、而实际的 Tseg1是编程的寄存器值+ 1。 "采样点前的时间段"这一措辞 似乎表明该时间包括同步段(Sync_Seg)、传播时间段(Prop_seg)和相位缓冲段1 (Phase_Seg1/SJW)。 但是 、第2250页的第21.12.2节指出"因此位时间的长度为(编程值)[TSEG1 + TSEG2 + 3]tq 或(功能值)[Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2]tq。 从第2268页的表21-13中可以看到实际的 TSeg2被编程为 TSEG2寄存器的值+1。 从2245页的表21-4中可以看到 SYC_Seg 固定为1tq。 因此、我假设"位时间长度为(编程值)[TSEG1 + TSEG2 + 3]tq"语句中的"+3"来自实际 TSEG1寄存器值+ 1编程的 TSEG1寄存器值+ 1、实际 TSEG2寄存器值+ 1编程的事实、 第三个+ 1来自将 Sync_seg 固定为1tq。 但这意味着实际的 TSeg1不包括 Sync_seg,这与我在表21-13页2268中对寄存器字段说明的解释相矛盾。
当我查看 C:\ti\controlSUITE\device_support\F2837xS\V210\F2837xS_common\driverlib\can.h 中的示例 C 头文件时、有一个名为 tCANBitClkParams 的 typedef 结构、其成员名为 uSyncPropPhase1Seg。 代码中的注释显示该字段包含 Sync_Seg、Prop_Seg 和 Phase_Seg1的和。 该结构 tCANBitClkParams 用于使用函数 CANBitTimingSet 设置 CAN 位时序。 查看 C:\ti\controlSUITE\device_support\F2837xS\V210\F2837xS_common\driverlib\CAN.c 中的示例 C 源文件时、在第673行的 CANBitTimingSet 函数定义中、它会声明
uBitReg |=((pClkParms->uSyncPropPhase1Seg - 1)<<8)& CAN_BTR_TSEG1_M;
该代码行将 TSEG1寄存器字段设置为(uSyncPropPhase1Seg - 1)。 减1是因为 uSyncPropPhase1Seg 是实际值、而实际值是编程的寄存器值+ 1。 这意味着实际的 Tseg1确实包含 Sync_Seg。 不过,这与我对技术参考手册第21.12.2页2250节所述位时间长度的解释相矛盾。
此外,技术参考手册第21.12.2页2249节规定,"Prop_Seg 和 Phase_Seg1之和(作为 TSEG1)."。 我将该语句解释为 TSEG1不包含 Sync_Seg。
因此、您可以看到、存在许多差异、难以理解实际的 TSeg1是否包括 Sync_Seg。 我的确切问题是:CAN_regs、位定时寄存器 CAN_BTR、字段 TSEG1 (位11-8)是否已编程= ((实际)[Sync_Seg + Prop_Seg + Phase_Seg1])-1, 或者 TSEG1是否已编程= (实际)[Prop_Seg + Phase_Seg1]- 1?