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)。
-
浙公网安备 33010602011771号