英飞凌TC38x MCAL配置重点及应用讲解 – LIN

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

1. LIN的介绍2. MCAL配置2.1 波特率2.2 LinInterByteSpace(字节间隔)
3. 中断配置4.代码5. 总结


1. LIN的介绍

LIN通信协议目前最新的是V2.2版本,每个版本的差异点可以参考下面链接:
https://www.cnblogs.com/hkj8808/p/16337870.html
LIN 的特点
LIN 具有以下特点:
(1) 网络由一个主机节点和多个从机节点构成。
(2) 使用 LIN 可以大幅度的削减成本,表现在以下方面:
● 开放型规范:规范可以免费从官方网站获得。
● 硬件成本削减:基于普通 UART/SCI 接口的低成本硬件实现,无需单独的硬件模块支持;从机节点无需
高精度时钟就可以完成自同步;总线为一根单线电缆。
● 装配成本削减:LIN 采用了工作流(Work Flow)和现成节点(Off-the-shelf Node)的概念,将网络装配标准
化,并可通过 LIN 传输层进行再配置。
● 缩短软件开发周期:LIN 协议将 API(Application Programming Interface,应用编程接口)标准化。
(3) 信号传输具有确定性,传播时间可以提前计算出。
(4) LIN 具有可预测的 EMC(ElectroMagnetic Compatibility,电磁兼容性)性能。为了限制
EMI(ElectroMagnetic Interference,电磁干扰)强度,LIN 协议规定最大位速率为 20kbps。
(5) LIN 提供信号处理、配置、识别和诊断四项功能。

更多请参考:https://blog.csdn.net/allen_nmk/article/details/107504949

2. MCAL配置

LIN的MCAL配置比较简单,如下:

2.1 波特率

这里单位是bps(bit per second), 根据需求配置,通常都是19.2kbit/s。所以通信速率小于CAN2.0的常用配置500K,是一个低成本,时效要求不高的通信协议。

2.2 LinInterByteSpace(字节间隔)

也叫做字节之间的Idle时间,单位是bit。
图片[1] - 英飞凌TC38x MCAL配置重点及应用讲解 – LIN - 鹿快为什么需要字节间间隔?
我理解主要是给Slave留出每个字节处理时间,slave的接收性能可能不尽相同,典型值为0-2.

3. 中断配置

在TC38x中,ASCLIN模块包含LIN驱动,提供了Rx, Tx和Err三个中断,在ASCLIN中默认都是打开的,只需要在IR模块中配置优先级和TOS即可。比如配置优先级:

中断回调函数MCAL也有提供。自己可以在源代码上补充自己的处理函数。例如我在Rx接收中断中加入Buffer的处理函数,将接收的报文拷贝到指定变量中。


void CddLin_RxIndication(uint8 *RxBuffer)
{
    MemCopy(g_CddLin_ReceivedBuffer, RxBuffer, 8);
    g_CddLin_FrameReceived = 1;//告诉其他处理函数,新的报文已到
}

4.代码

以诊断报文为例,主节点发送请求报文,然后从节点发送响应报文,前提是主节点发送响应报文的Header,从节点补充数据。
因为LIN是半双工通信,不能同时进行收和发。时序很关键,一般是主节点发送请求报文后,间隔一定时间(给从节点留出处理时间)后,主节点开始发送响应报文的帧头,按一定周期进行轮询,直到收到报文。经验是主节点发送的请求报文和响应报文头的发送函数放在同一个函数中进行异步地依次发送。因为MCAL中没做缓存处理,如果正在发送报文,突然来了一个发送请求,会立马中断前一个发送过程。


static Lin_PduType g_Lin_PduInfoReq = {
    .Cs = LIN_CLASSIC_CS,
    .Drc = LIN_MASTER_RESPONSE,
    .Dl = 8,
    .Pid = 0x3C,
    .SduPtr = &g_Lin_buffer};
static Lin_PduType g_Lin_PduInfoSlaveRsp = {
    .Cs = LIN_CLASSIC_CS,
    .Drc = LIN_SLAVE_RESPONSE,
    .Dl = 8,
    .Pid = 0x7D,
    .SduPtr = &g_Lin_buffer};
//同一Task时间内只能发送,或者只能接收。不然会出现冲突的情况    
  if(发送请求)
  {
  发送请求=0;
  Lin_17_AscLin_SendFrame(LinChannel_LinChannel_0, &g_Lin_PduInfoReq);
  }
  else if(接收请求)
  {
   Lin_17_AscLin_SendFrame(LinChannel_LinChannel_0, &g_Lin_PduInfoSlaveRsp);
  }

5. 总结

欢迎评论和讨论。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
南若小娱姐的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容