找回密码
 立即注册
查看: 785|回复: 8

LIN通讯疑问

[复制链接]

1

主题

8

回帖

31

积分

新手上路

积分
31
发表于 2024-3-8 20:52:54 | 显示全部楼层 |阅读模式
用了TJA1020 总线芯片,MCU用的是STC32G8K64,
用串口2做LIN总线通讯,SLP 接MCU1.4,   RXD接MCU1.0/RXD2脚,  TXD接MCU1.1/TXD2脚。

问题1:void Uart2_Init(void)        //19200bps@24MHz
{
        S2CON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x04;                //定时器时钟1T模式
        T2L = 0x70;                        //设置定时初始值
        T2H = 0xFF;                        //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
        IE2 |= 0x01;                //使能串口2中断
}这是用ISP生产的串口初始化的代码,在网上找的代码有些是设置        USART2BRH=0xFE;
        USART2BRL=0xC7;,请问在这里,到底是应该设置T2H,T2L 还是应该设置USART2BRH,USART2BRL?

问题2:void Uart2_Isr(void) interrupt 8
{
        if(USART2CR5&0x80)   //BRKDET
        {   
                USART2CR5&= ~0x80;
                DRL_EN=ON;
        }
        if (S2CON & 0x02)        //????2????
        {
                S2CON &= ~0x02;        //????2???????
        }
        if (S2CON & 0x01)        //????2????
        {
                S2CON &= ~0x01;        //????2???????
        }
}  串口2中断函数,检测到LIN 总线上,从模式,间隔场应该能触发中断响应,但是没有触发,示波器能看到间隔场,请问是可能是什么原因
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-3-8 21:14:17 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-3-8 21:09:23 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

1

主题

8

回帖

31

积分

新手上路

积分
31
发表于 2024-3-8 21:23:52 | 显示全部楼层
另外串口2的寄存器还改一下以下配置:
        S2CFG = 0x01;               
        USART2CR1=0x80;
        USART2CR5=0x20;
总中断也开了:EA=1;
回复 支持 反对

使用道具 举报 送花

1

主题

8

回帖

31

积分

新手上路

积分
31
发表于 2024-3-8 21:30:58 | 显示全部楼层
if (S2CON & 0x01)        //????2????
        {
                S2CON &= ~0x01;        //????2???????
        }  S2RI这个中断是可以进入的
回复 支持 反对

使用道具 举报 送花

1

主题

8

回帖

31

积分

新手上路

积分
31
发表于 2024-3-8 21:50:42 | 显示全部楼层
好像USART2CR5寄存器的,BRKDET位就一直没有动过,感觉没有检测到间隔场,但是LIN的数据是可以收到的,是哪个地方还要设置吗?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-3-9 11:04:22 来自手机 | 显示全部楼层
yunweiping 发表于 2024-3-8 21:50
好像USART2CR5寄存器的,BRKDET位就一直没有动过,感觉没有检测到间隔场,但是LIN的数据是可以收到的,是哪 ...

建议先用官方提供的例程烧录到芯片里试试,功能调通后再进行修改或者移植。
回复 支持 反对

使用道具 举报 送花

1

主题

8

回帖

31

积分

新手上路

积分
31
发表于 2024-3-10 20:41:46 | 显示全部楼层
void UART2_int (void) interrupt 8
{
    if(S2RI)
    {
        S2RI = 0;    //Clear Rx flag

        StaCR = USART2CR5;
        if(StaCR & 0x02)     //if LIN header is detected
        {
            B_RX2_Flag = 1;
        }

        if(StaCR & 0xc0)     //if LIN break is detected / LIN header error is detected
        {
            RX2_Cnt = 0;
        }

        RX2_Buffer[RX2_Cnt++] = S2BUF;
        if(RX2_Cnt >= UART2_BUF_LENGTH)   RX2_Cnt = 0;
        RX2_TimeOut = 20;

        USART2CR5 &= ~0xcb;    //Clear flag
    }

    if(S2TI)
    {
        S2TI = 0;    //Clear Tx flag
        B_TX2_Busy = 0;
    }
}例程中这段代码,    if(S2RI)这个接收的标志位是可以检测到的,if(StaCR & 0xc0)     //if LIN break is detected / LIN header error is detected这个标志位检测不到
   
截图202403102038335158.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-3-11 09:48:26 | 显示全部楼层
yunwe*** 发表于 2024-3-10 20:41
void UART2_int (void) interrupt 8
{
    if(S2RI)

我刚测试过,在判断语句里面加个IO口翻转指令,烧录到芯片里,收到正常LIN总线数据时,对应的IO口就会产生翻转。说明BRKDET有检测到的。
  1.         if(StaCR & 0xc0)     //if LIN break is detected / LIN header error is detected
  2.         {
  3.             P20 = !P20;
  4.             RX2_Cnt = 0;
  5.         }
复制代码
回复 支持 1 反对 0

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:24 , Processed in 0.142932 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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