在LIN总线系统中,微控制器(MCU)LIN收发器 通过分工协作实现通信功能。MCU负责处理高层协议和应用逻辑,而LIN收发器则负责物理层的信号转换和传输。以下是它们的具体工作原理和通信机制:

一、基本硬件连接

MCU与LIN收发器之间通常通过以下接口连接:

  1. TXD(发送数据)

    • MCU → LIN收发器
    • MCU将数字信号(TTL/CMOS电平)发送给LIN收发器。
  2. RXD(接收数据)

    • LIN收发器 → MCU
    • LIN收发器将接收到的LIN总线信号转换为数字信号后发送给MCU。
  3. STB(待机控制)

    • MCU → LIN收发器
    • 控制LIN收发器进入休眠或唤醒状态(低电平=休眠,高电平=工作)。
  4. 电源与地

    • VCC:通常为5V或3.3V,为LIN收发器供电。
    • GND:公共接地端,确保信号参考电平一致。

二、通信流程详解

1. MCU发送数据到LIN总线
MCU (数字信号) → LIN收发器 → LIN总线
  • 步骤
    1. MCU将待发送的数据(如温度值)按照LIN协议打包成帧格式。
    2. MCU通过UART接口将数据以数字信号(如0=0V,1=3.3V)发送到LIN收发器的TXD引脚。
    3. LIN收发器接收TXD信号,并进行以下转换:
      • 显性位(0):拉低LIN_H线至接近0V(通过内部MOSFET接地)。
      • 隐性位(1):释放LIN_H线,使其通过上拉电阻升至VBAT/2(约6V)。
    4. 转换后的差分信号通过LIN_H线传输到总线上。
2. MCU从LIN总线接收数据
LIN总线 → LIN收发器 → MCU (数字信号)
  • 步骤
    1. LIN收发器监测LIN_H线的电压变化:
      • 显性(0):检测到LIN_H≈0V。
      • 隐性(1):检测到LIN_H≈VBAT/2。
    2. LIN收发器将检测到的电压信号转换为数字信号(如0=0V,1=3.3V)。
    3. 转换后的数字信号通过RXD引脚发送给MCU的UART接收端。
    4. MCU解析接收到的数据,提取信号值(如温度、故障码)。
3. 休眠与唤醒机制
  • 休眠

    • MCU将STB引脚置为低电平,通知LIN收发器进入休眠模式。
    • LIN收发器停止发送和接收数据,仅保留最低功耗。
  • 唤醒

    • MCU将STB引脚置为高电平,唤醒LIN收发器。
    • LIN收发器重新开始监测LIN总线,准备接收或发送数据。

三、关键技术细节

1. 信号电平转换
  • MCU侧:TTL/CMOS电平(通常0-3.3V或0-5V)。
  • LIN总线侧:差分电平(显性≈0V,隐性≈VBAT/2)。
  • 转换电路
    LIN收发器内部包含驱动电路,通过MOSFET实现电平转换。例如:
    TXD=0(MCU发送0) → LIN收发器拉低LIN_H → 显性位(0)
    TXD=1(MCU发送1) → LIN收发器释放LIN_H → 隐性位(1)
    
2. 波特率同步
  • MCU配置
    MCU通过UART设置与LIN总线一致的波特率(通常19.2kbps)。

  • 同步场检测
    当LIN收发器接收到同步场(0x55,01010101)时,通过RXD通知MCU,MCU以此校准接收时序。

3. 错误检测与处理
  • LIN收发器功能

    • 监测总线显性超时(Dominant Timeout)。
    • 检测位错误(发送与接收的位值不一致)。
  • MCU响应
    当LIN收发器检测到错误时,通过状态引脚或中断通知MCU,MCU执行错误恢复流程(如重发帧)。

四、典型LIN收发器示例

TJA1020为例(NXP的经典LIN收发器):

  1. 主要特性

    • 支持LIN 2.1/SAE J2602协议。
    • 低功耗待机模式(电流<20μA)。
    • 内置显性超时检测。
    • 总线故障保护(±40V耐压)。
  2. 引脚功能

    • TXD:MCU数据输入。
    • RXD:数据输出到MCU。
    • STB:待机控制(高电平=工作,低电平=休眠)。
    • LIN:连接到LIN总线。
    • VCC:电源(5V)。
    • GND:接地。
  3. 工作模式

    • 正常模式:STB=1,接收和发送数据。
    • 待机模式:STB=0,仅监测唤醒信号。

五、软件实现示例

以下是MCU端的伪代码示例,展示如何通过UART控制LIN收发器:

// 初始化LIN通信
void LIN_Init(void) {
    // 配置UART波特率为19.2kbps
    UART_Init(19200);
    
    // 唤醒LIN收发器
    LIN_Wakeup();
}

// 发送LIN帧
void LIN_SendFrame(uint8_t pid, uint8_t* data, uint8_t length) {
    // 发送同步场 (0x55)
    UART_SendByte(0x55);
    
    // 计算并发送PID (包含奇偶校验)
    uint8_t pid_with_parity = Calculate_PID_With_Parity(pid);
    UART_SendByte(pid_with_parity);
    
    // 发送数据
    for (uint8_t i = 0; i < length; i++) {
        UART_SendByte(data[i]);
    }
    
    // 计算并发送校验和
    uint8_t checksum = Calculate_Checksum(pid_with_parity, data, length);
    UART_SendByte(checksum);
}

// 接收LIN帧
bool LIN_ReceiveFrame(uint8_t* pid, uint8_t* data, uint8_t* length) {
    uint8_t buffer[10];
    uint8_t received_length = 0;
    
    // 等待同步场
    if (UART_WaitForByte(0x55) != 0) {
        return false;
    }
    
    // 接收PID
    buffer[0] = UART_ReceiveByte();
    *pid = Extract_PID_From_Parity(buffer[0]);
    
    // 接收数据 (假设8字节最大)
    for (received_length = 0; received_length < 8; received_length++) {
        buffer[1 + received_length] = UART_ReceiveByte();
        
        // 判断是否接收到校验和 (根据PID确定数据长度)
        if (received_length == Get_Data_Length_For_PID(*pid)) {
            break;
        }
    }
    
    // 接收校验和
    uint8_t received_checksum = UART_ReceiveByte();
    
    // 验证校验和
    if (received_checksum != Calculate_Checksum(buffer[0], &buffer[1], received_length)) {
        return false;  // 校验和错误
    }
    
    // 复制数据
    *length = received_length;
    memcpy(data, &buffer[1], received_length);
    
    return true;  // 接收成功
}

// 控制LIN收发器进入休眠
void LIN_GoToSleep(void) {
    // 拉低STB引脚
    STB_Pin = 0;
}

// 唤醒LIN收发器
void LIN_Wakeup(void) {
    // 拉高STB引脚
    STB_Pin = 1;
    
    // 发送唤醒信号 (拉低LIN总线至少250ms)
    UART_SendBreak();
}

六、常见问题与解决方案

  1. 通信失败

    • 原因:波特率不匹配、STB引脚状态错误、电源问题。
    • 排查:使用示波器检查LIN_H波形,确认同步场和位时间是否正确。
  2. 信号质量差

    • 原因:终端电阻缺失(标准1kΩ)、线路过长、电磁干扰。
    • 解决方案:添加终端电阻,缩短线路长度,增加屏蔽层。
  3. 节点无响应

    • 原因:MCU程序崩溃、LIN收发器损坏、总线短路。
    • 排查:检查MCU工作状态,测量LIN收发器引脚电压,断开总线逐一排查节点。

通过理解MCU与LIN收发器的协作机制,结合硬件连接和软件编程,可实现可靠的LIN总线通信系统。

Logo

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

更多推荐