yunweiping 发表于 2024-3-8 20:52:54

LIN通讯疑问

用了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 总线上,从模式,间隔场应该能触发中断响应,但是没有触发,示波器能看到间隔场,请问是可能是什么原因

神农鼎 发表于 2024-3-8 21:14:17


www.stcai.com/hxgnsyb





神农鼎 发表于 2024-3-8 21:09:23



www.stcai.com/syx




yunweiping 发表于 2024-3-8 21:23:52

另外串口2的寄存器还改一下以下配置:
        S2CFG = 0x01;               
        USART2CR1=0x80;
        USART2CR5=0x20;
总中断也开了:EA=1;

yunweiping 发表于 2024-3-8 21:30:58

if (S2CON & 0x01)      //????2????
      {
                S2CON &= ~0x01;      //????2???????
      }S2RI这个中断是可以进入的

yunweiping 发表于 2024-3-8 21:50:42

好像USART2CR5寄存器的,BRKDET位就一直没有动过,感觉没有检测到间隔场,但是LIN的数据是可以收到的,是哪个地方还要设置吗?

乘风飞扬 发表于 2024-3-9 11:04:22

yunweiping 发表于 2024-3-8 21:50
好像USART2CR5寄存器的,BRKDET位就一直没有动过,感觉没有检测到间隔场,但是LIN的数据是可以收到的,是哪 ...

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

yunweiping 发表于 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 = 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这个标志位检测不到
   

乘风飞扬 发表于 2024-3-11 09:48:26

yunweiping 发表于 2024-3-10 20:41
void UART2_int (void) interrupt 8
{
    if(S2RI)


我刚测试过,在判断语句里面加个IO口翻转指令,烧录到芯片里,收到正常LIN总线数据时,对应的IO口就会产生翻转。说明BRKDET有检测到的。
      if(StaCR & 0xc0)   //if LIN break is detected / LIN header error is detected
      {
            P20 = !P20;
            RX2_Cnt = 0;
      }
页: [1]
查看完整版本: LIN通讯疑问