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 总线上,从模式,间隔场应该能触发中断响应,但是没有触发,示波器能看到间隔场,请问是可能是什么原因
www.stcai.com/hxgnsyb
www.stcai.com/syx
另外串口2的寄存器还改一下以下配置:
S2CFG = 0x01;
USART2CR1=0x80;
USART2CR5=0x20;
总中断也开了:EA=1; if (S2CON & 0x01) //????2????
{
S2CON &= ~0x01; //????2???????
}S2RI这个中断是可以进入的 好像USART2CR5寄存器的,BRKDET位就一直没有动过,感觉没有检测到间隔场,但是LIN的数据是可以收到的,是哪个地方还要设置吗? yunweiping 发表于 2024-3-8 21:50
好像USART2CR5寄存器的,BRKDET位就一直没有动过,感觉没有检测到间隔场,但是LIN的数据是可以收到的,是哪 ...
建议先用官方提供的例程烧录到芯片里试试,功能调通后再进行修改或者移植。 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这个标志位检测不到
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]