📄 sample4_readme.txt
字号:
/********************************************************************/
2006.09.11.
R8C/23 CAN/LIN 演示板 样例程序说明
Sample4:LIN从机
/********************************************************************/
<操作环境>
* MCU : R5F21237JFP ES
* CPU Clock : 20MHz
<实现功能>
接收主机发送的header,依据同步段调整uart通信速率;
对ID分析,接收/发送/忽略数据段。非接收情况下,会根据ID与slot中ID匹配情况判断是否发送相应ID的数据;
能够判断休眠命令,进入休眠状态;
4s钟总线无活动,自动进入休眠状态;
外部事件触发,发送wakeup命令;
接收wakeup命令;
<说明>
* LIN 波特率:9600bit/s
* LIN从机包括4个状态
IDLE状态(初始状态),准备接收header,并判断是否该进入SLEEP状态;
SLEEP状态,等待接收/发送wakeup;
RUN状态,LIN主机通信状态;
ERROR状态,发生错误后进入该状态,通信停止。(用户可以根据需要添加错误处理函数)
* 通信过程
接收header的break段;。
接收header的同步段,并重新调整波特率;
接收header的ID段,重新计算受保护ID的奇偶校验位,根据接收到的ID,判断:
1) 是由主机发送帧的数据段,则接收数据段,检查校验和(标准型)。
判断是否为休眠命令,若是马上转入休眠状态;若不是,则将数据存入对应ID的slot。
2) 不是由主机发送帧的数据段,比较接收到的ID。
如果与信箱中的ID匹配,则将该slot信箱中的数据发送到LIN总线上;若找不到匹配的信箱,则忽略数据帧。
发送/接收/忽略 完数据段后,再次进入接收header的状态。
若从机在4s之内接收不到header,则自动进入休眠状态。
从机处在休眠状态时,可以接收来自LIN总线上的wakeup信号(>=150us的显性电平)。
接收到wakeup信号后,转入接收header的状态。
另外,当从机处于休眠态时,同时检测是否应用层发生了事件。
若有事件发生,该从机本身可以发出一个wakeup信号,转入接收header的状态,
发送完wakeup后的150ms内,若未接收到header的break信号,则该从机将再次发送一次wakeup信号,最多总共可以发送三次。
若三次发送均失败,再次进入休眠;
注:如果从机是由自身发送wakeup被唤醒,当对应事件的帧传输完毕时,应该将事件标志app_event清零。
由于该样例程序并未详细定义帧的用途,用户需要在注解的位置自行添加。
* 错误代码
1) UART传输时发生的错误:
UART_OVERRUN_ERROR(uart过载错误)
UART_PARITY_ERROR(uart奇偶校验错误)
UART_FRAMING_ERROR(uart传输错误)
2) LIN错误
LINRX_CHECKSUM_ERROR(校验和错误)
PID_PARITY_ERROR(PID奇偶校验错误)
SHORT_MESSAGE_ERROR(消息不全错误: 在接收数据段时,未接收到数据段或数据段不完整)
SYNCBREAK_ERROR(break错误)
* 帧的定义
除去受保护ID的两个奇偶校验位,帧ID共6位,后四位为cmd,前两位为DLC(数据长度码),参见lin_slave.c中table的注解部分:
帧ID = 0x31,0x3C主机发送,所有从机接收;0x3c为诊断帧,若数据段的第一字节为零,则为休眠指令(协议强制规定);
其余帧ID从机根据需要发送或忽略。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -