从事汽车MCU开发的小伙伴,对CAN/CAN FD、Ethernet、Lin这几种总线,应该比较熟悉,即使没具体开发过,也应该听过。如果想更深刻的理解这些总线,实践是最行之有效的方法。在之前的文章中,已经分享了《基于Tricore的CANFD入门工程》、《基于Tricore的UDP/TCP入门工程》、《基于Aurix的以太网实践:TCP Client实现坑点》,本文基于TC397_5V_TFT开发板+Tasking编译器,对英飞凌官网的Master Lin进行了二次开发,助力需要的学习Lin总线的小伙伴,文末有工程源码链接。
TC397_5V_TFT开发板的原理图,可以在英飞凌官网下载,具体下载地址如下:
https://www.infineon.com/dgdl/Infineon-ApplicationKitManual_TC3X7-UM-v02_00-EN.pdf?fileId=5546d462696dbf120169b454383c483d
这里,我们关注Lin收发器(TLE7259-3GE)需要配置的端口,如下图:
上图中,RxD需要使用P10.6,TxD需要使用P10.5,这两个Pin对应ASCLIN2模块。
对于外接的Lin Connector,GND可以接跳线2或者跳线5,LIN BUS对应跳线4,如下所示:
本文Lin通信采用了中断收/发处理模式,且开发板采用Master模式。Master负责发送Header,ID=0x26(主响应)/ID=0x33(从响应),通信速率为19200bps。
/* 主函数调用 */
void ASCLIN_LIN_Master_Send_Message(void)
{
uint8 id = MASTER_ID_0x26;
HandleID = MASTER_ID_0x26;
/* Send LIN header */
IfxAsclin_Lin_sendHeader(&g_linMaster, &id);
}
/* 接收中断例程 */
IFX_INTERRUPT(ISR_ASCLIN_Rx, 0, ASCLIN_MASTER_RX)
{
/* check Rx response end acknowledgement*/
if (IfxAsclin_getRxResponseEndFlagStatus(g_linMaster.asclin))
{
uint8 id = MASTER_ID_0x26;
IfxAsclin_Lin_clearFlagsStatus(g_linMaster.asclin);
HandleID = MASTER_ID_0x26;
IfxAsclin_Lin_sendHeader(&g_linMaster, &id);
}
}
/* 发送中断例程 */
IFX_INTERRUPT(ISR_ASCLIN_Tx, 0, ASCLIN_MASTER_TX)
{
/* check Tx header end acknowledgement */
if (IfxAsclin_getTxHeaderEndFlagStatus(g_linMaster.asclin)) /* THE flag*/
{
if (HandleID == MASTER_ID_0x26)
{
IfxAsclin_Lin_sendResponse(&g_linMaster, Tx_data, 8);
}
else if(HandleID == SLAVE_ID_0x33)
{
IfxAsclin_Lin_receiveResponse(&g_linMaster, Rx_data, 8);
/* Receive interrupt occurred */
if (IfxAsclin_getRxFifoFillLevelFlagStatus(g_linMaster.asclin))
{
uint8 id = MASTER_ID_0x26;
HandleID = MASTER_ID_0x26;
IfxAsclin_Lin_sendHeader(&g_linMaster, &id);
}
}
IfxAsclin_Lin_clearFlagsStatus(g_linMaster.asclin);
}
/* check Tx completed */
if (IfxAsclin_getTransmissionCompletedFlagStatus(g_linMaster.asclin))
{
uint8 id = SLAVE_ID_0x33;
IfxAsclin_Lin_clearFlagsStatus(g_linMaster.asclin);
HandleID = SLAVE_ID_0x33;
IfxAsclin_Lin_sendHeader(&g_linMaster, &id);
}
}
Lin上位机界面如下(淘宝采购),设置上位机为"从机",通信速率"19200bps",如下所示:
在“从机写配置”界面配置一个响应ID = 0x33以及对应的数据,采用增强校验,如下所示:
启动程序,Lin数据流如下所示:
(一)Lin报文波形
17987-3规范约束,一帧Lin报文构成如下:
关于Lin帧结构,更多信息可以参考前文《Lin基础:从Lin Frame开始》。本文使用示波器抓取Lin波形如下所示:
如上图,测量的Lin总线电压约等于电源电压(12V),略小于12V的原因:串联防反二极管(diodes)造成的部分压降。通信速率19200bps(1bit Time = 1/19200≈ 52.083us ),传输8byte字节,一帧Lin报文用时6~7ms。
波形的局部放大如下所示:
波形的进一步放大如下所示:
如上图,帧间隔段(Break Field)长度13 Bit显性位(0)+ 1bit隐性位(1),之后是Sync Byte Field(0x55)+ 字节空间 + PID(0x73)。关于Lin帧结构,更多信息可以参考前文《Lin基础:从Lin Frame开始》。
(二)Master/Slave对应的Transceiver电阻不同
前文《Lin总线基础:为什么Master节点需要外接上拉电阻》讨论过,Master节点外接1kΩ原因,这里再次提醒,Master节点需要通过并联一个阻值更小的电阻,增大Lin Bus的驱动能力,进而提高Lin报文的质量。17987-4中,对应Master/Slave与Transceiver形成的供电回路如下所示:
全部0条评论
快来发表一下你的评论吧 !