找回密码
 立即注册
查看: 80|回复: 2

车规 STC8H1K17-24A,STC8H1K08, UART实现LIN, 增加了哪一步,正常通信不麻烦

[复制链接]
已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25428
发表于 3 天前 | 显示全部楼层 |阅读模式
车规 STC8H1K17-24A,STC8H1K08,
UART 实现 LIN, 增加了哪一步,
正常通信不麻烦
===车规证书本月回来,数据最后整理中


截图202611040900162658.jpg


回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25428
 楼主| 发表于 3 天前 | 显示全部楼层

结论先说:正常工作不受影响,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(),没有任何特殊寄存器操作。

注意事项

  1. 波特率必须用可重装的定时器做发生器。例程用的是 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 做波特率发生器也行,但必须是自动重装方式,这样改波特率才方便。

  1. 串口数量够用。按「串口通信,可省电模式唤醒,可实现 LIN」章节开头的型号支持表,STC8H1K08 系列串口1、串口2 都标 ●,即两个串口。所以可以像例程那样:UART1 接电脑调试,UART2 接 LIN 收发器上总线,互不干扰。
  2. 13 个显性位的时长要按你的实际波特率核算。例程给的是 9600 波特率下用 6647 波特率发一个 0x00,简化理解就是“正常位的若干倍时长”。真正的 LIN 规范要求 Break 至少 13 个位时间,你可以按自己的波特率和系统时钟重算 Baudrate_Break,不必照抄 6647。这一点手册例程只给了数值,未展开推导。
  3. 裸芯片引脚不能直接上 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 增加了哪一步"

📌 相关论坛讨论

  1. IIC移植后读不到数据
  2. 关于8H1K08的uart转发提问
  3. 远程脱机下载

⏱️ 查找用时 8.5s | 总回答用时 16.7s

回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25428
 楼主| 发表于 3 天前 | 显示全部楼层
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 10:39 , Processed in 0.066910 second(s), 51 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表