可以参考TSMaster硬件—总线硬件–硬件配置。SJW 是围绕标称 80% 采样点做动态纠偏如果采样点过小过大都可能造成采样错误导致引起总线错误或者数据错误CAN 里一个 bit 时间会被分成几段Sync_SegTimeSeg1TimeSeg2“采样点 80%”指的是从这一位开始算起走到整个位时间的 80% 位置时控制器去读取总线电平判定这一位是 0 还是 1。以你这组参数为例Sync_Seg 1 tqTimeSeg1 15 tqTimeSeg2 4 tq总共是 1 15 4 20 tq采样点在 Sync_Seg TimeSeg1 的末尾也就是(1 15) / 20 16 / 20 80%所以可以直接理解成这一位走到 80% 的位置时采样后面的 20% (TimeSeg2) 主要留给相位调整、重同步这些用途。你也可以把它想成前 80%等信号稳定准备采样到 80% 那一刻真正读电平后 20%给时钟误差和重同步留余量对经典 CAN / CAN FD 的仲裁相位Nominal phase来说常见经验是75% ~ 80%高速、总线较短时常见80% ~ 87.5%最常见也更适合线长更长、波特率更低的场景87.5%很多工具和厂家默认爱用但不是越大越好可以这么理解采样点偏前给 TSEG2/SJW 留的余量更大重同步能力更好采样点偏后给信号传播留的余量更大更适合长线、低速太靠后也不好TSEG2 会变小SJW 上限也跟着受限抗时钟偏差能力会变差所以一般建议是500k/1M、线短先看 75%~80%250k/125k/50k、线较长先看 80%~87.5%如果没有特别依据80% 是一个很稳妥的起点你这组参数1 15 4 20 tq采样点 (115)/20 80%这个设置是合理的而且 TSEG24SJW 还能取到 4平衡性不错。把一个 CAN 位想成被切成很多个很小的时间片 tq结构大致是更准确一点Sync_Seg同步段固定是 1 tqSeg1第一段时间表示“从位开始到采样点之前”这段时间Seg2第二段时间表示“采样点到位结束”这段时间所以一个 bit 总长度 1 Seg1 Seg2采样点位置 1 Seg1比如你现在这组参数Sync_Seg 1Seg1 15Seg2 4那总共就是 20 tq采样点在第 16 tq也就是 16/20 80%。你问的“跳变宽度”就是 SJW全名 Sync Jump Width。它不是采样点本身而是当控制器发现总线边沿和自己预计的不完全一致时允许它一次最多把位时间“拉长/缩短”多少个 tq这个调整就是为了重同步可以把它理解成“时序纠偏的最大步长”。所以要分开看Seg1 和 Seg2决定名义上的采样点在哪SJW决定采样点在重同步时最多能挪动多少严格说不是这 3 个一起“静态决定”采样点真正决定标称采样点的是Seg1Seg2再加上固定的 Sync_Seg 1SJW 影响的是动态调整能力不是标称采样点公式本身。再补一句直观理解Seg1 大采样点就靠后Seg2 大采样点就靠前SJW 大抗时钟偏差和重同步能力更强但通常不能大于 Seg2直接给你画一个“边沿提前/滞后时SJW 怎么修正”的小图这个一看就明白。先看一个 bit 的正常时序假设你的参数是Sync_Seg 1 tqSeg1 15 tqSeg2 4 tqSJW 4 tq所以这张图表达的是这一位一共 20 tq走到第 16 tq 时采样后面剩下的 4 tq 是 Seg2再看 SJW 是干什么的。它是“重同步时允许一次最多修正多少个 tq”。如果总线边沿比你预计的“早到了”可以理解成“别人节奏比我快一点我往前赶一赶”。如果总线边沿比你预计的“晚到了”可以理解成“别人节奏比我慢一点我等一等”。再把“采样点”和“SJW”放在一张图里看重点是Seg1 决定采样点前面有多长Seg2 决定采样点后面有多长SJW 决定时钟不一致时最多能修正多少所以标称采样点主要由 Sync_Seg Seg1 决定SJW 不直接决定“名义采样点位置”但 SJW 决定这个采样点在重同步时能灵活调整多少结合你现在的参数所以你那组 SJW 4、Seg2 4 很合理如果改成 SJW 15修正能力就超过了后段余量通常不合适。为什么 SJW 一般不能大于 Seg2”的直观图把它想成“位尾巴只剩这么长你不可能往前裁掉超过尾巴长度的时间”。先看正常一个 bit如果你想提前得更多比如想修正 6 tq但 Seg2 只有 4 tq直观上就是SJW “一次最多允许修正多少 tq”Seg2 “采样点后面实际剩下多少 tq”如果 SJW Seg2那遇到早到边沿时控制器理论上会想“往前跳”超过当前 bit 尾部可用的长度没地方可跳所以通常要满足SJW Seg2再套回你现在那组参数Seg1 15Seg2 4SJW 4就是这组是合理的如果改成 SJW 15就等于说“允许一次最多修正 15 tq”但采样点后面明明只剩 4 tq不匹配。补一句更严谨的说法你代码里这个 Seg1/Seg2 是简化叫法在 CAN 位时序理论里真正参与重同步的是相位段 PhaseSeg1/PhaseSeg2很多控制器把这些合并后暴露成 TSEG1/TSEG2所以工程上就常直接说 SJW 一般不能大于 Seg2sjw跳的是seg2的地方啊从seg2跳到seg1的方向可以这么理解但更准确一点说不是“把 Seg2 的时间块跳到 Seg1 去”而是“在 Seg1/Seg2 这个分界点附近允许采样点前后挪动一点”。看图最直观采样点就在 Seg1 和 Seg2 的交界处所以重同步时本质上是在调这个交界点。如果边沿“早到了”说明你的本地时钟偏慢了控制器会把当前 bit 缩短一点。直观上可以理解成Seg2 变短采样点相对“往前靠一点”早到边沿缩短后半段| Sync |----------- Seg1 -----------|-Seg2-|如果边沿“晚到了”说明你的本地时钟偏快了控制器会把当前 bit 拉长一点。直观上可以理解成Seg1 变长一点采样点相对“往后靠一点”晚到边沿拉长前半段| Sync |------------- Seg1 -------------|-- Seg2 --|所以你那句话“从 Seg2 跳到 Seg1 的方向”只对了一半对早到边沿确实更像是从 Seg2 这边往前收但本质不是“时间从 Seg2 搬到 Seg1”本质是“采样点这个分界线最多按 SJW 允许的量前后调整”更严谨的经典说法是边沿早到缩短 PhaseSeg2边沿晚到延长 PhaseSeg1而你代码里的 Seg1/Seg2就是控制器对这些位时序段的工程化参数表示。所以结论一句话SJW 不是在某一段里“跳”而是在 Seg1 和 Seg2 的分界处规定重同步时最多能把这个分界点挪动多少个 tq。所以sjw就是动态调整采样点在80%不完全是。更准确地说SJW 不是“把采样点固定在 80%”而是80% 是你配置出来的标称采样点SJW 是总线时钟有偏差时控制器允许对这个采样时刻做的最大动态修正量也就是平时没有重同步时采样点就在 80%检测到边沿提前/滞后时控制器会在这个 80% 附近微调一次最多微调 SJW 个 tq所以可以理解成Seg1、Seg2 决定“默认采样点是 80%”SJW 决定“默认 80% 附近最多能挪多少”打个不太严谨但直观的比方80% 是你原本定好的打卡时间SJW 是允许你因为路况提前/延后几分钟它不是重新规定打卡时间而是给这个时间一个可调整范围对你这组参数总位宽 20 tq默认采样点在 16 tq也就是 80%SJW 4 表示重同步时采样时刻最多可修正 4 tq所以一句话总结SJW 是围绕标称 80% 采样点做动态纠偏不是把采样点本身定义成 80%。
CAN协议的采样点
可以参考TSMaster硬件—总线硬件–硬件配置。SJW 是围绕标称 80% 采样点做动态纠偏如果采样点过小过大都可能造成采样错误导致引起总线错误或者数据错误CAN 里一个 bit 时间会被分成几段Sync_SegTimeSeg1TimeSeg2“采样点 80%”指的是从这一位开始算起走到整个位时间的 80% 位置时控制器去读取总线电平判定这一位是 0 还是 1。以你这组参数为例Sync_Seg 1 tqTimeSeg1 15 tqTimeSeg2 4 tq总共是 1 15 4 20 tq采样点在 Sync_Seg TimeSeg1 的末尾也就是(1 15) / 20 16 / 20 80%所以可以直接理解成这一位走到 80% 的位置时采样后面的 20% (TimeSeg2) 主要留给相位调整、重同步这些用途。你也可以把它想成前 80%等信号稳定准备采样到 80% 那一刻真正读电平后 20%给时钟误差和重同步留余量对经典 CAN / CAN FD 的仲裁相位Nominal phase来说常见经验是75% ~ 80%高速、总线较短时常见80% ~ 87.5%最常见也更适合线长更长、波特率更低的场景87.5%很多工具和厂家默认爱用但不是越大越好可以这么理解采样点偏前给 TSEG2/SJW 留的余量更大重同步能力更好采样点偏后给信号传播留的余量更大更适合长线、低速太靠后也不好TSEG2 会变小SJW 上限也跟着受限抗时钟偏差能力会变差所以一般建议是500k/1M、线短先看 75%~80%250k/125k/50k、线较长先看 80%~87.5%如果没有特别依据80% 是一个很稳妥的起点你这组参数1 15 4 20 tq采样点 (115)/20 80%这个设置是合理的而且 TSEG24SJW 还能取到 4平衡性不错。把一个 CAN 位想成被切成很多个很小的时间片 tq结构大致是更准确一点Sync_Seg同步段固定是 1 tqSeg1第一段时间表示“从位开始到采样点之前”这段时间Seg2第二段时间表示“采样点到位结束”这段时间所以一个 bit 总长度 1 Seg1 Seg2采样点位置 1 Seg1比如你现在这组参数Sync_Seg 1Seg1 15Seg2 4那总共就是 20 tq采样点在第 16 tq也就是 16/20 80%。你问的“跳变宽度”就是 SJW全名 Sync Jump Width。它不是采样点本身而是当控制器发现总线边沿和自己预计的不完全一致时允许它一次最多把位时间“拉长/缩短”多少个 tq这个调整就是为了重同步可以把它理解成“时序纠偏的最大步长”。所以要分开看Seg1 和 Seg2决定名义上的采样点在哪SJW决定采样点在重同步时最多能挪动多少严格说不是这 3 个一起“静态决定”采样点真正决定标称采样点的是Seg1Seg2再加上固定的 Sync_Seg 1SJW 影响的是动态调整能力不是标称采样点公式本身。再补一句直观理解Seg1 大采样点就靠后Seg2 大采样点就靠前SJW 大抗时钟偏差和重同步能力更强但通常不能大于 Seg2直接给你画一个“边沿提前/滞后时SJW 怎么修正”的小图这个一看就明白。先看一个 bit 的正常时序假设你的参数是Sync_Seg 1 tqSeg1 15 tqSeg2 4 tqSJW 4 tq所以这张图表达的是这一位一共 20 tq走到第 16 tq 时采样后面剩下的 4 tq 是 Seg2再看 SJW 是干什么的。它是“重同步时允许一次最多修正多少个 tq”。如果总线边沿比你预计的“早到了”可以理解成“别人节奏比我快一点我往前赶一赶”。如果总线边沿比你预计的“晚到了”可以理解成“别人节奏比我慢一点我等一等”。再把“采样点”和“SJW”放在一张图里看重点是Seg1 决定采样点前面有多长Seg2 决定采样点后面有多长SJW 决定时钟不一致时最多能修正多少所以标称采样点主要由 Sync_Seg Seg1 决定SJW 不直接决定“名义采样点位置”但 SJW 决定这个采样点在重同步时能灵活调整多少结合你现在的参数所以你那组 SJW 4、Seg2 4 很合理如果改成 SJW 15修正能力就超过了后段余量通常不合适。为什么 SJW 一般不能大于 Seg2”的直观图把它想成“位尾巴只剩这么长你不可能往前裁掉超过尾巴长度的时间”。先看正常一个 bit如果你想提前得更多比如想修正 6 tq但 Seg2 只有 4 tq直观上就是SJW “一次最多允许修正多少 tq”Seg2 “采样点后面实际剩下多少 tq”如果 SJW Seg2那遇到早到边沿时控制器理论上会想“往前跳”超过当前 bit 尾部可用的长度没地方可跳所以通常要满足SJW Seg2再套回你现在那组参数Seg1 15Seg2 4SJW 4就是这组是合理的如果改成 SJW 15就等于说“允许一次最多修正 15 tq”但采样点后面明明只剩 4 tq不匹配。补一句更严谨的说法你代码里这个 Seg1/Seg2 是简化叫法在 CAN 位时序理论里真正参与重同步的是相位段 PhaseSeg1/PhaseSeg2很多控制器把这些合并后暴露成 TSEG1/TSEG2所以工程上就常直接说 SJW 一般不能大于 Seg2sjw跳的是seg2的地方啊从seg2跳到seg1的方向可以这么理解但更准确一点说不是“把 Seg2 的时间块跳到 Seg1 去”而是“在 Seg1/Seg2 这个分界点附近允许采样点前后挪动一点”。看图最直观采样点就在 Seg1 和 Seg2 的交界处所以重同步时本质上是在调这个交界点。如果边沿“早到了”说明你的本地时钟偏慢了控制器会把当前 bit 缩短一点。直观上可以理解成Seg2 变短采样点相对“往前靠一点”早到边沿缩短后半段| Sync |----------- Seg1 -----------|-Seg2-|如果边沿“晚到了”说明你的本地时钟偏快了控制器会把当前 bit 拉长一点。直观上可以理解成Seg1 变长一点采样点相对“往后靠一点”晚到边沿拉长前半段| Sync |------------- Seg1 -------------|-- Seg2 --|所以你那句话“从 Seg2 跳到 Seg1 的方向”只对了一半对早到边沿确实更像是从 Seg2 这边往前收但本质不是“时间从 Seg2 搬到 Seg1”本质是“采样点这个分界线最多按 SJW 允许的量前后调整”更严谨的经典说法是边沿早到缩短 PhaseSeg2边沿晚到延长 PhaseSeg1而你代码里的 Seg1/Seg2就是控制器对这些位时序段的工程化参数表示。所以结论一句话SJW 不是在某一段里“跳”而是在 Seg1 和 Seg2 的分界处规定重同步时最多能把这个分界点挪动多少个 tq。所以sjw就是动态调整采样点在80%不完全是。更准确地说SJW 不是“把采样点固定在 80%”而是80% 是你配置出来的标称采样点SJW 是总线时钟有偏差时控制器允许对这个采样时刻做的最大动态修正量也就是平时没有重同步时采样点就在 80%检测到边沿提前/滞后时控制器会在这个 80% 附近微调一次最多微调 SJW 个 tq所以可以理解成Seg1、Seg2 决定“默认采样点是 80%”SJW 决定“默认 80% 附近最多能挪多少”打个不太严谨但直观的比方80% 是你原本定好的打卡时间SJW 是允许你因为路况提前/延后几分钟它不是重新规定打卡时间而是给这个时间一个可调整范围对你这组参数总位宽 20 tq默认采样点在 16 tq也就是 80%SJW 4 表示重同步时采样时刻最多可修正 4 tq所以一句话总结SJW 是围绕标称 80% 采样点做动态纠偏不是把采样点本身定义成 80%。