S32K的晶振模式

LOW GAIN:
当配置为LOW GAIN时,不需要反馈电阻。

HIGH GAIN:
当配置为HIGH GAIN 时,需要增加1M反馈电阻。

选择high gain和low gain的主要因素点是:
1.HIGH GAIN对抗ESD性能更好,因为Peak-to-Peak amplitude of oscillation是3V
2.LOW GAIN对EMC会好些,其Peak-to-Peak amplitude of oscillation是1V

在S32K1的手册里,开启外部晶振后,代码通常会去死循环等待一个硬件标志位:
while((SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)== 0);(等待 SOSC Valid)。
但这个标志位是个“大忽悠”!
对于High Gain模式来说,这个硬件检测电路只看电压波幅。只要电压波幅越过了设定的门限(比如超过了2V),它就迫不及待地把SOSCVLD置为1,告诉 CPU:“晶振就绪了!”。
然而,电压达到阈值,不代表频率已经稳定!此时晶振内部的石英片还在剧烈形变、泛音乱飞,频率(Jitter)抖动得一塌糊涂。CAN模块如果这个时候去抓时钟,必死无疑。

正确的时序规划:
在休眠唤醒(Wakeup)的完整代码流中,正确的执行顺序应该是这样的:
阶段1:唤醒,开启并切回主时钟
• MCU 刚从休眠醒来(此时跑在内部低速/低精度IRC振荡器上)。
• 配置并使能外部晶振SOSC(High Gain)。
•等待硬件标志位SOSCVLD置位(此时波幅够了,但频率还在抖)。
•使能PLL(锁相环),并等待PLL锁定SPLLVLD,置位。
• 切换系统主时钟(Core Clock/Bus Clock)到PLL。

阶段2:
这个时候,系统已经跑在高速时钟上了,晶振正在拼命震荡并趋于稳定。
•【插入纯软件延时】:在这里执行一个死循环延时(比如for循环),或者启动一个定时器。延时2ms~5ms足矣。
• 这5毫秒里,让子弹飞一会儿,让High Gain 的巨大能量在晶振内部达到稳态,把那些杂乱的谐波和相位噪声消耗掉。

阶段3:给CAN供电并恢复通信
• 延时结束!此时的系统时钟已经是纯净无比的100%稳定正弦/方波。
• 开启CAN模块的时钟门控(打开PCC_FIexCANx的Clock Gate)。
• 执行CAN的初始化、波特率重配(Can_Init)。
• 将CAN控制器切入NORMAL模式(Can_SetControllerMode(START)),开始收发报文。

最后工程经验来说是严格限制HIGH GAIN模式的使用。LOW GAIN能保证休眠唤醒的稳定且能节省一个1M的电阻。

posted @ 2026-03-11 22:45  日暮_途远  阅读(89)  评论(0)    收藏  举报