CH32 LIN 通信配置

   CH32的串口支持LIN模式,现通过以下寄存器配置实现LIN通信。

 一  主机模式,整个LIN网络只有一个Master节点,其串口需要能生成一个特殊的、长达13位以上的低电平信号,

即间隔场(Break Field),以此标志一帧消息的开始。随后,指挥官发送同步字节(0x55)和受保护ID(PID),点名

某个从节点进行通。除了多了下面几个寄存器配置,别的与普通串口初始化无异

 
    USART_LINBreakDetectLengthConfig( USART2, USART_LINBreakDetectLength_11b );  //LIN模式检测断开帧长度, 11bit进LBD置位
    USART_LINCmd( USART2, ENABLE ); //使能LIN模式
typedef struct
{
    u8 FrameHead;  // 帧头  0x5A
    u8 Len; //data len (10Byte) 1
    u8 dataBuf[10]; //1byte ID + 8byte data + 1校验
    u8 FrameEnd;   //// 帧头  0xA5
}UART1_Rx;   Master数据发送结构体。
填充结构体数据
    LIN_Most_Tx.dataLen = 8;
    LIN_Most_Tx.sync = 0x55;
    LIN_Most_Tx.ID = 0x80;

    for(i=0; i<8; i++){
        LIN_Most_Tx.dataBuf[i] = i;
    }

    LIN_Most_Tx.dataCheckValue = 0xAA;
 
    USART2_SendBreak();//发送间隔帧
    USART2_SendData(LIN_Most_Tx.dataLen + 3, &LIN_Most_Tx.sync);
 
   从机配置:除了多了下面几个寄存器配置,别的与普通串口初始化无异
 
    USART_ITConfig( USART2, USART_IT_RXNE, ENABLE );        //RXNE中断使能
    USART_ITConfig( USART2, USART_IT_LBD, ENABLE );     //断开中断使能
 
中断函数:
void USART2_IRQHandler(void)
{
    /* 断开中断标志 */
    if( USART_GetITStatus( USART2, USART_IT_LBD ) != RESET )
    {
        printf( "LBD\r\n");
        Rx_Break_Flag = 1;
        tim2_cnt = 0;
        TIM2->CNT = 0;
        ClearTIM2flag =1;

        USART_ClearITPendingBit( USART2, USART_IT_LBD );    //清除LBD中断标志位
    }

    /* 接收数据 */
    if( USART_GetITStatus( USART2, USART_IT_RXNE ) != RESET ){  //接收数据寄存器非空

        if(Rx_Break_Flag){
            Rec_cnt++;

            if(Rec_cnt == 1){
                LIN_Most_Rx.sync = USART_ReceiveData(USART2);  //读清中断
            }
            if(Rec_cnt == 2){
                LIN_Most_Rx.ID = USART_ReceiveData(USART2);  //读清中断
            }
            else if(Rec_cnt <= 10){
                LIN_Most_Rx.dataBuf[Rec_cnt-3] = USART_ReceiveData(USART2);  //读清中断
            }
            else if(Rec_cnt == 11){
                LIN_Most_Rx.dataCheckValue = USART_ReceiveData(USART2);  //读清中断
                Rx_Break_Flag = 0;
                ValidData = 1;
                Rec_cnt = 0;
                ClearTIM2flag =0;
            }
        }
        else{ /* 无效数据 */
            USART_ReceiveData(USART2);  //读清中断
            Rec_cnt = 0;
        }
    }
}
while(1)
{
        if(ValidData){
            ValidData = 0;
            printf("Rx vaild data:\r\n");
            printf("ID %02x\r\n", LIN_Most_Rx.ID);
            printf("dataBuf:\r\n");
            for(i=0; i<8; i++){
               printf(" %02x\r\n", LIN_Most_Rx.dataBuf[i]);
            }printf("\r\n");
            printf("dataCheckValue %02x\r\n", LIN_Most_Rx.dataCheckValue);
        }
}
 

使用串口进行LIN通信的注意事项

  

1. 硬件设计注意事项

  • 电平转换与收发器:MCU的UART通常是TTL电平(0-3.3V/5V),而LIN总线是车载12V的单线总线。因此,两者之间必须通过一个LIN收发器(如MCP2003B)进行连接。收发器负责将UART的TX/RX信号转换为LIN总线的隐性(高电平)和显性(低电平)电平。

  • 上拉电阻与电源:在收发器和总线之间,主节点需要连接一个1kΩ的上拉电阻和二极管到电池电源(Vbat),而从节点则通常不需要外部上拉,由收发器内部集成。通信电源(VBB)的供电范围需符合收发器规格(如5.5V至30V)
  • 保护电路:汽车环境复杂,必须在总线接口处添加静电保护器件(如PESD1LIN系列TVS二极管),以通过ESD、浪涌等测试,确保系统的鲁棒性。同时,布局时应尽量使保护器件靠近总线连接器

    2. 软件开发注意事项

    • 波特率容差与同步:LIN总线速率较低(通常最高20kbps),但所有从节点必须能通过同步场(0x55)自动校准自身的波特率,以匹配主节点的时钟。在软件实现时,尤其是在从节点,需要精确测量同步场中5个下降沿的时间间隔来计算波特率。

    • 间隔场的生成与检测:这是LIN通信的基础。如果使用普通UART,生成间隔场的常用技巧是临时拉低波特率发送0x00(如将19200bps临时改为9600bps发送),以产生超过13个位时间的低电平。检测间隔场则需要借助外部中断和定时器,精确测量低电平的持续时间是否大于11个位时
    • 错误处理:软件需能处理常见的LIN通信错误,包括位错误、校验和错误、标识符奇偶错误、从机无响应等。尤其要注意,从节点通常只能检测前三种错误,而总线活动和帧格式错误主要依赖主节点来判断网络管理:唤醒与休眠:为了省电,LIN总线支持休眠模式。主节点可通过发送休眠命令(诊断帧0x3C)让总线进入休眠。任何节点也都能通过发送唤醒信号(250us~5ms的显性电平)来唤醒总线。软件需遵循重试机制(最多发三次唤醒,失败后需等待1.5s)。
    • 网络管理:唤醒与休眠:为了省电,LIN总线支持休眠模式。主节点可通过发送休眠命令(诊断帧0x3C)让总线进入休眠。任何节点也都能通过发送唤醒信号(250us~5ms的显性电平)来唤醒总线。软件需遵循重试机制(最多发三次唤醒,失败后需等待1.5s)。
posted @ 2026-03-03 15:57  WCH_CH32  阅读(47)  评论(0)    收藏  举报