目录
2.1.3.1 LINTRCV_TRCV_MODE_NORMAL
2.1.3.2 LINTRCV_TRCV_MODE_STANDBY
2.1.3.3 LINTRCV_TRCV_MODE_SLEEP
前言
LIN通信服务是一组用于与LIN通信系统进行车辆网络通信的模块。提供统一的LIN网络接口。对应用层程序隐藏协议信息和消息属性的特性。
Lin通信服务包括:
兼容ISO17987标准的通信协议栈
--调度表管理机制来处理切换调度表的请求
--不同Lin帧类型的通信处理
--提供Lin唤醒和休眠接口
底层Lin驱动
--实现Lin协议及完成不同平台的硬件访问
Lin协议栈自下而上包括LinDrv, LinTrcv, LinIf, LinSM等模块。本文重点分析LinTrcv模块,包括Line收发器Datasheet分析、LinTrcv AutoSar详细设计文档分析、LinTrcv实际项目硬件设计、模块静态代码和动态配置代码分析和使用。
正文
1.Lin收发器硬件DataSheet分析
TJA1021型Lin收发器是Lin物理总线和MCU微控制器之间的物理接口,波特率配置范围为1kBd~20KBd。Pin对Pin兼容TJA1020 。
1.1 TjA1021收发器引脚功能介绍
-- RXD 接收Lin总线数据发送到MCU,通常情况下和MCU Lin控制器RX引脚连接,收发器休眠后被唤醒后处于低电平(Low Level)状态。
-- SLP_N 休眠控制输入引脚,通常情况下和MCU控制器连接,MCU拉低SLP_N引脚控制收发器休眠。
-- WAKE_N 本地唤醒输入引脚,下降沿触发。看有没有本地唤醒需求,通常情况下短接到BAT电源,不使用本地唤醒。
-- TXD 接收MCU数据传输到Lin总线,同情情况下和MCU Lin控制器TX引脚连接,收发器休眠后被唤醒后处于低电平输出(Low Level)状态。
-- GND 接地
-- LIN 连接到Lin总线
-- Vbat 连接到3.3V/5V电源。
-- INH 唤醒后处于高电平状态。掉电系统,一般接到SBC唤醒源上,用来通知SBC给MCU供电。常电系统,可以接到MCU的中断唤醒引脚上唤醒深度休眠的MCU。
1.2 LinTrcv硬件工作模式
TJA1021支持Power-on, Normal, Sleep, Standby四种工作模式。
1.2.1 Power-on模式
Lin收发器冷启动上电后处于Power-on模式,这个模式下INH脚处于高电平状态,TX和RX脚还处于inactive状态,Lin收发器的数据传输功能是不能正常工作的。拉高SLP_N脚时间t(SLP_N=1) > tgotonrom后,Line收发器进入Normal模式。
1.2.2 Normal模式
Lin收发器从Power-on模式经过t(SLP_N=1) > tgotonrom时间后进入到Normal模式,Normal模式下检测Lin总线上的数据流并通过RXD引脚发送给MCU。MCU将Lin协议数据通过TXD引脚传送给Lin收发器,Lin收发器将其转换为Lin总线信号到Lin总线上。Normal模式下,拉高SPL_N脚t(SLP_N=0) > tgotosleep后Lin收发器进入Sleep模式。
Note: 如果当前ECU节点是maser节点,INH或者Vbat引脚和Lin总线已经之间需要接一个终端电阻。
1.2.3 Sleep模式
收发器经过t(SLP_N=0) > t(gotosleep)后Lin收发器进入Sleep模式。Sleep模式下TJA1021功耗最低,收发器不能进行数据的收发,可以被本地和远程唤醒。Sleep模式下可以通过以下三种方式被唤醒:
- 远程唤醒,Lin总线低电平(Low Level)状态至少维持t(wake)Lin时间,也就是t(wake) > t(bus)。也就是Lin总线休眠后处于高电平状态,想唤醒Lin节点,则拉低Lin总线时间必须大于t(bus)。
- 本地唤醒,WAKE_N上产生一个下降沿信号。
- 拉高SLP_N,Lin收发器进入到Normal模式
Sleep模式下通过本地或者远程唤醒Lin收发器进入到Standby模式。
1.2.4 Standby模式
Sleep模式下通过本地或者远程唤醒Lin收发器进入到Standby模式,Standby模式下INH脚被拉高,断电系统的ECU可以将INH脚接到SBC的唤醒源引脚上触发SBC给MCU供电。Standby模式下,RXD引脚被拉低,常电深度休眠系统可以将RXD引脚接到MCU的中断引脚上,唤醒Lin收发器的同时可以唤醒深度睡眠的MCU。
Standby模式下MCU可以通过读取RXD引脚状态来区分本地唤醒和远程唤醒,RXD引脚高电平表示是远程唤醒,低电平状态表示是本地唤醒。
拉高SLP_N脚时间t(SLP_N=1) > tgotonrom后,Line收发器进入Normal模式。RXD上的唤醒标志和TXD引脚上的唤醒源标志将被重置。
1.2.5 一些模糊概念理解
Floating: 未定义电平状态,此状态下MCU不能判定当前引脚状态是高电平或者低电平状态,一般硬件设计的时候会通过上拉或者下拉电阻把电平状态上拉到高电平或者下拉到低电平。
2.LinTrcv AUTOSAR详细设计文档分析
2.1AUTOSAR LinTrcv状态机
2.1.1 POWER_ON状态
MCU上电后处于POWER_ON状态。
2.1.2 NOT_ACTIVE状态
Lin收发器没有初始化之前的状态。Line收发器的初始化依赖于Dio模块和Port模块初始化,所以Line收发器的初始化必须在Dio和Port模块的初始化之后。
2.1.3 ACTIVE状态
Lin收发器完成初始化后进入到ACTIVE状态同时进入LINTRCV_TRCV_MODE_SLEEP子状态。该状态下又包含三个子状态。
2.1.3.1 LINTRCV_TRCV_MODE_NORMAL
该模式下Lin总线正常通信。
2.1.3.2 LINTRCV_TRCV_MODE_STANDBY
可选模式,该模式下Lin总线关闭通信。能够被本地和远程事件唤醒。
2.1.3.3 LINTRCV_TRCV_MODE_SLEEP
该模式下Lin总线关闭通信。能够被本地和远程事件唤醒。
2.2 LinTrcv状态机切换
系统上电后处于NOT_ACTIVE状态,系统完成Dio和Port模块初始化后调用LinTrcv_Init函数完成LinTrcv模块的初始化,LinTrcv进入ACTIVE状态,同时进入LIN_TRCV_MODE_SLEEP子状态。三个子状态之间通过LinTrcv_SetOpMode函数的调用进行状态切换。
2.3 LinTrcv唤醒类型
根据不同的硬件设计,有四种场景下的唤醒类型。
场景一:ECU为断电系统,MCU没有供电,SBC给ECU部分供电,包括LIN收发器硬件被供电。Lin收发器器处于LINTRCV_TRCV_MODE_SLEEP状态,LinTrcv模块检测到唤醒事件后通知到SBC给MCU供电,MCU冷启动,这种场景下可以叫做冷启动而不是唤醒。
场景二:ECU为常电系统,MCU深度休眠,ECU部分供电,包括LIN收发器硬件被供电。LinTrcv处于LINTRCV_TRCV_MODE_SLEEP或者LINTRCV_TRCV_MODE_STANDBY状态,LinTrcv模块检测到唤醒事件,触发中断唤醒MCU。
场景三:MCU正常被供电,Lin收发器也正常被供电。LinTrcv模块处于LINTRCV_TRCV_MODE_SLEEP或者LINTRCV_TRCV_MODE_STANDBY状态,上层模块调用LinTrcv_SetOpMode函数设置LinTrcv模块进入LINTRCV_TRCV_MODE_NORMAL状态。
场景四:MCU正常被供电,Lin收发器也正常被供电。LinTrcv模块处于LINTRCV_TRCV_MODE_SLEEP或者LINTRCV_TRCV_MODE_STANDBY状态,LinTrcv驱动模块检测到Lin总线上有唤醒事件。
2.4 LinTrcv唤醒模式
LinTrcv模块必须支持唤醒事件的通知,因此LinTrcv模块必须实现两种唤醒模式,内部唤醒和外部唤醒。
2.4.1 内部唤醒
上层模块通过调用LinTrcv_Init或LinTrcv_SetOpMode函数唤醒LinTrcv驱动模块。
2.4.2 外部唤醒
LinTrcv模块检测到外部总线唤醒事件,LinIf模块通过调用LinTrcv_CheckWakeup函数获取LinTrcv唤醒事件。
2.5 LinTrCv模块关键API函数
LinTrcv_Init:初始化LinTrcv模块,需要在Dio_Init和Port_Init之后调用,设置LinTrcv模块到LINTRCV_TRCV_MODE_NORMAL状态。
LinTrcv_SetOpMode: 切换LinTrcv模块状态。
LinTrcv_GetBusWuReason: 获取LinTrcv唤醒类型。
LinTrcv_CheckWakeup: EcuM在check wakeup event的时候会调用这个函数来检测唤醒事件并设置Wakeup Event。
3.Lin收发器实际项目硬件设计
电控类ECU一般设置为断电系统,正常休眠下电的时候MCU是被断电的。ECU通过SBC电源管理芯片来控制MCU的上下电,SBC电源管理芯片是常电状态。整车满足休眠状态条件后,MCU会通知SBC给自己断电,外部有唤醒事件发生后会触发SBC给MCU供电,MCU完成冷启动。而Lin收发器的INH引脚作为硬件唤醒源接到SBC芯片上。
WAKE_N引脚一般不使用,接到BAT电源上。MCU可以通过操作SLP_N引脚设置Lin收发器进入到到Sleep或者Normal模式。INH脚接到SBC电源管理芯片上,系统休眠后检测到Lin总线上的唤醒事件通知SBC给MCU供电,完成MCU的冷启动。
4.模块代码结构分析
LinTrcv模块最重要的四个文件为LinTrcv_Cfg.h、LinTrcv_Cfg.c、LinTrcv.h、LinTrcv.c。LinTrcv_Cfg.h、LinTrcv_Cfg.c为配置代码,也就是根据实际项目配置的代码。LinTrcv.h、LinTrcv.c为静态代码,会更根据动态代码的配置提供实现不同的功能。
LinTrcv_Cfg.h根据用户配置定义各种可选配置的打开或关闭宏定义,定义LinTrcv数量和通道ID宏,声明引脚配置数据结构,声明状态机数据结构。
LinTrcv_Cfg.c静态配置引脚数据结构,定义初始状态。
LinTrcv.h声明LinTrcv模块的AutoSar标准接口。
LinTrcv.c定义实现LinTrcv模块的AutoSar标准接口。
参考文章: