找回密码
 立即注册
查看: 168|回复: 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 总线上,从模式,间隔场应该能触发中断响应,但是没有触发,示波器能看到间隔场,请问是可能是什么原因
回复 送花

使用道具 举报

该用户从未签到

550

主题

9310

回帖

1万

积分

管理员

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

使用道具 举报

该用户从未签到

550

主题

9310

回帖

1万

积分

管理员

积分
13870
发表于 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的数据是可以收到的,是哪个地方还要设置吗?
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 10:55
  • 签到天数: 131 天

    [LV.7]常住居民III

    26

    主题

    1297

    回帖

    4043

    积分

    论坛元老

    积分
    4043
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:55
  • 签到天数: 131 天

    [LV.7]常住居民III

    26

    主题

    1297

    回帖

    4043

    积分

    论坛元老

    积分
    4043
    发表于 2024-3-11 09:48:26 | 显示全部楼层
    yunweiping 发表于 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, 2024-5-4 14:45 , Processed in 0.070438 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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