LIN总线主节点发送帧头与从节点发送响应的过程

(I)、主节点发送帧头的具体步骤如下:

  1. 确定调度表:主节点根据应用层的需求和预先定义好的调度表,确定要发送的帧以及发送的时间间隔。调度表规定了总线上帧的传输次序以及各帧在总线上的传输时间。
  2. 构建帧头:主节点按照LIN总线协议的规定,构建帧头。帧头由间隔场、同步场和PID场(受保护ID场)组成。间隔场用于标识帧的开始,通常是一个特定长度的显性电平信号;同步场是一个固定的字节值(如0x55),用于让从节点进行时钟同步;PID场则包含了帧的标识符,用于指示从节点该帧的用途和相关信息。
  3. 发送帧头:主节点通过LIN收发器将构建好的帧头发送到LIN总线上。LIN收发器将MCU输出的TTL/CMOS电平信号转换为适合LIN总线传输的电平信号,并驱动LIN_H线将帧头信号发送出去。
  4. 等待从节点响应:主节点发送完帧头后,等待从节点根据帧头中的PID信息进行响应。从节点会解析帧头,判断是否是自己需要响应的帧,如果是,则准备相应的数据和校验和,通过LIN收发器发送到总线上作为应答。
  5. 接收和处理从节点应答:主节点的LIN收发器接收从节点发送的应答信号,将其转换为TTL/CMOS电平信号后传递给MCU。MCU对接收的数据进行校验和解析,以获取从节点发送的有效信息,并根据应用需求进行相应的处理。

在一些特殊情况下,如事件触发帧的冲突解决、偶发帧的传输等,主节点可能还需要执行额外的操作来确保数据的正确传输和网络的正常运行。

(II)、从节点响应的具体过程如下:

在LIN总线系统中,从节点发送数据是一个被动响应主节点请求的过程。以下是从节点发送数据的具体步骤,结合硬件交互和协议流程详细说明:

一、从节点接收主节点帧头

1. 总线监听
  • 从节点的LIN收发器(如TJA1020)持续监测LIN_H线的电平变化。
  • 当检测到显性电平(≈0V)持续时间超过间隔场阈值(>13位时间),触发帧接收流程。
2. 同步场检测与波特率校准
  • 从节点识别同步场(0x55,即01010101),通过位边沿间隔计算实际波特率。
  • 调整内部采样点(通常为7/8位时间处),确保准确解码后续数据。
3. PID解析与过滤
  • 接收6位帧ID及2位奇偶校验位(P0、P1),计算并验证奇偶校验:
    P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4  
    P1 = ¬(ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5)
    
  • 将解析后的ID与本地配置的发送帧ID列表对比,决定是否响应。

二、数据准备与封装

1. 数据采集
  • MCU从传感器或内部寄存器读取数据(如温度值、开关状态)。
  • 示例:温度传感器节点读取ADC值,转换为实际温度(如25.5℃)。
2. 信号编码
  • 将物理值按LDF(LIN描述文件)定义编码为原始值:
    原始值 = (物理值 - 偏移量) ÷ 斜率
    
    例如,温度信号AirPtcIgbt1TempActl的编码为:
    CooltT {
      physical_value, 0, 255, 1.0, -40.0, "degC";  // 范围-40℃~215℃
    }
    
    若实际温度为25.5℃,则原始值为:
    (25.5 - (-40.0)) ÷ 1.0 = 65.5 → 四舍五入为66 (0x42)
    
3. 帧组装
  • 将多个信号按LDF定义的位偏移组合到数据场中。
  • 示例:帧AirPtcEcm_Lin1Fr02(PID=0x25)包含3个信号:
    AirPtcDutyReq, 0;        // 占空比请求(8位)
    AirPtcHwError, 8;        // 硬件错误标志(1位)
    AirPtcIgbt1TempActl, 16; // IGBT温度(8位)
    
    假设实际值:占空比=50%(0x32),无错误(0),温度=25.5℃(0x42),则数据场为:
    0x32, 0x00, 0x42, ...  // 其他字节(若有)
    

三、数据发送与总线竞争处理

1. 发送时序控制
  • 从节点在主节点发送帧头后,等待固定时间(称为节点保护时间,通常≥200μs)。
  • 此时间用于避免多个从节点同时响应,确保总线竞争安全。
2. 数据场传输
  • MCU通过UART将数据发送至LIN收发器的TXD引脚。
  • 收发器将逻辑电平转换为总线信号:
    • 显性(0):拉低LIN_H线至0V。
    • 隐性(1):释放LIN_H线,通过上拉电阻升至VBAT/2(约6V)。
3. 校验和计算与发送
  • 计算增强型校验和(包含PID和数据场):
    def calculate_checksum(pid, data):
        checksum = pid
        for byte in data:
            checksum += byte
            if checksum > 255:
                checksum -= 255  # 模256
        return ~checksum & 0xFF  # 取反
    
  • 将校验和作为最后一个字节发送。

四、错误处理与确认

1. 发送监测
  • 从节点在发送过程中持续监听总线,验证发送的位与实际传输是否一致。
  • 若检测到位错误(如发送1但总线为0),立即停止发送并标记错误。
2. 接收主节点确认
  • 主节点在接收到完整帧后,通过后续调度表的正常执行间接确认通信成功。
  • 若主节点未收到有效帧(如校验和错误),可能在下一周期重发请求帧。

五、软件实现示例

以下是从节点MCU的伪代码示例,展示数据发送流程:

// 从节点数据发送处理函数
void LIN_Slave_ProcessFrame(uint8_t received_pid) {
    // 检查是否为自己的发送帧ID
    if (!IsMyTransmitID(received_pid)) {
        return;  // 非本节点发送帧,退出
    }
    
    // 数据准备
    uint8_t data[8] = {0};
    uint8_t data_length = GetDataLengthForPID(received_pid);
    
    // 采集并编码信号
    EncodeSignals(received_pid, data);
    
    // 计算校验和
    uint8_t checksum = CalculateEnhancedChecksum(received_pid, data, data_length);
    
    // 等待节点保护时间(避免总线竞争)
    Delay_Us(200);  // 至少200μs
    
    // 通过UART发送数据
    UART_SendBuffer(data, data_length);
    UART_SendByte(checksum);
    
    // 监测总线,验证发送
    if (CheckBusForTransmitError()) {
        HandleTransmitError();
    }
}

// 信号编码函数示例
void EncodeSignals(uint8_t pid, uint8_t* data) {
    if (pid == 0x25) {  // 示例:AirPtcEcm_Lin1Fr02
        // 1. 编码占空比请求 (50% → 0x32)
        uint8_t duty_cycle = (uint8_t)(50.0 * 255.0 / 100.0);  // 0-100% → 0-255
        data[0] = duty_cycle;
        
        // 2. 编码硬件错误标志 (无错误 → 0)
        data[1] = 0;
        
        // 3. 编码IGBT温度 (25.5℃ → 0x42)
        uint8_t temperature = (uint8_t)(25.5 - (-40.0));  // 根据CooltT编码类型
        data[2] = temperature;
    }
    // 其他PID的编码...
}

六、关键协作机制

  1. 波特率同步
    从节点通过主节点发送的同步场(0x55)校准本地时钟,确保位采样点准确。

  2. 休眠唤醒
    从节点在休眠模式下仅监测总线唤醒信号(显性电平≥250ms),唤醒后重新同步波特率。

  3. 总线竞争避免
    所有从节点严格按照主节点调度表响应,通过节点保护时间避免同时发送。

通过以上步骤,从节点在主节点的调度下,将本地数据可靠地发送到LIN总线上,实现分布式节点间的通信。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐