单片机/MCU论坛
直播中

陈勇

8年用户 1341经验值
私信 关注
[问答]

求助,关于使用 TC39x Aurix 微控制器上的 SCR 检测 LIN 唤醒脉冲疑问求解

您好,我正在尝试使用 TC39x Aurix 微控制器上的 SCR 检测 LIN 唤醒脉冲(250us 至 5ms 的显性(低)脉冲)。根据数据表,SCR 的 UART 模块中有一个硬件 LIN 断线和同步检测,可用于 LIN 通信。经测试,当我发送 LIN 标头时,它能够检测到断路和同步,并且寄存器按预期设置。但是如果发送了唤醒脉冲(仅是主脉冲),则不会发生断路检测。这是预期的吗?我的预期是使用断线检测寄存器标志 UART_LINST.BRK 来检测唤醒脉冲
这不可能吗?还有其他方法可以检测 LIN 唤醒脉冲吗?

回帖(1)

王萍

2025-8-20 17:00:47

好的,这个问题涉及 LIN 总线在 Aurix TC3xx 上的硬件支持细节,理解很清晰。你的观察和预期是合理的,但数据手册的机制需要更精确的理解。结论是:单靠 UART_LINST.BRK 标志检测标准的 LIN 唤醒脉冲确实不可行,这是预期的行为。 需要其他方法。


? 问题原因分析:




  1. 断线检测的条件:



    • UART_LINST.BRK 标志的触发条件是:检测到至少 11 个连续的“0”(显性位)

    • 该功能主要用于 LIN 协议中的帧处理:在 LIN 帧起始时,由主机发送一个“同步间隔”(Sync Break),要求长度为 至少 13 位 的显性电平(通常为 10 到 25 位),后跟一个显性同步场(0x55)。硬件断线检测正是用于识别这个“同步间隔”。




  2. LIN 唤醒脉冲:



    • LIN 唤醒脉冲(通常来自休眠节点或外部事件)是一个 250us 至 5ms 的显性脉冲(低电平)

    • 这个脉冲的长度没有固定的位宽限制。它的时长由电平持续时间定义,而非位数。

    • 在较低的波特率(如 9600bps)下,250us 可能不足 3 个位时间。在较高波特率(如 19200bps)下,可能达到 4.8 个位时间(250us / 52.08us)或者更多(在 5ms 时)。但无论哪种情况,它都极大概率小于触发硬件断线检测所需的 11 个连续显性位













































  3. 对比: 特征 LIN 同步间隔 (Sync Break) LIN 唤醒脉冲 (Wake-Up Pulse)
    目的 LIN 帧起始标识 将总线/节点从休眠模式唤醒
    电平 显性 (低) 显性 (低)
    最小长度 至少 13 位显性 250us
    最大长度 通常 10-25 位显性 5ms
    后跟数据 固定同步场 (0x55) 无特定要求 (可能空闲)
    BRK 检测触发 是 (检测 >=11 位显性) (<11位显性概率极高)



? 因此:



  • LIN 同步间隔(标准帧头的一部分)一定会长于 11 位,因此肯定能触发 BRK 标志。

  • LIN 唤醒脉冲(独立事件)长度在 250us 到 5ms 之间。其等效位宽完全取决于当前的波特率配置

    • 低波特率下(如 9600 bps),单个位时间约 104us,250us 不到 2.5 位时间,5ms 约 48 位时间。

    • 高波特率下(如 19200 bps),单个位时间约 52us,250us 约 4.8 位时间,5ms 约 96 位时间。


  • 只有当一个唤醒脉冲的持续时间在当前的 UART/SCR 波特率设置下,超过了 11 个位时间时,才可能触发 BRK 标志。 对于标准的 250us 唤醒脉冲,除非波特率非常低(低于 ~44000bps / (11/0.00025) ≈ 44000 bps,但实际LIN波特率通常高于此),否则它几乎永远达不到触发硬件的 11 位显性电平要求。5ms 的脉冲在常见的 LIN 波特率下可以触发。

  • 你的测试结果与硬件机制一致: 唤醒脉冲太短(在位宽意义上),无法触发断线检测。这不是硬件错误或配置错误,而是机制本身决定的。你的预期(用 BRK 直接检测唤醒)与硬件设计目的不符。


替代方案:检测 LIN 唤醒脉冲


既然直接靠 BRK 不行,以下是推荐的、更可靠的方法:




  1. 使用 GPT12 定时器 + 引脚中断 (IRQ):



    • 原理: 这是最通用和可靠的方法,可以精确测量脉冲宽度并区分唤醒脉冲和其他干扰。

    • 步骤:

      • 将连接 LIN 总线的 SCR RX 引脚配置为 通用输入(或保持 UART 输入但禁用接收中断),并开启下降沿中断 (Falling Edge Interrupt)

      • 下降沿中断处理函数 (On Falling Edge): 检测到显性电平开始(总线拉低)。

        • 启动一个 GPT12 定时器通道,设置超时时间 稍大于最大唤醒脉冲长度 (例如 6ms)

        • 清除一个用于标记脉冲检测的标志(如 wakeupDetected)。


      • 上升沿中断处理函数 (On Rising Edge) (可选但推荐): 监测总线的恢复。

        • 如果总线在定时器超时前恢复隐性(上升沿),说明低电平结束。读取定时器的计数器值计算低电平持续时间(计数 * GPT 时间基)。

        • 如果这个持续时间 在 250us 到 5ms 范围内,则可以确认检测到有效的 LIN 唤醒脉冲,设置标志(如 wakeupDetected = true)并停止/重置定时器。


      • GPT12 超时中断处理函数 (On Timer Expiry):

        • 定时器超时意味着总线保持低电平超过了最大唤醒脉冲长度(>5ms)

        • 这种情况不是正常的唤醒脉冲,可能是错误、持续显性状态或非唤醒事件。

        • 根据需求处理(如记录错误、尝试恢复总线)。

        • 检查 wakeupDetected 是否已被上升沿中断设置?如果没设置,就处理这个超时事件。


      • 在下降沿中断中启动定时器并在 GPT 超时中断检查 wakeupDetected 状态是核心。上升沿中断测量实际脉宽。





  2. 利用 SCR 的接收超时中断:



    • 原理: SCR 的 UART 模块通常有接收超时中断(如 TO 标志)。这个中断在接收到起始位后,如果在设定时间内没有接收到完整的帧数据触发(或下一个起始位),就会产生。

    • 步骤:

      • 使能 SCR 接收超时中断 (通过 UART_RCR.TOEN 等寄存器)。

      • 配置超时周期(如 UART_RTOR.TO)为一个 略大于单个字节传输所需时间 的值(考虑到波特率)。这个时间应该显著小于 250us

      • 中断处理:

        • 发生接收超时中断 (UART_FSR.TO) 时,检查 UART_FSR.RX (或 UART_RCR.RXE 相关状态位)。如果 RX 引脚处于低电平(显性),这意味着:

          • 起始位被检测到了(拉低了总线)。

          • 但超时时间内没有收到停止位(总线没拉高)。

          • 这暗示着一个持续的低电平状态。


        • 在中断服务程序 (ISR) 中启动 GPT12 定时器/计数器来测量这个低电平的持续时间(如同方法1)。

        • 当检测到总线上升沿(通过 GPIO 中断或持续轮询)或定时器超时(如设6ms)后:

          • 测量脉宽。

          • 如果在 [250us, 5ms] 内,则认为是唤醒脉冲。



      • 优点: 相比 BRKTO 对单个起始位长度(通常 1-2位低电平)更敏感。

      • 缺点:

        • 需要结合 GPT 计时,复杂性稍高。

        • 超时中断可能被其他正常但间隔长的字节触发(不太可能),导致误处理。

        • 对噪声起始位也可能误触发超时中断。需要精确测量脉宽来过滤。






  3. (如果可用) 专用 LIN 唤醒检测硬件:



    • 检查芯片手册和 SCR 部分是否有专门的 LIN 休眠/唤醒控制器(LIN Sleep/Wake-Up Controller)。较新的 MCU 可能在 LIN 外设中集成了专门检测 250us/5ms 唤醒脉冲的状态机/计数器。如果 TC39x SCR 有这个功能(手册中寻找 "Wake-Up Detection", "Sleep Mode Entry/Exit"),通常是最优解。

    • 用法: 需要配置相关寄存器使能唤醒检测功能,设置超时阈值(可能基于时钟周期或 us),并挂载相应的唤醒中断(可能和 UART IRQ 不同)。




? 推荐方案:



  • 首选: GPT12 定时器 + GPIO 下降沿/上升沿中断(方法 1)。这是最直接、最可控、适用范围最广的方法,不依赖于 UART 模块对帧处理的特定状态。

  • 次选(或结合使用): 如果 TO 中断能可靠地在起始位后很快触发,可以结合 SCR 接收超时中断 + GPT 计时(方法 2)。但复杂性可能更高。

  • 最优(如有): 专用 LIN 唤醒检测硬件(方法 3) - 如果可用,务必使用它。


⚙️ 关键实现点:



  • 中断优先级: 确保下降沿中断和定时器中断的优先级足够高(高于 SCR UART 中断,如果同时使用的话),避免错过短脉冲边缘。

  • 脉宽计算: 在 GPT 计数模式(而非定时模式)下测量脉宽更精确(计数器在下降沿开始计数,在上升沿停止计数)。

  • 滤波: 在 GPIO 输入配置中考虑添加去抖滤波(硬件或软件)。

  • 唤醒后处理: 检测到有效唤醒脉冲后,应执行节点唤醒流程:初始化LIN通信模块(如果休眠时关闭了)、发送状态、加入总线通信等。


总结:


确实无法仅依赖 UART_LINST.BRK 来检测标准的 LIN 唤醒脉冲,因为它们通常无法满足触发所需的 11 位连续显性条件。 使用 GPT12 定时器结合 LIN RX 引脚的 GPIO 边沿中断来精确测量脉冲宽度(250us-5ms)是最可靠且通用的解决方案。 务必查阅 TC39x 具体型号的用户手册,确认 SCR 是否有专用唤醒硬件支持,若有则优先采用。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分