TC397 LIN Master 用例
文章目录
- LIN简介
- 单片机与LIN
- TC397 LIN
- USB-LIN分析仪
- TC397 KIT LIN
- 工程示例
- 参考
LIN简介
LIN (Local Interconnect Network), 一种广播串行网络,最多包括 16 个节点(一个主节点,通常最多 15 个从节点)。所有消息都由主站发起,最多有一个从站回复给定的消息标识符。主节点也可以通过回复自己的消息来充当从节点。因为所有的通信都是由主机发起的,所以没有必要进行碰撞检测。
除了供电的两根电源线, LIN传输数据是单线, 主节点内配置 1kΩ电阻端接 12V ,从节点内配置 30kΩ电阻端接 12V 。
协议的主要特性如下:
- 单主机,最多 16 个从机(即无总线仲裁)。这是 LIN 联盟为实现确定性时间响应而推荐的值。 从节点位置检测 (SNPD) 允许在上电后分配节点地址
- 单线通信高达 19.2 kbit/s @ 40 米总线长度。在LIN规范2.2中, 速度高达20 kbit/s。
- 保证延迟时间。
- 可变长度的数据帧(2、4 和 8 字节)。
- 配置灵活性。 带时间同步的多播接收,无需晶体或陶瓷谐振器。
- 数据校验和错误检测。
- 检测缺陷节点。
- 基于标准 UART/SCI 硬件的低成本实现。 分层网络推动者。
- 工作电压为 12 V
- 主任务传输由中断信号后跟同步和标识符字段组成的报头。从设备以一个数据帧进行响应,该数据帧由 2、4 和 8 个数据字节加上 3 个控制信息字节组成。
消息(Message)包含以下字段:
- 同步中断, 13bit
- 同步字节, 0x55
- 标识符字节, id, identifier
- 数据字节, 0~8 Bytes
- 校验和字节, V1.3(Classic, 标准校验, 仅校验数据字节), V2.0+(Enhanced, 增强校验, id+data)
六种帧类型(Frame Type):
- Unconditional frame, 无条件帧(普通帧), 标识符在 0 到 59(0x00 到 0x3b)的范围内. 所有订阅者都应接收该帧并将其提供给应用程序(假设未检测到错误)
- Event-triggered frame, 事件触发帧, 携带的普通帧的第一个数据字节应等于分配给事件触发帧的受保护标识符, 仅当其数据值发生变化时,从设备以相关联的普通帧进行回复。这样的目的是提高 LIN 集群的响应能力,无需为很少发生事件的多个从节点的轮询分配过多的总线带宽。
- Sporadic frame, 零星帧, 当主任务知道帧中携带的信号已被更新时,零星帧的头应仅在其相关的帧时隙中发送
- Diagnostic frame, 诊断帧, 始终包含八个数据字节。标识符是 60 (0x3C),称为主请求帧,或 61(0x3D),称为从响应帧。在生成诊断帧的头之前,主任务询问其诊断模块是否应发送或总线是否应静默。从属任务根据其诊断模块发布和订阅响应。
- User-defined frame, 用户自定义帧, 可携带任何信息, 标识符是 62 (0x3E)。处理分配给该帧的帧时隙时,始终传输用户定义帧的标头
- Reserved frame, 保留帧, 标识符63 (0x3F), LIN 2.0不用
LIN通常用于对车辆性能或安全不关键的子系统中,下面给出了一些示例
通常CAN在DB9中为7H / 2L, LIN在DB9中常见为3GND / 7LIN / 9VBAT(不排除其它接法)
单片机与LIN
如下:
-
STM32的USART支持LIN, 代码可以参考软硬件开源的 uCAN-LIN/LinUSBConverter: LIN(Local interconnect network) to USB converter with LIN master support compatible with SLCAN. (github.com)
-
MPC5748G有18路可以当作UART或者LIN的LINFlexD, 示例工程直接撸的寄存器, 可以和库工程掺着用
-
S32K148的LPUART, FlexIO支持LIN
-
甚至可以用51或者Arduino模拟IO来收发LIN, 如 zapta/linbus: An Arduino based LINBUS stack and signal interceptor/injector. (github.com)
-
外部的收发器兼容LIN2.x, IO能3.3V就问题不大
-
下面来看TC397的
TC397 LIN
参考:
- AURIX Training Asynchronous Synchronous Interface (infineon.com)
- LIN master communication via ASCLIN module (infineon.com)
TC397有12路 ASCLIN (Asynchronous Synchronous Interface), 这是个3合1的模块: ASC(UART), LIN, SPI.
作为LIN使用时:
-
支持所有四个基本的LIN事务,包括标题/响应传输和接收,作为主设备或从设备
-
支持标准Lin V1.3 / 2.0 / 2.1 / 2.2和碰撞检测的J2602
-
自动波特率检测, 可选的碰撞检测, 总线空闲检测, wake-up能力, Stuck at zero/one monitoring for safety
USB-LIN分析仪
直接某宝随便买了个一百块左右的USB-LIN调试器, 上位机做的很人性化, 除了时间戳可能不是太准, 没太大毛病, 收发自如, 用着较爽
USB转LIN调试器 LIN总线 转换器 STM32-淘宝网 (taobao.com)
TC397 KIT LIN
KIT_A2G_TC397_3V3_TFT - Infineon Technologies 如图
原理图上是
TLE7259-3_DS_rev10 (infineon.com) 的框图
BUS引脚外挂了1K上拉电阻, 默认是Lin Master, 不挂的话是Slave.
板子要供12V电源, 和USB-LIN分析仪的连接仅需LIN, GND两根线
下面的示例也只演示TC397 ASCLIN2作为Master时的情形, USB-LIN分析仪作为Slave.
工程示例
对于TC397官方 AURIX™ Expert Training - Infineon Technologies 开放了一个 LIN master communication via ASCLIN module (infineon.com) 的示例工程, 里面用了一个IO加示波器来测的, 并没用上面原理图对应的IO和LIN收发器, 我们稍微改一下, 暂且都放在main.c里面
#include "Ifx_Types.h" #include "IfxCpu.h" #include "IfxScuWdt.h"IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;#include "IfxAsclin.h" #include "IfxAsclin_Lin.h"IfxAsclin_Lin g_lin_master_2;const IfxAsclin_Lin_Pins asclin2_pins = {&IfxAsclin2_RXD_P10_6_IN, IfxPort_InputMode_pullUp, /* RX port pin */&IfxAsclin2_TX_P10_5_OUT, IfxPort_OutputMode_pushPull, /* TX port pin */IfxPort_PadDriver_cmosAutomotiveSpeed4 };void asclin_lin_master_init(IfxAsclin_Lin *g_lin, Ifx_ASCLIN *asclin,const IfxAsclin_Lin_Pins *pins, float32 baud) {/* Initialize one instance of IfxAsclin_Lin_Config with default values */IfxAsclin_Lin_Config linMasterConfig;IfxAsclin_Lin_initModuleConfig(&linMasterConfig, asclin);linMasterConfig.linMode = IfxAsclin_LinMode_master; /* Set the LIN mode of operation */linMasterConfig.brg.baudrate = baud; /* Set the desired baud rate */linMasterConfig.pins = pins; /* Port pins configuration *//* Initialize module */IfxAsclin_Lin_initModule(g_lin, &linMasterConfig); }void asclin_lin_master_send_message(IfxAsclin_Lin *g_lin, uint8 id, uint8 *data, uint8 len) {/* After the transmission of the LIN header by the master, the master itself starts the transmission* of the message.*/IfxAsclin_Lin_sendHeader(g_lin, &id); /* Send LIN header */if(g_lin->acknowledgmentFlags.txHeaderEnd == 1) /* If the LIN header has been transmitted */{IfxAsclin_Lin_sendResponse(g_lin, data, len); /* Send message */} }void asclin_lin_master_receive_message(IfxAsclin_Lin *g_lin, uint8 id, uint8 *data, uint8 len) {IfxAsclin_Lin_sendHeader(g_lin, &id); /* Send LIN header */IfxAsclin_Lin_receiveResponse(g_lin, data, len); /* wait until receive response end acknowledgemnet or an error is occured*/// if(g_lin->acknowledgmentFlags.rxResponseEnd == 1) // { // IfxAsclin_Lin_receiveResponse(g_lin, data, len); // } }void core0_main(void) {IfxCpu_enableInterrupts();/* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!* Enable the watchdogs and service them periodically if it is required*/IfxScuWdt_disableCpuWatchdog(IfxScuWdt_getCpuWatchdogPassword());IfxScuWdt_disableSafetyWatchdog(IfxScuWdt_getSafetyWatchdogPassword());/* Wait for CPU sync event */IfxCpu_emitEvent(&g_cpuSyncEvent);IfxCpu_waitEvent(&g_cpuSyncEvent, 1);asclin_lin_master_init(&g_lin_master_2, &MODULE_ASCLIN2, &asclin2_pins, 19200);uint8 tx_data[8] = {8,7,6,5,4,3,2,1};asclin_lin_master_send_message(&g_lin_master_2, 0x11, tx_data, 8);uint8 rx_data[8];asclin_lin_master_receive_message(&g_lin_master_2, 0x3A, rx_data, 8);while(1){} }其中:
- P10.6为接收, P10.5为发送, 对应Asclin2, 作为Master
- 通信速率设置为19200bps
- IfxAsclin_Lin_initModuleConfig中默认config->data.checksum= IfxAsclin_Checksum_enhanced; 所以是增强校验
- 先自己发送一帧ID为0x11的帧
- 再等待直到接收ID为0x3A的帧, 这个函数可以稍微修改一下, 毕竟LIN的速率很慢, 19200bps, 8字节数据, 也得大概5~10ms了(有点宽泛), 总之, 等着不是长久之计, 或许可以发完header后轮询判断 g_lin->acknowledgmentFlags.rxResponseEnd == 1 后再进行接收响应
USB分析仪设置为从机, 19200波特率
从机写配置如下
在Aurix Development Studio中仿真, 可以看到确实收到了USB-LIN分析仪发出的数据
参考
如下:
- Local Interconnect Network - Wikipedia
- LIN Bus – 第22条军规 (wangdali.net)
- ISO - ISO 17987-1:2016 - Road vehicles — Local Interconnect Network (LIN) — Part 1: General information and use case definition
- ISO - ISO 17987-8:2019 - Road vehicles — Local Interconnect Network (LIN) — Part 8: Electrical physical layer (EPL) specification: LIN over DC powerline (DC-LIN)
- LIN-SUBBUS.ORG
- iDoka/awesome-linbus: An awesome LIN bus tools, hardware and resources (github.com)
- uCAN-LIN/LinUSBConverter: LIN(Local interconnect network) to USB converter with LIN master support compatible with SLCAN. (github.com)
- S32K1XXRM, S32K1xx Series Reference Manual S32K (usermanual.wiki)
- MPC5748GRM.pdf
欢迎关注微信公众号:
总结
以上是生活随笔为你收集整理的TC397 LIN Master 用例的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 自我介绍php一句话,面试自我介绍经典语
- 下一篇: java replica set_kub