笔记本的自嘲 发表于 2020-2-19 14:37:36

KEA128/64平台LIN总线的问题

我的实验环境是主机为KEA128的demo板子;从机的MCU是KEA64,LIN收发器是TJA1021。

再先说下现象(不考虑校验场的数据结果):
现象1.主机数据场第0字节数据是0x00的时候,从机接收的数据场数据丢失0x00,其它数据正常;
现象2.主机数据场第0字节数据不是0x00且后面也没有0x00的时候,从机接收的数据从数据场开始全部异常;
现象3.主机数据场第0字节数据不是0x00且后面第i字节的数据是0x00的时候,从机接收的数据从第0字节到第i字节全都异常,从第i+1字节开始的数据全都正常。

以下是各现象的截图:


主机发送的数据格式第0字节是LIN的CMD,第1字节是数据场长度,其它是数据场数据;
从机接收的数据格式依次是:同步场、PID、8字节数据场、校验场。

由于我手上现在没有示波器,LIN的波形需要在复工后才能测量了,想问下大家有哪些可能会导致我这个现象呢?

然后附上LIN的初始化代码
/**
* @brief   初始化主机LIN总线,波特率设置为9600
* @paramNone
* @retval   None
*/
void lin_init(void)
{
        UART_ConfigType Config = {{0}};

        Config.u32SysClkHz = SystemCoreClock;
        Config.u32Baudrate = 9600;
        Config.bSbns = 0;
        Config.sctrl2settings.bits.bRe = 1;
        Config.sctrl2settings.bits.bTe = 1;
        Config.sctrl2settings.bits.bRie = 1;
        Config.sctrl3settings.bits.bBrk13 = 1; //间隔信号长度为13位

        CONFIG_PIN_AS_GPIO(PTB, PTB2, OUTPUT); //EN引脚给高电平
        GPIO_SetBits(PTB, PTB2);

        CONFIG_PIN_AS_GPIO(PTB, PTB3, OUTPUT); //WAKE引脚给低电平
        GPIO_ResetBits(PTB, PTB3);

        SIM_PINSEL0 &= ~SIM_PINSEL_UART0PS_MASK; //强制选择UART0的通信脚为PTB0/1

        UART_Init(LIN_UART_NUM, &Config);

        UART_SetCallback(LIN_UART_NUM, lin_rcv);
}
/**
* @brief   初始化从机LIN总线,波特率设置为9600
* @paramNone
* @retval   None
*/
void lin_init(void)
{
        UART_ConfigType Config = {{0}};

        Config.u32SysClkHz = SystemCoreClock;
        Config.u32Baudrate = 9600;
        Config.bSbns = 0;
        Config.sctrl2settings.bits.bRe = 1;
        Config.sctrl2settings.bits.bTe = 1;
        Config.sctrl2settings.bits.bRie = 1;
        Config.sctrl3settings.bits.bBrk13 = 1; //间隔信号发送长度为13位

        CONFIG_PIN_AS_GPIO(PTD, PTD5, OUTPUT); //不让TJA1021进入休眠模式(下降沿有效)
        GPIO_SetBits(PTD, PTD5);

        UART_Init(LIN_UART_NUM, &Config);

        UART_SetCallback(LIN_UART_NUM, lin_rcv);
}

adlkkang 发表于 2020-2-19 15:09:17

KEA系列单片机调试LIN确实各种问题,要踩一些坑。方法:一边调试一边查看UART外设寄存器的值

笔记本的自嘲 发表于 2020-2-19 15:22:46

adlkkang 发表于 2020-2-19 15:09
KEA系列单片机调试LIN确实各种问题,要踩一些坑。方法:一边调试一边查看UART外设寄存器的值 ...

太头疼了,数据场的这种变化没有示波器真的不知道啥情况……您所说的观察UART寄存器的值,在数据场里面能观察到寄存器UARTx_S1的FE(Framing Error Flag)的值是1,我感觉这个应该能指导我的数据场数据在传输的时候是有问题的

zxzx8059 发表于 2020-2-24 14:46:44

時鐘FEI、FEE?

笔记本的自嘲 发表于 2020-2-26 14:19:43

结下帖子,问题已经找到。KEA64的芯片手册描述有误,出厂的IRC值应该为31.25kHz,不是32kHz

zxzx8059 发表于 2020-2-27 11:37:56

笔记本的自嘲 发表于 2020-2-26 14:19
结下帖子,问题已经找到。KEA64的芯片手册描述有误,出厂的IRC值应该为31.25kHz,不是32kHz ...

你有試過新的芯片燒錄時不設定IRC那個ICS_C3的值
程序還能跑嗎?

我最近遇到1k有3%的MCU設一樣的值跑出來的頻率會比其他顆少0.5~1MHz

笔记本的自嘲 发表于 2020-2-28 16:14:14

zxzx8059 发表于 2020-2-27 11:37
你有試過新的芯片燒錄時不設定IRC那個ICS_C3的值
程序還能跑嗎?



我这边都不操作C3寄存器的,直接用16M主频跑。
官方对于C3的操作有一个专门的帖子,我发不了链接,我发一下帖子名字,你自己搜一下吧,见下面:
使用CodeWarrior10.5软件的PE工具trim芯片内部慢速时钟
我自己测试了一下,总线设置成20M后误差在3.75%,偏差太大了,还是用16M算了。
页: [1]
查看完整版本: KEA128/64平台LIN总线的问题