MC9S12G系列mcu ,spi波特率特性研究

来源:互联网 发布:淘宝店铺起名大全家居 编辑:程序博客网 时间:2024/05/16 05:11

出现问题 :

1. 9s12G系列控制板采用MC33662外部LIN芯片,使用高速模式后,在115200波特率下无法与labview上位机进行正常通讯,但是MC9S12VR系列单片机采用高速通讯模式后(使用内部LIN芯片),115200 波特率下能够与上位机通讯。

2. 上位机发送通讯报文,停止位按照软件设置发送,但是下位机通讯报文停止位没有根据寄存器设置一致,而且与波特率有关,是否有问题?

 

查找过程:

查阅芯片手册和相关文档,硬件结构不一样,外部LIN芯片高速模式速度上限为100Kbps,内部LIN高速模式下上限为250Kbps

 

测量115200波特率下 MC9S12G产品样件 通讯波形,可以发现:

上位机(串口助手 和 逻辑分析仪)识别为 82 E2 D2 A0,实际应为 02 C2 92 50

上位机(串口助手)设置的停止位为2,图①-2,下位机(MC9S12G产品样件)停止位为2.94 bit,图①-3,然而根据datasheet,停止位只能设置成1bit无法设置成其它,所以此现象需要进一步分析是否为MCU硬件表现。

 

图①-1 逻辑分析发送接收波形


  

图①-2 逻辑分析仪发送波形 


 

图①-3 逻辑分析仪接收波形


 

图①-4 原始发送接收波形

 

 

图①-5 原始上位机发送波形

 

  

图①-6 原始下位机反馈报文波形

 

测量115200波特率下MC9S12VR 样件 通讯波形,可以发现:

能够与上位机进行正常通讯,解析出的数据没有问题;

上位机停止位正常为2bit,下位机停止位为4bit(软件设置为1bit);

 

②-1 逻辑分析仪整体通讯波形


 

②-2 逻辑分析仪下位机反馈波形图

 

 

②-3 整体发送原始波形


 

②-4 原始上位机发送波形

 

测量19200波特率下MC9S12VR 样件通讯波形,可以发现:

上位机发送报文停止位为2bit,下位机反馈报文停止位也为2bit,然而下位机程序里相关SCI设置寄存器没有改变,程序设置仍为1bit的停止位;

  

③-1 原始RJ通讯波形


  

③-2 逻辑分析仪整体波形


 

③-3 逻辑分析下位机反馈报文波形

 

测量19200波特率下MC9S12G样件 通讯波形,可以发现:

现象与19200波特率下MC9S12VR表现一致

 

④-1 原始波形发送接收报文波形


 

④-2 逻辑分析仪波形


 

④-3 逻辑分析仪上位机发送信号波形


 

④-4 逻辑分析仪下位机反馈报文


结论分析:

115200波特率下,两种芯片样件反馈报文对比,如下图,黄色为VR芯片反馈报文波形,为正确的,红色为G芯片反馈报文波形,从比较结果来看,并不是波形不良造成了解析错误,而是发送出来的波形就不正确。

 

115200波特率下 MC9S12VR(黄)MC9212G(红)反馈报文(02 C2 92 50)波形比较图

 

继续分析,需要找到是MCU的问题还是LIN芯片的问题,测量下图所示的TX 脚和 LIN

 

MC9S12G 硬件原理图截取

 

测得波形如下图所示,根据波形分析,LIN芯片完全按照TX脚信号进行处理,没有问题,MCU发的反馈报文波形就错了,致此已经定位到MCU发送波形错误,下一步继续分析是软件bug还是MCU硬件不支持。

 

绿线为LIN,黄线为TX


 

LIN&TX 放大比对

  后续经同事追查后发现,在设置为115200 波特率下,G芯片板子向外发送的LIN信号与VR芯片向外发送的波形近似但相位有差别,所以反向计算,算得发出的波形波特率为127551,与设定波特率115200 误差差为10.72% ,导致了G芯片发出波形上位机解析错误的情况,问题分析到现在可以发现,G系列芯片对于通讯波特率容差要比PC上位机大,下图为G芯片通讯信号单bit时间测量。


基本定位为波特率设置出现问题,查找代码相关部分发现,通讯初始化波特率部分代码计算产生了较大误差,G系列初始化代码如下:

其中baudRate 为函数局部变量,通过外层形参传入,SCI_BUS_CLOCK 为定义的宏变量,值为 20 000 000 ,对应总线频率20Mhz,SCI_SBR_MASK掩码值为0x1F。

        setbaud = (uint16)(SCI_BUS_CLOCK/16/baudRate);/* SCIBDH, SCIBDL,SCI_CR1 can only be read and write when SCI0SR2_AMAP =0 */        SCI_Clr_8U_ByMask(SCI_SR2,SCISR2_AMAP_MASK);        SCI_BDH = 0x00;       /* clear IREN and TNP */        /* Set baud rate */        SCI_BDH = ((uint8)(setbaud>>8))&(SCI_SBR_MASK);        SCI_BDL = (uint8)(setbaud);

当baudRate 设定为115200 时,理论输出值应为 SCI_BDH = 0,SCI_BDL = 11.85 ,但程序中涉及寄存器赋值,强制转换为整形,最终输出结果为 

SCI_BDL = 10; 
SCI_BDH = 0;

10与11.85有 15.61% 的误差率。

VR系列波特率初始化代码如下:

        setbaud = (uint16)((SCI_BUS_CLOCK/baudRate)+1);        SCI_SR2 |= SCISR2_AMAP_MASK;        SCI_ACR2 &= 0x1F;      /* clear IREN and TNP */        /* SCIBDH, SCIBDL,SCI_CR1 can only be read and write when SCI0SR2_AMAP =0 */        SCI_Clr_8U_ByMask(SCI_SR2,SCISR2_AMAP_MASK);        /* Set baud rate */        SCI_BD = (uint16)(setbaud);

当baudRate 设定为115200 时,理论输出值SCI_BD = 173.61,程序中涉及寄存器赋值,强制转换为整形,最终输出结果为 

SCI_BD = 174

与173.61 有 0.22% 的误差率。

根据理论计算可以发现由于代码产生的计算误差导致实际设定通讯波特率偏大,经过实验验证,将G芯片 SCI_BDL值改写成11后,可以进行正常通讯,所以经验证发现此设置为root cause

下图分别为数据手册上G系列和VR系列芯片波特率计算方式

G芯片波特率计算方式:

VR芯片波特率计算方式:



0 0
原创粉丝点击