结论先说:正常工作不受影响,LIN 也不需要修改任何寄存器位
STC8H1K08 的串口没有独立的“LIN 模式”开关。手册「串口通信,可省电模式唤醒,可实现 LIN」章节里的“串口转 LIN 总线”例程,功能说明原文是:
通过UART接口连接LIN收发器实现LIN总线信号收发测试例程。
默认传输速率:9600波特率,发送LIN数据前切换波特率,发送13个显性间隔信号。
也就是说,所谓“实现 LIN”就是用普通串口 + 外接 LIN 收发器(TJA1020/1),再加上软件把 LIN 报文格式组出来。芯片内部没有额外的 LIN 控制位需要配置,因此普通串口通信完全没有额外负担,原来怎么发就怎么发。
相比普通串口,增加的只有两步(都是软件操作)
看例程的核心函数即可,比普通串口发送多了两件事:
第一步:发 Break(显性间隔信号)——要临时改一次波特率
void Lin_SendBreak(void)
{
SetTimer2Baudraye(Baudrate_Break);
UART2_TxByte(0);
SetTimer2Baudraye(Baudrate2);
}
这里的关键点,也是手册例程里唯一“非普通串口”的地方:
- 先用
Baudrate_Break 对应的重装值把波特率改掉(例程宏定义原文:#define Baudrate_Break (65536UL - (MAIN_Fosc / 4) / 6647UL) //发送显性间隔信号波特率);
- 发送
0x00,因为波特率低,就形成足够长的低电平,即 13 个显性位;
- 再把波特率改回正常值
Baudrate2。
第二步:按 LIN 帧格式依次发出 SYNC、ID、数据场、校验和
void Lin_Send(u8 *puts)
{
u8 i;
Lin_SendBreak(); //Break
UART2_TxByte(0x55); //SYNC
UART2_TxByte(Lin_CheckPID(LIN_ID)); //LIN ID
for(i=0;i<8;i++)
{
UART2_TxByte(puts[i]);
}
UART2_TxByte(LINCalcChecksum(puts));
}
即:Break → 0x55(SYNC)→ 受保护 ID(Lin_CheckPID)→ 8 字节数据 → 校验和(LINCalcChecksum)。这些都是普通字节发送,一次接一次调 UART2_TxByte(),没有任何特殊寄存器操作。
注意事项
- 波特率必须用可重装的定时器做发生器。例程用的是 Timer2,因为要能随时重新计算重装值来切换波特率:
void SetTimer2Baudraye(u16 dat)
{
AUXR &= ~(1<<4); //Timer stop
AUXR &= ~(1<<3); //Timer2 set As Timer
AUXR |= (1<<2); //Timer2 set as 1T mode
TH2 = dat / 256;
TL2 = dat % 256;
IE2 &= ~(1<<2); //禁止中断
AUXR |= (1<<4); //Timer run enable
}
如果你用串口 1 的 Timer1 做波特率发生器也行,但必须是自动重装方式,这样改波特率才方便。
- 串口数量够用。按「串口通信,可省电模式唤醒,可实现 LIN」章节开头的型号支持表,STC8H1K08 系列串口1、串口2 都标 ●,即两个串口。所以可以像例程那样:UART1 接电脑调试,UART2 接 LIN 收发器上总线,互不干扰。
- 13 个显性位的时长要按你的实际波特率核算。例程给的是 9600 波特率下用 6647 波特率发一个 0x00,简化理解就是“正常位的若干倍时长”。真正的 LIN 规范要求 Break 至少 13 个位时间,你可以按自己的波特率和系统时钟重算
Baudrate_Break,不必照抄 6647。这一点手册例程只给了数值,未展开推导。
- 裸芯片引脚不能直接上 LIN 总线。LIN 是 12V 单线总线,必须经 LIN 收发器(如 TJA1020/1),手册例程也是这个接法。
总结
| 项目 |
普通串口 |
加 LIN |
| 硬件 |
UART + 电平转换 |
UART +LIN 收发器 |
| 寄存器 |
常规 SCON 等 |
无新增 LIN 专用位 |
| 软件 |
收发字节 |
多发一次 Break(临时改波特率)+ 按帧格式组包 |
| 影响正常通信 |
— |
不影响,可并存 |
所以你的判断是对的:“正常通信不麻烦”,加 LIN 只是在发送端多一个 Break 和帧格式组包,接收端解析 ID 和校验即可。
如果你需要,请告诉我系统时钟、目标波特率、以及你是做主节点还是要收从节点的帧,我可以把 Baudrate_Break 重装值 + Lin_CheckPID(含奇偶校验位生成)+ 标准型/增强型校验和算法写成一份 STC8H1K08 单文件可编译的完整例程给你。
📚 参考章节:串口通信,可省电模式唤醒,可实现 LIN(STC8H 手册);串口通信,可省电模式唤醒,可实现 LIN(STC8G 手册,例程为 STC8G/STC8H 通用)
🔍 搜索 "STC8H1K08 UART实现LIN 增加了哪一步"
📌 相关论坛讨论
- IIC移植后读不到数据
- 关于8H1K08的uart转发提问
- 远程脱机下载
⏱️ 查找用时 8.5s | 总回答用时 16.7s