目录
2.7 Transmission/Reception Data Buffering
3.5.5 Lin_GoToSleepInternal
3.5.7 Lin_WakeupInternal
前言
纵向来看,LIN Driver属于LIN通信协议栈的底层驱动模块,横向来看LIN Driver属于MCAL层(microcontroller abstraction layer)。Lin Driver驱动模块执行硬件访问操作,给上层模块提供独立于硬件的API访问接口。LIN Interface模块是唯一能够直接访问LIN Driver模块的上层模块。
为了较详细的接收LIN Driver,本文将从以下五个大的方面展开叙述:LIN协议介绍、RH850芯片手册LIN Controller简介、LIN Driver AUTOSAR详细设计文档详解、MCAL配置工具LIN Driver配置、LIN Driver模块代码分析。
完成以上分析后,能回答以下问题:
-- 数据怎么完成收发功能?
-- 怎么保证数据传输的一致性?
-- LINDriver怎么实现sleep和wake up的?硬件实现还是软件实现?
1. LIN协议介绍
1.1 LIN协议概述
(Local Interconnect Network)功能简单,实时性低,成本低,是传感器/执行器级的总线。LIN总线的主要目的在于提供一种低成本的车用总线,从而形成对CAN总线的补充。
1.1.1 LIN协议版本和规范组成
LIN协议版本包括1.xxx和2.xxx两个大版本,最新版本未2.1版本。规范版本内容包括:
1)物理层规范:物理层兼容性、波特率误差、事件要求、LIN Driver/Receiver
2)协议规范:信号管理、帧传输、调度表、任务行为管理、网络管理、状态管理
3)传输层规范:PDU规范、通信、错误处理、规定的请求、时间约束
4)节点配置和标识规范:LIN产品标识、从节点模型、PDU结构、节点配置服务、标识
5)诊断规范:诊断级别、基于信号的诊断、传输协议处理、从节点发送句柄、从节点诊断时间要求
6)应用程序接口规范:主要API、节点配置和标识、传输层
7)节点能力语言规范:文件定义、语法
8)配置语言规范:文件定义、语法
1.1.2 LIN总线特点
1)串行通信,线间干扰小,节省线束,传输距离长
2)单线传输,增强的ISO 9141,总线电压小于Vbat
3)最高速率达20Kbit/s
4)单主多从结构,无需总裁
5)基于通用UART/SCI的低成本接口硬件,几乎所有MCU都具备总线的硬件基础
6)从节点无须晶振或陶瓷振荡器就能实现同步
7)可计算的信号传输延迟时间,网络通信可预期性
8)可灵活的增加或减少从节点,无需改变其他节点的硬件电路
9)一条总线最多可连接16个节点
10)支持多包报文传输,基于ISO15765-2的传输层规范
11)支持诊断功能,支持基于ISO14229-1的诊断服务
1.1.3LIN网络拓扑
LIN网络上只存在一个主任务,但是可以有多个从任务。主节点(Master Node)同时包括主任务和从任务,从节点(Slave Node)只包含从任务。主任务负责决定总线上发送的报文,从任务负责发送数据。
主任务发送报头,从任务用响应来补充报头形成完整的报文。LIN网络上可以自由地增减从节点,而不需要改变其他从节点的软件和硬件。报文的内容由ID来定义,所有节点都能够接收总线上的帧。
1.1.4调度表
LIN网络调度表负责调度网络各报文发送的顺序,为每帧报文分配发送时隙(Slot)。
调度表在网络系统设计阶段确定,LIN调度表是的LIN通信具有可预测性。
1.2 LIN协议规范
1.2.1 帧结构
字节间隔位于每个字节之间,响应间隔位于报头和响应之间。响应间隔和字节间隔是
为了留给MCU足够的处理时间处理不同帧长度的数据报文。
字节场数据是基于SCI(Serial Communication Interface)的通信格式,发送一个字节的
数据需要10个位时间(1起始位+8数据位+1停止位 = 10Tbit)。
间隔场表示一帧报文的起始,由主节点发出。间隔信号至少由13个显性信号组成,间隔界
定符至少由1个隐性位组成。间隔场是唯一一个不符合字节场格式的场。从节点需要检测到
至少连续11个显性位才认为是间隔信号。
同步场发送一个固定字节的数据(0x55),确保所有的从节点使用与主节点相同的波特率发
送和接收数据。
标识符场存放的是报文的ID(0x00-0x3f)。
数据场存放报文的数据,数据长度位1到8个字节,采用小端模式,低字节先发,低位先发。
校验和场用来校验接收的数据是否正确,包括经典校验(仅校验数据场,1.3 version)和增
强校验(校验标识符场和数据场,2.0 version)两种校验方式。
1.2.2 帧类型
1)无条件帧:标识符ID范围为0x00-0x3B,主任务发出包头,一个任务响应,一个或多个
任务接收。
- 事件触发帧:有一个独立的ID,该ID可以与多个无条件帧关联。在事件触发帧时隙内
发送帧头,只有当相关联的无条件帧内有信号被更新时才发送帧响应。帧响应的第一个数据字节等于标识符,也就是最多可以传输7个字节的数据。如果没有帧响应,帧头被忽略。帧响应可由多个节点发送,发生冲突时切换到“冲突解决调度表”,之后再切换回原来的调度表。
3)零星帧:表示共用一个时隙,在需要时才被发送的一组无条件帧。零星帧的响应仅由主节点发送,若由无条件帧需要发送,则根据帧的优先级裁定发送顺序。若没有无条件帧需要发送,则时隙保持空白。
4)诊断帧:用来传输诊断或配置信息,一般包含8个字节数据。诊断帧ID固定为,0x3C主请求帧,0x3D从响应帧。诊断响应基于ISO15765-2传输层协议和ISO14229应用层协议。
5)用户自定义帧:0x3E
6)保留帧:0x3F
1.2.3LIN网络管理
主节点发送一帧ID为0x3C且第一个字节为0x00的主请求帧来使处于工作状态的从节点进入睡眠。从节点在接收到睡眠指令之后,可以选择不进入睡眠状态而继续工作,这根据应用层协议而定。当总线空闲4-10秒的时候,所有从节点必须进入到睡眠状态。
在一个处于睡眠状态的LIN网络中,任何一个节点都可以发送唤醒信号。唤醒信号是一个250us(在20Kbit/s波特率下的0xF0)到5ms(在1Kbit/s波特率下的0xF0)的显性电平。每一个从节点都需要检测唤醒信号(持续150us以上的显性位),当检测到唤醒信号之后,在100ms以内完成初始化工作。当从节点发出唤醒信号之后150ms,主节点仍未发送报头时,从节点可以再次发送唤醒信号。当连续发送了3次唤醒信号之后如果主节点仍未发送报头,从节点要等待1.5秒以后才可以再次发送唤醒信号。
2. RH850芯片手册LIN Controller简介
2.1 RH850芯片LIN模块功能简介
RH850芯片RLIN3模块可根据需求配置为LIN协议接口或者UART接口(本文只分析LIN配置),最多支持同时配置24路LIN。
根据设计需求,可以给LIN模块选择系统高速时钟(CLK_HSB)或者模块时钟(CLK_RLIN,一般选择这个)。
每一路LIN产生4种中断,RLINxx中断,传输中断,接收完成中断,状态(Error等)中断。
每一类中断触发源如下表所示。
RH850RLIN3模块硬件上支持LIN 1.xx和2.xx协议,可通过配置寄存器直接配置硬件支持的协议版本,每个协议场(同步场,字节场,检验和场等)。
2.2RH850芯片LIN模式
根据需求,RH850 RLIN3可以配置为LIN reset mode, LIN mode, UART mode, LIN self-test mode四种模式,其中LIN mode又有LIN master mode, LIN slave mode(auto baud rate), LIN slave mode(fixed baud rate)三种子模式。
配置相关的寄存器(RLN3nLMD寄存器的LMD域,RLN3nLMST寄存器的OMM0域)可以完成硬件模式之间的切换。
各个模式下支持的功能不尽一样。
2.3LIN Reset Mode
配置RLN3nLCUC寄存器的OM0 bit为0,切换到LIN reset模式。可以通过读取RLN3nLMST寄存器的OMM0 bit来确定是否进入LIN reset模式。
LIN Reset Mode下以下寄存器恢复到初始值,LIN通信停止。
RLN3nLTRC, RLN3nLST,RLN3nEST,RLN3nLUOER恢复初始值。
LIN Reset Mode下以下寄存器保持当前值。
RLN3nLWBR,RLN3nLBRP0 ,RLN3nLBRP1 ,RLN3nLMD ,RLN3nLBFC ,RLN3nLSC ,RLN3nLWUP ,RLN3nLIE ,RLN3nLEDE ,RLN3nLDFC ,RLN3nLIDB ,RLN3nLCBR ,RLN3nLUDB0 ,RLN3nLDBRb(b = 1 to 8),RLN3nLUOR1 ,RLN3nLUTDR ,RLN3nLURDR ,RLN3nLUWTDR .
2.4LIN Mode
LIN Mode包括LIN master mode, LIN slave mode[auto baud rate], LIN slave mode[fixed baud rate]三种子模式。
LIN master模式下可执行的操作:帧头发送,响应发送,响应接收,唤醒帧发送,唤醒帧接收,错误检测。
LIN slave模式下可执行的操作:帧头接收,响应发送,响应接收,唤醒帧发送,唤醒帧接收,错误检测。
LIN slave[Auto baud rate]模式下可以根据接收到的帧头的间隔场和同步场数据自适应适配波特率。波特率设定范围为1 kbps--20 kbps。
LIN slave[Fixed baud rate]模式下,波特率固定,以固定的波特率检测帧头的间隔场,同步场和标识符场数据。
每种子模式下又包含两种操作模式,LIN operation mode和LIN wake-up mode。也就是说在某种子模式(mater or slave)下可以进程常规通信操作和唤醒操作。
配置相关寄存器进行操作模式的切换。
2.5 LIN Master Mode
2.5.1 Header Transmission
软硬件交互过程:配置相关寄存器(波特率,主模式等)-->设置RLN3mLTRC寄存器的FTS bit为1开始数据发送并等待发送完成中断-->LIN硬件检测FTS bit置位后开始帧头的发送-->发送完成后设置枕头发送成功标志产生发送完成中断-->软件陷入中断,中断函数中完成状体的更新。
2.5.2 Response Transmission
2.5.2 Response Reception
2.6 LIN Slave Mode
和Master模式处理类似,这里不再具体分析。
2.7 Transmission/Reception Data Buffering
数据收发都是使用RLN3nLDBR1-8寄存器。
3. LIN Drive模块详细设计
3.1 LIN Drive状态机
LIN Drive包括LIN_UNINIT和LIN_INIT两个模块状态。LIN_INIT模块状体下每个LIN通道包含LIN_CH_SLEEP_PENDING, LIN_CH_OPERATIONAL, LIN_CH_SLEEP三个子状态。
LIN_UNINIT: LIN模块没有又被初始化,整个LIN模块不能被使用。
LIN_INIT: LIN模块已经被初始化,每个LIN通道提供的服务已经准备好。
LIN_CH_OPERATIONAL: 当前LIN通道以及被初始化,可以进行LIN网络通信。
LIN_CH_SLEEP: LIN唤醒模式被激活。如果LIN硬件支持,LIN模块进入低功耗模式。
3.2 LIN状态切换
Reset-->LIN_UNINIT:
系统重启后,LIN模块进入LIN_UNINIT状态。
LIN_UNINIT-->LIN_INIT:
LIN_Init函数被调用后,LIN Model进入LIN_INIT状态,设置每个通道状态到LIN_CH_SLEEP状态,使能唤醒检测(可通过LIinChannelWakeupSupport配置项配置),如果硬件支持,设置硬件进入到低功耗模式。
LIN_CH_SLEEP_PENDING-->LIN_CH_SLEEP: Lin_GetStatus函数被调用后,LIN Driver模块直接进入到LIN_CH_SLEEP状态。
LIN_CH_OPERATION --> LIN_CH_SLEEP: Lin_GoToSleepInternal函数被调用后,LIN Driver进入到LIN_CH_SLEEP状态。
LIN_CH_SLEEP-->LIN_CH_OPERATION: Lin_Wakeup/Lin_WakeupInternal函数被调用
3.3 LIN Driver实现的一些重要需求
a. 任何帧的响应必须在下一帧发送之前可用
b. 如果Master节点发出帧头后又要发出响应,帧响应应该由其他的函数调用触发
c. LIN Driver需要以非阻塞的方式将接收的数据拷贝到LinIf层。
d. LIN Driver必须保证收发数据的一致性。在发送完或者接收完一帧报文之前,数据缓冲区需要被保护。
3.4 Wakeup和WakeupInternal的区别
a. Wakeup: LIN Driver接收到LinIf层的唤醒命令,被请求唤醒的通道发送唤醒脉冲到Lin总线上(唤醒其他节点)。
b. WakeupInternal: LIN Driver接收到LinIf层的唤醒命令,被请求唤醒的通道不会发送唤醒脉冲到Lin总线上。
3.5 关键API解析
3.5.1 Lin_Init
根据用户配置初始化LIN Driver模块(只是模块和通道状态机到初始状态,更具用户配设置寄存器)。
3.5.2 Lin_CheckWakeup
检测某个通道是否被唤醒。两种唤醒检测方式,一种来自LIN Controller硬件本身,一种来自LIN Transceiver。
LIN Transceiver触发唤醒事件后,LinIf层通过Lin_CheckWakeup函数确定Lin Driver模块那个通道被唤醒了,这种方式下,仅仅通过Lin Driver来检测某个LIN通道有没有发送唤醒,本身并没有触发唤醒事件。
LIN Driver模块探测到Rx引脚发送唤醒事件后,Lin_CheckWakeup通过调用EcuM_SetWakeupEvet函数通知到ECUM模块,调用LinIf_WakeupConfirmation函数通知LinIf模块。
3.5.3 Lin_SendFrame
发送一帧数据的帧头,如果当前帧响应由Master发出,同时发出帧响应。在使用Lin_SendFrame函数后,LIN接口必须通过轮询Lin_GetStatus()函数来等待LIN帧的相应响应部分。
3.5.4 Lin_GoToSleep
设置当前LIN通道进入LIN_CH_SLEEP_PENGDING模式。
3.5.5 Lin_GoToSleepInternal
设置当前LIN通道进入LIN_CH_SLEEP模式。
3.5.6 Lin_Wakeup
LIN Driver接收到LinIf层的唤醒命令,被请求唤醒的通道发送唤醒脉冲到Lin总线上(唤醒其他节点)。
3.5.7 Lin_WakeupInternal
LIN Driver接收到LinIf层的唤醒命令,被请求唤醒的通道不会发送唤醒脉冲到Lin总线上。
3.5.8 Lin_CheckStatus
获取当前LIN Driver模块的传输,接收或者保证状态。如果当前是接收状态且接收成功,Lin_CheckStatus返回接收到的数据到上层模块。
4. Davinci配置LIN Driver
RH850的MCAL配置项基本就是配置LIN协议的内容,具体可以参考前面的协议部分,具体值可根据实际需求来配置。
5. LIN Driver模块分析
5.1 数据发送
LinIf层的配置项包含LinDriver的Lin_SendFrame函数指针,LinIf层调用Lin_SendFrame函数。
Lin_SendFrame函数当中将上层数据拷贝到数据发送RAM缓冲区。调用Lin_HwSendHeaderInternal函数进行硬件寄存器设置开始发送。
RAM数据填充到数据寄存器当中,同时使能发送中断。
发送中断处理函数中清除中断,同时将发送状态置为LIN_TX_OK。
5.2 数据接收
接收中断处理函数中清除中断标志,将数据从硬件数据寄存器当中拷贝到RAM缓存区。
LinIF模块调用Lin_GetStatus函数将接收数据拷贝到LinIf层。
5.3 数据一致性
数据发送的一致性由上层LinIf模型保证,数据接收在数据Rx中断当中,在进行数据拷贝的过程中不会被字节中断,所以能够保证数据的一致性。