目录

  • 一、基本介绍
    • 1.功能
    • 2.时钟源
    • 3.外设控制器
    • 4.中断向量
    • 5.基地址
  • 二、寄存器介绍
    • 1.LIN控制寄存器1 LINFlexD_LINCR1
    • 2.LIN中断使能寄存器LINFlexD_LINIER
    • 3.LIN状态寄存器LINFlexD_LINSR
    • 4.LIN错误状态寄存器LINFlexD_LINESR
    • 5.UART控制寄存器LINFlexD_UARTCR
    • 6.UART状态寄存器LINFlexD_UARTSR
    • 7.LIN超时控制状态寄存器LINFlexD_LINTCSR
    • 8.LIN输出比较寄存器LINFlexD_LINOCR
    • 9.LIN超时控制寄存器LINFlexD_LINTOCR
    • 10.LIN波特率寄存器(分数部分)LINFlexD_LINFBRR
    • 11.LIN波特率寄存器(整数部分)LINFlexD_LINIBRR
    • 12.LIN校验和寄存器LINFlexD_LINCFR
    • 13.LIN控制寄存器2 LINFlexD_LINCR2
    • 14.缓冲区标识符寄存器LINFlexD_BIDR
    • 15.数据缓存寄存器低LINFlexD_BDRL
    • 16.数据缓存寄存器高LINFlexD_BDRM
    • 17.标识符过滤器使能寄存器LINFlexD_IFER
    • 18.标识符过滤器匹配索引寄存器LINFlexD_IFMI
    • 19.标识符过滤器模式寄存器LINFlexD_IFMR
    • 20.标识符过滤器控制寄存器LINFlexD_IFCRn(n=0~15)
    • 21.全局控制寄存器LINFlexD_GCR
    • 22.UART超时预设寄存器LINFlexD_UARTPTO
    • 23.UART当前超时计时寄存器LINFlexD_UARTCTO
    • 24.发送DMA使能寄存器LINFlexD_DMATXE
    • 25.接收DMA使能寄存器LINFlexD_DMARXE
  • 三、功能介绍
    • 1.LIN模式
      • 1.1 LIN概述
      • 1.2 工作模式
      • 1.3 测试模式
      • 1.4 主模式下收发
      • 1.5 从模式下收发
      • 1.6 传输错误说明
      • 1.7 标识符过滤
      • 1.8 波特率设置
      • 1.9 自同步
      • 1.10 唤醒管理
    • 2.UART模式
      • 2.1 帧格式
      • 2.2 数据缓存区
      • 2.3 数据发送
      • 2.4 数据接收
    • 3.中断
  • 四、例程分析
    • 1.LIN
    • 2.UART

一、基本介绍

1.功能

MPC5744内部提供两路LINFlexD模块,该两路LINFlexD支持以下功能:

  • UART通信
  • LIN总线
  • FIFO
  • 中断
  • DMA

2.时钟源

LINFlexD模块的时钟源为PBRIDGEx_CLK。
通信波特率的时钟源为HALFSYS_CLK,其频率为系统时钟的一半。

3.外设控制器

LINFlexD0:MC_ME_PCTL204
LINFlexD1:MC_ME_PCTL91

4.中断向量


5.基地址

LINFlexD0:0xFBE84000
LINFlexD1:0xFFE90000

二、寄存器介绍

模块寄存器名称、偏移地址、复位值如下图:

1.LIN控制寄存器1 LINFlexD_LINCR1

  • CCD校验和计算禁用位
    ***该位只能在初始化模式下设置,在正常模式下为只读。***
    置1:硬件计算校验和被禁用。LINCFR寄存器可以被读写,用户可以对该寄存器进行编程,以发送软件计算的校验和。
    置0:校验和计算由硬件完成。LINCFR寄存器为只读。
  • CFD校验和禁用位
    ***该位只能在初始化模式下设置,在正常模式下为只读。***
    置1:不发送校验和。
    置0:发送完数据后发送校验和。
  • LASE LIN自动同步使能位
    ***该位只能在初始化模式下设置,在正常模式下为只读。***
    置1:使能自动同步功能。
    置0:禁用自动同步功能。
    同步功能具体介绍查看自同步。
  • AUTOWU自动唤醒设置位
    ***该位只能在初始化模式下设置,在正常模式下为只读。***
    置1:使能自动唤醒。每当设置LINSR.WUF位时,硬件将自动清除休眠位。
    置0:禁用自动唤醒。休眠位仅由软件清除。
    唤醒功能具体介绍查看唤醒管理
  • MBL主模式下同步间隔段长度设置位
    ***该位只能在初始化模式下设置,在正常模式下为只读。***
    0000:10位长度
    0001:11位长度
    0010:12位长度
    0011:13位长度
    0100:14位长度
    0101:15位长度
    0110:16位长度
    0111:17位长度
    1000:18位长度
    1001:19位长度
    1010:20位长度
    1011:21位长度
    1100:22位长度
    1101:23位长度
    1110:36位长度
    1111:50位长度
  • BF旁路滤波器使能位
    ***该位只能在初始化模式下设置。***
    置1:在接收到与任何过滤器都不匹配的ID时生成RX中断。
    置0:在接收到与任何过滤器都不匹配的ID时不生成RX中断。
  • LBKM回环模式设置位
    ***该位只能在初始化模式下设置,在正常模式下为只读。***
    置1:启用回环模式。
    置0:禁用回环模式。
    回环功能具体介绍查看测试模式。
  • MME主/从模式选择位
    ***该位只能在初始化模式下设置,在正常模式下为只读。***
    置1:模块运行在主模式下。
    置0:模块运行在从模式下。
  • SSBL从模式下同步间隔段长度设置位
    ***该位只能在初始化模式下设置,在正常模式下为只读。***
    置1:11位长度
    置0:10位长度
  • RBLM接收器缓冲区锁定模式设置位
    该位只能在初始化模式下设置,在正常模式下为只读。
    ***UART模式也使用此位。***
    置1:缓冲区满后,接收到的下一条数据将被丢弃。
    置0:缓存区满后,接收到的下一条数据将覆盖已有数据。
  • SLEEP休眠模式请求位
    ***UART模式也使用此位。***
    置1:模块进入休眠模式。由软件置1。
    置0:模块退出休眠模式。由软件置0,或当LINCR1.AUTOWU位和LINSR.WUF位置1时由硬件自动置0。
    休眠模式具体介绍查看工作模式。
  • INIT初始化模式请求位
    ***UART模式也使用此位。***
    置1:模块进入初始化模式。由软件置1。
    置0:模块退出初始化模式。由软件置0,若此时休眠位也为0,则模块进入正常模式。
    休眠模式具体介绍查看工作模式。

2.LIN中断使能寄存器LINFlexD_LINIER

  • SZIE低电平冻结中断使能
    置1:使能中断。当LINESR.SZF或UARTSR.SZF位置1时触发中断。
    置0:禁止中断。

  • OCIE
    置1:使能中断。当LINESR.OCF或UARTSR.OCF位置1时触发中断。
    置0:禁止中断。

  • BEIE位错误中断使能位
    置1:使能中断。当LINESR.BEF位置1时触发中断。
    置0:禁止中断。

  • CEIE校验和错误中断使能位
    置1:使能中断。当LINESR.CEF位置1时触发中断。
    置0:禁止中断。

  • HEIE帧头错误中断使能
    在从模式下,该位始终为0
    置1:使能中断。当LINESR.SFEF、SDEF、IDPEF中有一位置1时触发中断。
    置0:禁止中断。

  • FEIE帧错误中断使能
    置1:使能中断。当LINESR.FEF或UARTSR.FEF位置1时触发中断。
    置0:禁止中断。

  • BOIE缓冲区溢出中断使能
    置1:使能中断。当LINESR.BOF或UARTSR.BOF位置1时触发中断。
    置0:禁止中断。

  • LSIE

  • WUIE唤醒中断使能
    置1:使能中断。当LINESR.WUF或UARTSR.WUF位置1时触发中断。
    置0:禁止中断。

  • DBFIE数据缓存区满中断使能位
    置1:使能中断。当LINESR.DBFF位置1时触发中断。
    置0:禁止中断。

  • DBEIETOIE数据缓冲区空中断/超时中断使能位
    置1:使能中断。当LINESR.DBEF或UARTSR.TO位置1时触发中断。
    置0:禁止中断。

  • DRIE接收完成中断使能位
    置1:使能中断。当LINESR.DRF或UARTSR.DRF位置1时触发中断。
    置0:禁止中断。

  • DTIE发送完成中断使能位
    置1:使能中断。当LINESR.DTF或UARTSR.DTF位置1时触发中断。
    置0:禁止中断。

  • HRIE帧头接收中断使能位
    在从模式下,该位始终为0
    置1:使能中断。当LINESR.HRF位置1时触发中断。
    置0:禁止中断。

各中断对应中断向量查看中断。

3.LIN状态寄存器LINFlexD_LINSR

  • AUTOSYNC_COMP
    该位在自动同步完成后以及LINCR1.LASE位启用时设置。
    只有在设置了该位之后,才能在自动同步模式下读取LINIBRR和LINFBRR寄存器的内容。
    ***如果禁用自动同步,则保留此位。***
  • RDC接收数据字节计数器
    该字段包含LIN模式下接收数据缓冲区中的字节数。
  • LINS LIN状态位
    ***在UART模式下,模块状态由该字段记录。***
    0000:睡眠模式。LINFlexD处于睡眠模式,以节省功耗。
    0001:初始化模式。以下情况会进入初始化模式:1.当软件清零LINCR1.SLEEP和LINCR1.INIT位时;2.当RX引脚上接收到唤醒脉冲时;3.当上一帧已经接收/发送完成或中止时。
    0010:空闲模式:以下情况会进入空闲模式:1.当软件清零LINCR1.SLEEP和INIT位时;2.在RX引脚上接收到唤醒脉冲(AUTOWU设置)时;3.上一帧发送/接收已完成/中止时。
    0011:同步间隔段:在从模式下,检测到下降沿,然后是显性电平,正在接收同步间隔段。在主模式下,正在发送同步间隔段。
    0100:同步间隔段间隔符:在从属模式下,检测到有效的同步间隔段(10位或11位),等待上升沿。在主模式下,同步间隔段发送已完成,发送同步间隔段间隔符。
    0101:同步段:在从模式下,已检测到有效的同步间隔段间隔符(至少一位时间的隐性状态),正在接收同步段。在主模式下,正在发送同步段。
    0110:ID段:在从属模式下,已接收到有效的同步字段,正在接收ID字段。在主模式下,正在发送ID段。
    0111:帧头接收/发送:在从模式下,已接收到有效的报头并且ID有效。在主模式下,发送报头。
    1000:数据段:在接收模式下,正在接收数据。在发送模式下,正在发送数据。
    1001:校验和段:数据发送/接收已完成,正在发送/接收校验和。
    LIN总线通信过程查看LIN概述。
  • RMB释放数据缓冲区
    读0:数据缓冲区空闲。在初始化模式下由硬件重置
    读1:数据缓冲区数据有效。
    置1:清除该位。该位应在数据缓冲区后由软件清除。在初始化模式下,硬件会重置该位
  • DRBNE数据接收缓冲区非空标志
    接收到第一个字节并将其存储在BDRL中后,硬件就会自动将该位置1(当接收缓冲器中至少有一个数据字节时)。软件应在读取所有缓冲区后将其清除。该位也由硬件在初始化模式下复位。
  • RXbusy接收器忙标志位
    从属模式下,在帧头接收后,如果BIDR.DIR位置0并开始接收,则该位被设置。在这种情况下,用户无法设置LINCR2.DTRQ位以请求发送数据。
  • RDILIN接收信号
    该位反映Rx引脚的当前状态。
  • WUF唤醒标志位
    当在Rx引脚上检测到下降沿时,该位由硬件设置。
    1.从机处于睡眠模式时
    2.当主机处于睡眠模式或空闲模式时
    它可以通过软件清除。它在初始化模式下由硬件重置
  • DBFF数据缓冲区满标志位
    当缓冲区已满(接收到8字节)且BIDR.DFL>7时,该位由硬件设置。应通过软件清除。该位也由硬件在初始化模式下复位。
  • DBEF数据缓冲区空标志位
    当缓冲区为空(已发送8个字节)且BIDR.DFL>7时,该位由硬件置1。应在软件重新填充数据缓冲区后由软件清除。除非该位被软件复位,否则不会开始下一个8字节的发送。该位也由硬件在初始化模式下复位。
  • DRF数据接收完成标志位
    数据接收完成后,该位由硬件置1。此标志应由软件清除。该位也由硬件在初始化模式下清零。
    注:如果出现帧错误或校验和错误,则不设置此标志。
  • DTF数据发送完成标志位
    数据发送完成后,该位由硬件置1。此标志应由软件清除。该位也由硬件在初始化模式下清零。
  • HRF帧头接收完成标志位
    该位在帧头接收完成时置1。应通过软件清零。
    此位仅在以下情况下置1:
    a) 所有过滤器处于禁用状态,并且LINCR1.BF位已置1
    b) 任何过滤器均与ID不匹配,并且LINCR1.BF位已置1
    c) TX滤波器匹配
    在帧结束或帧中止时,若HRF仍置1,它将被硬件清零。该位也由硬件在初始化模式下清零。

4.LIN错误状态寄存器LINFlexD_LINESR

  • SZF冻结在低电平标志位
    当连续检测到100个低电平时,该位由硬件置1。应通过软件清除。
    该错误具体介绍查看冻结在低电平错误。

  • OCF

  • BEF位错误标志位
    当存在位错误时,该位由硬件设置。应通过软件清除。在初始化模式下由硬件复位。
    该错误具体介绍查看位错误。

  • CEF校验和错误标志位
    如果接收的校验和与硬件计算的校验和不匹配,则由硬件设置该位。应通过软件清除。如果设置了LINCR1.CCD或CFD位,则不会发生此错误。在初始化模式下由硬件复位。
    该错误具体介绍查看校验和错误。

  • SFEF同步段错误标志位
    当接收到的同步段不标准时,该位由硬件设置。应通过软件清除。在初始化模式下由硬件复位。
    对于从设备若该位为0,则该位将始终读取0,无法编程。
    该错误具体介绍查看同步段错误。

  • SDEF步间隔段间隔符错误标志位
    当间隔符太短时,该位由硬件设置。应通过软件清除。
    对于从设备若该位为0,则该位将始终读取0,无法编程。
    在初始化模式下由硬件复位
    该错误具体介绍查看同步间隔段间隔符错误。

  • IDPEF ID奇偶校验错误标志位
    当ID奇偶校验中存在错误时,该位由硬件设置。应通过软件清除。
    ***当SFEF、SDEF、IDPEF标志被设置且LINIER.HEIE被设置时,帧头错误中断被触发。***
    对于从设备若该位为0,则该位将始终读取0,无法编程。若该位为1,则该位在初始化模式下由硬件重置。
    该错误具体介绍查看标识符校验错误。

  • FEF帧错误标志位
    当出现帧错误(无效的停止位)时,该位由硬件设置。应通过软件清除。在初始化模式下由硬件复位
    该错误具体介绍查看帧错误。

  • BOF缓冲区溢出标志位
    当接收到新字节且未清除LINSR.RMB位时,该位由硬件设置。它可以通过软件清除。在初始化模式下由硬件复位。
    该错误具体介绍查看溢出错误。

  • NF噪声标志位
    当在接收的字符中检测到噪声时,该位由硬件设置。应通过软件清除。在初始化模式下由硬件复位。
    该错误具体介绍查看噪声错误。

5.UART控制寄存器LINFlexD_UARTCR

  • NEF预期帧数设置位
    ***该位只能在初始化模式时设置,在其它模式下为只读。***

  • DTU_PCETX禁用超时设置值位
    ***该位只能在初始化模式下UARTCR.UART=1时设置。***

  • SBUR停止位模式设置位
    ***该位只能在初始化模式下UARTCR.UART=1时设置。***
    当UART用于发送和接收时,我们必须在GCR.STOP和SBUR中设置相同数量的停止位。当UART仅用作接收器时,仅设置SBUR位就足够了。
    00:1个停止位。
    01:2个停止位。
    10:3个停止位。

  • WLS特殊字长设置位
    ***该位只能在初始化模式下UARTCR.UART=1时设置。***
    如果设置了该位,则设置WL和PCE位对UART接收没有影响,尽管在该模式下默认启用奇偶校验,但PC0/1位可用于选择奇偶校验控制。
    置1:该位在接收时使能12位+奇偶校验位模式。
    置0:禁用该功能。

  • TDFL_TFC发送数据长度/TX FIFO计数器
    TDFL定义在UART缓冲模式(TFBM=0)下要发送的字节数。TDFL是读/写字段。位15被保留且未实现。当UART数据长度被配置为半字(WL=10或WL=11)时,仅允许配置TDFL=x01或TDFL=x11。
    x00:1字节
    x01:2字节
    x10:3字节
    x11:4字节
    TFC记录UART FIFO模式(TFBM=1)下Tx FIFO中的字节数。TFC是一个只读字段,可用于调试目的。
    000:空
    001:1字节
    010:2字节
    011:3字节
    100:4字节

  • RDFL_RFC接收数据长度/RX FIFO计数器
    RDFL定义在UART缓冲模式(RFBM=0)下要接收的字节数。RDFL是一个读/写字段。位19被保留且未实现。当UART数据长度被配置为半字(WL=10或WL=11)时,仅允许配置RDFL=x01或RDFL=x11。
    x00:1字节
    x01:2字节
    x10:3字节
    x11:4字节
    RFC记录UART FIFO模式(RFBM=1)下Rx FIFO中的字节数。RFC是一个只读字段,可用于调试目的。
    000:空
    001:1字节
    010:WLS位置1,2字节/1.5字节
    011:3字节
    100:WLS置1,4字节/2x1.5字节

  • RFBM缓冲/FIFO模式设置位
    ***该位只能在初始化模式下UARTCR.UART=1时设置,在其它模式下为只读。***
    置1:接收FIFO模式使能,DMA模式下必须设置为此模式。
    置0:接收缓冲模式使能。

  • TFBM发送FIFO/缓冲模式选择位
    ***该位只能在初始化模式下UARTCR.UART=1时设置,在其它模式下为只读。***
    置1:发送FIFO模式使能,DMA模式下必须设置为此模式。
    置0:发送缓冲模式使能。

  • WL1字长设置位
    ***该位只能在初始化模式下UARTCR.UART=1时设置,在其它模式下为只读。***
    WL0=0,WL1=0:7位数据+1位校验位。
    WL0=1,WL1=0:PCE=0,8位数据;PCE=1,8位数据+1位校验位。
    WL0=0,WL1=1:15位数据+1位校验位。
    WL0=1,WL1=1:PCE=0,16位数据;PCE=1,16位数据+1位校验位。

  • PC1校验控制位
    ***该位只能在初始化模式下UARTCR.UART=1时设置,在其它模式下为只读。***
    PC0=0,PC1=0:偶校验。
    PC0=1,PC1=0:奇校验。
    PC0=0,PC1=1:校验位总为0。
    PC0=1,PC1=1:校验位总为1。

  • RxEn接收使能位
    ***该位只能在UARTCR.UART=1时设置。***
    置1:接收使能。
    置0:接收禁止。

  • TxEn发送使能位
    ***该位只能在UARTCR.UART=1时设置。***
    置1:发送使能。
    置0:发送禁止。

  • PC0校验控制位
    ***该位只能在初始化模式下UARTCR.UART=1时设置,在其它模式下为只读。***
    PC0=0,PC1=0:偶校验。
    PC0=1,PC1=0:奇校验。
    PC0=0,PC1=1:校验位总为0。
    PC0=1,PC1=1:校验位总为1。

  • PCE奇偶校验控制使能位
    ***该位只能在初始化模式下设置,在其它模式下为只读。***
    置1:奇偶校验发送/检查启用。
    置0:奇偶校验发送/检查禁用。

  • WL0字长设置位
    ***该位只能在初始化模式下UARTCR.UART=1时设置,在其它模式下为只读。***
    WL0=0,WL1=0:7位数据+1位校验位。
    WL0=1,WL1=0:PCE=0,8位数据;PCE=1,8位数据+1位校验位。
    WL0=0,WL1=1:15位数据+1位校验位。
    WL0=1,WL1=1:PCE=0,16位数据;PCE=1,16位数据+1位校验位。

  • UART模式设置位
    ***该位只能在初始化模式下设置,在其它模式下为只读。***
    置1:模块工作在UART模式下。
    置0:模块工作在LIN模式下。

6.UART状态寄存器LINFlexD_UARTSR

  • SZF冻结在低电平标志位
    当连续检测到100个低电平时,该位由硬件置1。应通过软件清除。
    如果LINIER.SZIE位被置1,将触发中断。
    当处于初始化模式且UART位被设置时,该位将反映与LINESR中相同的值。

  • OCF

  • PE校验错误标志位
    读1:接收的相应字节奇偶校验出错。
    读0:无校验错误。

  • RMB释放消息缓冲区
    该位应通过软件清除。
    当处于初始化模式且UART位被设置时,该位将反映与LINSR中相同的值。
    读1:数据缓冲区有效。
    读0:数据缓冲区空。

  • FEF帧错误标志
    当出现帧错误(无效的停止位)时,该位由硬件设置。应通过软件清除。
    如果LINIER.FEIE位被置1,它将触发中断。
    当处于初始化模式且UART位被设置时,该位将反映与LINESR中相同的值。

  • BOF缓冲区/FIFO溢出标志
    当接收到一个新字节且在UART缓冲模式下未清除RMB位时,该位由硬件置1。在UART FIFO模式下,当存在新字节且Rx FIFO已满时,该位置1。
    在UART FIFO模式下,一旦Rx FIFO已满,无论LINCR1.RBLM位是何值,新接收的消息都将被丢弃。在UART Rx缓冲区模式下,如果LINCR1.RBLM置1,则接收的新消息将被丢弃;如果LINCR1.RBLM置0,则新消息将覆盖缓冲区。
    它可以通过软件写入1来清除。
    如果LINIER.BOIE位置1,则会触发中断。
    当处于初始化模式且UART位被设置时,该位将反映与LINESR中相同的值

  • RDI接收器数据输入信号位
    该位反映了RX引脚的当前状态。

  • WUF唤醒标志位
    当在休眠模式下在RX引脚上检测到下降沿时,该位由硬件置1。应通过软件清除。如果LINIER中.WUIE位置1,将触发中断。
    当处于初始化模式且设置了UART位时,该位将反映与LINESR中相同的值

  • RFNE接收FIFO不空标志位
    在UART FIFO模式(UARTCR.RFBM=1)下,当接收FIFO中存在至少一个数据字节时,硬件将该位置1。
    ***RFNE是用于调试目的的只读位。***

  • TO超时位
    当发生UART超时时,该位由硬件设置。该位应由软件清除。
    在UART模式下,LINIER.DBEIETOIE位置1时会触发中断

  • DRFRFE数据接收完成标志/Rx FIFO空标志位
    DRF:在UART缓冲模式(USRTCR.RFBM=0)下,当接收字节数达到USRTCR.RDFL_RFC的设置时,该位置1。该位由软件写1清零。
    REF:在UART FIFO模式(USRTCR.RFBM=1)下,当FIFO为空时,该位置1。该位为只读位。

  • DTFTFF数据发送完成标志/TX FIFO满标志位
    DTF:在UART缓冲模式(USRTCR.RFBM=0)下,当数据发送完成后,该位置1。该位由软件写1清零。
    TFF:在UART FIFO模式(USRTCR.RFBM=1)下,当FIFO满时,该位置1。该位为只读位。

  • NF噪声标志位
    当在接收的字符中检测到噪声时,该位由硬件置1。应通过软件清零。
    该错误具体介绍查看噪声错误。

7.LIN超时控制状态寄存器LINFlexD_LINTCSR

  • MODE

  • IOT

  • TOCE

  • CNT

8.LIN输出比较寄存器LINFlexD_LINOCR


此寄存器包含要与LINTCSR.CNT值进行比较的值。
***此寄存器只能在输出比较模式下由软件写入。***

  • OC2比较值2。
  • OC1比较值1。

9.LIN超时控制寄存器LINFlexD_LINTOCR

  • RTO

  • HTO

10.LIN波特率寄存器(分数部分)LINFlexD_LINFBRR

  • FBR波特率分数部分
    具体介绍查看波特率设置。
    该位可以在任何模式下读取,只能在初始化模式下写入

11.LIN波特率寄存器(整数部分)LINFlexD_LINIBRR

  • IBR波特率整数部分
    具体介绍查看波特率设置。
    该位可以在任何模式下读取,只能在初始化模式下写入

12.LIN校验和寄存器LINFlexD_LINCFR

  • CF校验和位
    当LINCR1.CCD位置0时,这些位是只读的,校验和由硬件计算。当LINCR1.CCD位置1时,可以通过软件设置校验和。

13.LIN控制寄存器2 LINFlexD_LINCR2

  • TBDE同步间隔段间隔符设置位
    该位可以在任何模式下读取,只能在初始化模式下写入
    置1:同步间隔段间隔符长度为2位。
    置0:同步间隔段间隔符长度为1位。
  • IOBE位错误设置位
    该位可以在任何模式下读取,只能在初始化模式下写入
    置1:位错误会重置LIN状态机。
    置0:位错误不会重置LIN状态机。
  • IOPE校验错误设置位
    该位可以在任何模式下读取,只能在初始化模式下写入
    置1:校验错误会重置LIN状态机。
    置0:校验错误不会重置LIN状态机。
  • WURQ唤醒生成请求位
    此位置1将生成唤醒脉冲。当唤醒字符被发送时,它被硬件自动清零。唤醒期间发送的字符从BDRL.DATA0复制。请注意,此位不能在睡眠模式下设置,软件必须在设置此位之前退出睡眠模式。发送唤醒请求时不检查位错误。该位可由软件读取/设置
  • DDRQ数据丢弃设置位
    如果正在接收的帧与该节点无关,则由软件将该位置1,以停止数据接收。一旦LINFlexD忽略数据并移到空闲状态,硬件将清零该位。对于LIN从机,仅当LINSR.HRF位置1,且软件过滤了ID时,才能设置该位。该位可由软件读取/设置
  • DTRQ数据发送请求位
    由软件在从属模式下设置,以请求发送缓冲数据寄存器中存储的LIN数据字段。仅当LINSR.HRF位置1时才可以设置该位(以确保仅在报头接收之后才请求数据发送)。
    当请求完成时,或在中止请求或错误情况下,由硬件清零该位。在主模式下,当BIDR.DIR位置1并且帧头发送完成时,该位由硬件置1。寄存器位可由软件读取/设置
  • ABRQ中止请求位
    由软件设置以中止当前发送。
    发送中止时由硬件清零。LINFlexD在当前位结束时中止发送。该位还可以中止唤醒请求,也可以在UART模式下使用。寄存器位可由软件读取/设置
  • HTRQ帧头发送请求位
    由软件设置以请求发送LIN帧头。
    当请求完成或中止请求时,由硬件清除。此位在UART模式下无效。
    在主模式下,如果同时设置了HTRQ和ABRQ,则ABRQ无效。
    类似地,从模式中,在报头接收之后,如果同时设置DTRQ和ABRQ,则ABRQ不起作用。

14.缓冲区标识符寄存器LINFlexD_BIDR

  • DFL数据段长度
    帧中的数据段字节数。
    DFL=数据字节数-1
    DFL[5:3]用于扩展帧。通常,LIN模式将使用DFL[2:0]。ID过滤器现在也与DFL[5:0]兼容。
  • DIR方向设置位
    该位控制数据段的方向。
    置1: LINFlexD从BDR寄存器发送数据。
    置0: LINFlexD接收数据并将其复制到BDR寄存器中。
  • CCS校验和类型控制位
    置1:经典校验和,仅计算数据段校验和。这与LIN规格1.3及更低版本兼容。
    置0:包含ID和数据段的增强校验和。这与2.0版及更高版本的LIN规范兼容。
  • ID
    标识符字段中没有标识符奇偶校验的标识符部分。此字段只能在主模式下写入。

15.数据缓存寄存器低LINFlexD_BDRL


8字节数据缓冲器的低4个字节。

16.数据缓存寄存器高LINFlexD_BDRM


8字节数据缓冲器的高4个字节。

17.标识符过滤器使能寄存器LINFlexD_IFER

  • FACT过滤器使能位
    置1:第n位置1则使能对应的过滤器。
    置0:第n位置1则禁用对应的过滤器。
    过滤器具体介绍查看标识符过滤器。

18.标识符过滤器匹配索引寄存器LINFlexD_IFMI

  • IFMI匹配索引位
    当接收到的ID与第m个过滤器匹配时,硬件将m+1加载到IFMI中,没有匹配条件则用IFMI=0表示。
    过滤器具体介绍查看标识符过滤器。

19.标识符过滤器模式寄存器LINFlexD_IFMR

  • IFM过滤器模式设置位
    置1:第n位置1,则过滤器2n和2n+1工作在掩码模式,过滤器2n+1充当掩码。
    置0:第n位置0,则过滤器2n和2n+1工作在列表模式。
    过滤器具体介绍查看标识符过滤器。

20.标识符过滤器控制寄存器LINFlexD_IFCRn(n=0~15)

  • DFL数据段长度
    帧中的数据段字节数。
    DFL=数据字节数-1
    DFL[5:3]用于扩展帧。通常,LIN模式将使用DFL[2:0]。ID过滤器现在也与DFL[5:0]兼容。
  • DIR方向设置位
    该位控制数据段的方向。
    置1: LINFlexD从BDR寄存器发送数据。
    置0: LINFlexD接收数据并将其复制到BDR寄存器中。
  • CCS校验和类型控制位
    置1:经典校验和,仅计算数据段校验和。这与LIN规格1.3及更低版本兼容。
    置0:包含ID和数据段的增强校验和。这与2.0版及更高版本的LIN规范兼容。
  • ID
    标识符字段中没有标识符奇偶校验的标识符部分。此字段只能在主模式下写入。
    过滤器具体介绍查看标识符过滤器。

21.全局控制寄存器LINFlexD_GCR

  • TDFBM发送顺序设置位
    置1:发送数据时从高位开始。
    置0:发送数据时从低位开始。
  • RDFBM接收顺序设置位
    置1:接收数据时从高位开始。
    置0:接收数据时从低位开始
  • TDLIS发送数据电平翻转设置位
    该位可以在任何模式下读取,只能在初始化模式下写入
    置1:发送数据时翻转电平。
    置0:发送数据时不翻转电平。
  • RDLIS接收数据电平翻转设置位
    该位可以在任何模式下读取,只能在初始化模式下写入
    置1:接收数据时翻转电平。
    置0:接收数据时不翻转电平。
  • STOP停止位设置位
    置1:2个停止位。
    置0:1个停止位。
  • SR复位
  • 该位只能在初始化模式下写入
    置1:复位以下寄存器内字段:
    LINSR、LINESR、UARTCTO所有位
    LINTCSR.CNT[0:7]字段
    UARTSR除RFE,TFF位之外的所有位
    UARTCR.TFC、UARTCR.RFC位

22.UART超时预设寄存器LINFlexD_UARTPTO

  • PTO超时预设值设置位
    该字段定义超时计数器的预设值。
    ***禁止零值,否则UARTSR.TO立即置1。***

23.UART当前超时计时寄存器LINFlexD_UARTCTO

  • CTO当前超时计时器值
    该位为超时计数器的当前值。CTO是只读字段。
    每次重新初始化UARTPTO,或UARTCTO=UARTPTO,或通过硬/软复位,CTO都会复位。当CTO值与预设值匹配时,会将UARTSR.TO位置1。

24.发送DMA使能寄存器LINFlexD_DMATXE

25.接收DMA使能寄存器LINFlexD_DMARXE

三、功能介绍

1.LIN模式

1.1 LIN概述

LIN (Local Interconnect Network)是一种串行通信协议。LIN通信网络由一个主节点和几个从节点组成。主节点包含主机任务和从机任务。所有其他从节点只包含从机任务。主机节点决定什么时候以及哪个帧在总线上传输。从机节点提供传输的数据。

帧由主机任务提供的帧头和从机任务提供的应答组成。主机负责发送帧头;从机负责接收帧头并作出解析,然后决定是发送应答,还是接收应答或不回复。

帧头由一个同步间隔段、一个同步段和一个受保护ID段组成。同步间隔段后跟同步段,同步段后跟ID段。与ID关联的从机任务发送应答。应答由一个数据段和校验和段组成。从机任务会根据帧头ID作出反应(接收/发送/忽略应答)。

同步间隔段至少是由13位的显性(低)电平组成,其中同步间隔段间隔符至少为1位隐性(高)电平。

LIN同步以下降沿为判断标志,采样字节0x55(01010101b)进行同步。

受保护的ID的前6位叫做帧的ID,加上两个奇偶效验码后称作受保护的ID。

校验位计算公式如下:

1.2 工作模式

LINFlexD有三种工作模式:初始化,正常和睡眠模式。硬件复位后,LINFlexD进入休眠模式,降低功耗。

  • 初始化模式(INIT)
    进入该模式需要软件在LINCR1中设置INIT位。为了退出初始化模式,软件需要重置INIT位。
    在初始化模式下,所有LIN总线的消息传输都停止,LIN总线输出LINTX的状态为隐性(高)电平。如果软件在进行总线传输时进入初始化模式,则传输将中止。因此,在设置这个位之前,软件应该检查LIN状态。要初始化LINFlexD控制器,必须进行以下设置:
    1.设置通信波特率。
    2.设置UARTCR.UART位。
    3.选择模式(主或从)。
    4.配置校验和控制位。
    5.初始化标识符列表(从模式)。
  • 正常模式(NM)
    一旦软件完成了LINFlexD控制器的初始化,它就可以通过清除INIT位进入Normal模式。
  • 休眠模式(SM)
    LINFlexD进入休眠模式以降低功耗。通过在LINCR1.SLEEP位进入此模式。在此模式下,LINFlexD时钟停止。通过清除LINCR1.SLEEP位,LINFlexD可以从Sleep模式中唤醒。

1.3 测试模式

该模式通过设置LINCR1.LBKM位进入。在这种模式下,LINFlexD接收自身传输的标识符和数据,并将标识符和数据分别写入BIDR和Data缓冲区。该模式用于自检功能。在此模式下检查误码。
LINFlexD忽略LINRX信号。从它的TX输出到它的RX输入有一个内部反馈。通过设置SIUL2,可以将TX引脚与LINTX引脚断开。

1.4 主模式下收发

通过LINCR1.MME位置1来选择主模式。

  • 帧头的发送
    根据LIN协议,LIN总线上的任何通信都是由主机任务发送一个帧头触发的。帧头由主机节点的主机任务发送,响应由节点的从机任务发送。
    要发送帧头,首先对BIDR寄存器中的标识符、数据字段长度、消息方向和校验和进行编程;然后将LINCR2.HTRQ位置1。一旦帧头发送开始,用户不应该修改BIDR寄存器位,直到当前帧传输完成。发送的ID也被主节点接收并复制到BIDR。
  • 数据段的发送
    当主机节点是主机任务发送的标识符对应数据的发布者时,主机节点的从机任务应该发送帧的响应部分的数据。因此,软件必须在请求帧头传输之前将数据提供给LINFlexD。要传输的数据存储在消息缓冲区BDRL和BDRM中。要传输的字节数取决于BIDR中的数据字段长度。软件使用BIDR.CCS位为每条消息配置校验和类型(经典的或增强的)。
    如果响应成功发送,则LINSR.DTF位置1。如果发生错误,则LINSR.DTF标志不会置1,并在LINESR中设置相应的错误标志。
    可以处理响应大小大于8字节数据的帧(扩展帧)。如果BIDR中配置的数据字段长度大于8个数据字节,则在发送前8个字节后LINSR.DBEF位置1。应用程序必须在清零LINSR.DBEF位之前更新缓冲区BDR。
    当LINSR.DBEF位清零时开始下一个字节的传输。一旦发送了最后一个数据字节(或校验和字节),LINSR.DTF标志置1。
    消息缓冲区的方向由BIDR.DIR位决定。传输的数据也被相同的节点接收并复制到缓冲区。
  • 数据段的接收
    为了从从机节点接收数据,主节点发送一个带有相应标识符的帧头。从从机节点接收到的数据存储在消息缓冲区中,消息的状态存储在LINSR中。
    如果成功接收到响应,则设置LINSR.DRF位。如果出现错误,则不设置LINSR.DRF标志,并在LINESR中设置相应的错误标志。
    可以处理响应大小大于8字节数据的帧(扩展帧)。如果在BIDR中配置的数据字段长度大于8字节,则在接收到前8个字节后设置LINSR .DBFF位。应用程序必须在重置LINSR .DBFF位之前读取缓冲区BDR。一旦接收到最后一个数据字节(或校验和字节),就设置LINSR .DRF标志。
  • 数据段的丢弃
    如果用户想在报头传输后丢弃数据,那么应该设置LINCR2.DDRQ位。

1.5 从模式下收发

通过LINCR1.MME位清零来选择从模式。

  • 数据的发送
    在帧头接收后,LINSR.HRF位置1并生成RX中断,软件必须完成以下步骤以发送数据:
    1.读取BIDR寄存器中接收的ID。
    2.填写BDR[0:x]寄存器。
    3.设置BIDR.CCS位,将BIDR.DIR位置1。
    4.设置BIDR.DFL位以设置数据段长度。
    5.将LINCR2.DTRQ位置1触发数据发送。
    注意,只有在将LINCR2.DTRQ位置1开始发送数据之后,LINSR.HRF位才能被清零。这是为了确保LINCR2.DTRQ不是随机置1的,而是只在帧头接收后才设置的。必须注意的是,一旦LINSR.RXbusy置1,就不能设置BIDR.DIR和LINCR2.DTRQ位。
    或者,通过设置BIDR.DIR位并配置一个或多个标识符过滤器用于传输,并通过设置IFER中的启用位来激活过滤器。当至少有一个标识符过滤器处于活动状态并配置用于发送,并且接收到的ID与过滤器匹配时,将生成一个TX中断。软件可以使用IFMI寄存器中的索引直接指向RAM中相应的数据数组,并将该数据复制到BDR[0:7]。
    过滤器的使用为软件节省了从BIDR中读取ID值、匹配它、配置数据字段长度和校验和类型所需的处理时间。
    如果LINFlexD提供的过滤器数量不足以满足应用程序的要求,可以使用掩码模式对过滤器进行过滤。
    发送的数据也被相同的节点接收并复制到缓冲区。
  • 数据的接收
    当LINFlexD与接收到的标识符匹配时,在帧头接收后LINSR.HRF位置1,并生成RX中断。软件必须从BIDR寄存器读取接收到的ID,并在接收第一个数据字节的停止位之前指定数据段的长度。当收到校验和时,产生一个RX中断,软件从BDR[0:7]读取收到的数据,LINSR.RMB位置1。然后,软件必须通过清零LINSR.RMB来释放数据缓冲区。
    当至少有一个标识符过滤器处于活动状态并配置为接收时,只有在接收校验和之后才会生成RX中断。接收到ID时不会产生中断请求。
    如果标识符被软件过滤,那么可以通过设置LINCR2.DDRQ位丢弃数据,同时清零LINSR.HRF。
    注意,对于软件过滤,软件必须在接收数据之前决定校验和的类型(配置BIDR.CCS位)。

1.6 传输错误说明

  • 同步间隔段间隔符错误(SDEF)
    同步间隔段间隔符至少有一位宽度的隐形(高)电平;否则会被认为同步间隔段间隔符太短,接收端会丢弃当前帧头的同步间隔段。此帧被丢弃。如果设置了LINEIER.HEIE位,则会产生中断。
  • 同步段错误(SFEF)
    在自动同步模式下,若同步场的偏差误差在LIN规范(14%)之外,或同步段测量期间发生溢出,导致分频器寄存器溢出时说明同步段错误。
    在非自动同步模式下,如果接收到的同步段不是0x55,则同步段错误,接收状态机立即重置,此帧被丢弃,LINESR.SFEF位置1。
  • 标识符校验错误(IDPEF)
    当ID被传输到BIDR寄存器后(正常检测到ID停止后),将进行奇偶校验。如果设置了LINCR2.IOPE位,在奇偶校验不匹配时,接收状态机立即重置。
  • 位错误
    在传输模式下,当从总线读回的值与发送的值不同时,会标记此错误。在同步间隔段段发送过程中不检查此错误。
    如果LINCR2.IOBE位置1,则在出现该错误后停止帧的发送。如果LINCR2.IOBE位置0,则在出现该错误后继续帧的发送。
    如果发送此错误,并LINIER.BEIE位置1,则会产生中断。
  • 帧错误
    如果在当前接收到的字符(同步段、ID段、数据段、校验和段)的停止位上采样一个显性(低)电平时,会标记此错误。LINFlexD丢弃当前帧并重置状态机。如果LINEIER.FEIE位置1,则会产生中断。导致帧错误的字节也会被转移到缓冲区,但在这种情况下,LINSR.DRF或LINSR.DBFF位不置1。
  • 校验和错误
    当硬件计算的校验和与接收的校验和不匹配时,会标记此错误。LINFlexD丢弃接收到的帧并重置状态机。如果LINEIER.CEIE位置1,则会产生中断。
  • 溢出错误
    一旦消息缓冲区已满(LINSR.RMB位置1),下一个有效的数据接收将导致缓存区溢出,消息将丢失。LINESR.BOF位置1标记溢出错误。哪条数据丢失取决于缓冲区锁定功能控制位LINCR1.RBLM。如果LINCR1.RBLM置0,缓冲区中的旧数据将被最近的数据覆盖。如果LINCR1.RBLM位置1,则丢弃最近的数据,保留之前的数据。在从模式下,如果在接收到下一个ID段之前没有释放缓存区 (LINSR.RMB位未清零),如果LINCR1.RBLM位置1,那么ID段和数据段一起被丢弃。
  • 超时错误
  • 冻结在低电平错误
    如果显性(低)电平持续100位后,则LINESR.SZF位置1标记此错误。
  • 噪声错误
    在接收过程中,每个位采样16次,通过取第8、9和10个采样的多数值得到该位的值。如果这三个采样值中的任何一个值与其它两个不同,则标记此错误。当在开始位中检测到噪声时,该错误也将将被标记。

1.7 标识符过滤

在LIN协议中,消息的标识符与节点的地址无关,而是与消息的内容相关。发送节点把信息广播给所有的接收节点。根据接收到的帧头,接收节点决定是否接收或发送响应(取决于标识符值)。如果消息与该节点无关,则应该将其丢弃。
为了满足这一需求,LINFlexD提供了可配置的过滤器,以消除软件的干预。这种硬件过滤节省了执行软件过滤所需的CPU资源。LINFlexD中最多有16个过滤器,用户只能在初始化模式下对其进行设置。为了激活过滤器,需要设置相应的IFER.FACT位。根据相应的IFMR.IFM位,每个标识符可能有两种模式。

  • 列表模式
    如果IFMR的第n位被清零,则过滤器编号2n和2n+1处于标识符列表模式。在这种模式下,可配置的传输/接收过滤器的最大数量为16,具体取决于IFER.FACT位。在这种模式下,接收到的标识符应该与IFCR2n或IFCR2n+1的ID字段逐位匹配(如果设置了相应的IFER.FACT位)

  • 掩码模式
    如果需要的过滤器数量大于16,那么过滤器应该配置为掩码模式。如果IFMR的第n位置1,则过滤器编号2n的为过滤器,编号为2n+1的为其充当掩码。在这种情况下,过滤器2n+1的IFER.FACT位不起作用。在这种模式下,如果设置了掩码的第x位,则接收到的标识符的第x位必须与过滤器的第x位匹配。

在任何模式下标识符与第m个过滤器相匹配,则硬件将m+1加载到IFMI寄存器中。没有匹配条件用IFMI=0表示。
匹配IFCRn.DFL后,BIDR.CCS和BIDR.DIR位由硬件从过滤器复制,从此时起,BIDR寄存器是只读的,直到帧结束。

  • 如果BIDR.DIR位置1,那么如果LINIER.HRIE位置1,则会生成一个TXI中断。在这种情况下,软件使用IFMI寄存器将相关数据从RAM区传输到BDR,完成传输后将LINCR2.DTRQ位置1开始发送。
  • 如果BIDR.DIR位置0,那么当接收到校验和且校验和正确时,如果LINIER.DRIE位置1,将生成RXI中断。

在没有滤波器匹配(IFMI=0)的情况下,如果LINCR1.BF位置1,则生成接收中断,由软件负责配置BIDR并开始传输(通过加载BDR缓冲器并将LINCR2.DTRQ位置1)或放弃接收(通过将LINCR3.DDRQ位1)。如果LINCR1.BF位置0,则丢弃接收到的标识符并转到空闲状态以等待新的帧。

如果一个标识符与两个过滤器(一个在列表模式中,另一个在掩码模式中)匹配,则列表模式优先于掩码模式。在掩码模式下,如果两个过滤器与标识符匹配,则具有较低数字的过滤器优先。

1.8 波特率设置

LIN波特率编程在两个寄存器中:LIN波特率寄存器(整数部分)和LIN波特率寄存器(分数部分)。波特率寄存器只能在初始化模式下编程。波特率的计算公式如下:

1.9 自同步

如果需要根据LIN同步段的测量值自动调整波特率,需要先在LINIBRR和LINFBRR寄存器中像征性的设置波特率,然后将
LINCR1.LASE位置1,以实现自动同步。
当启用自动同步时,在每次接收完同步间隔段间隔符之后,在LIN_CLK上采样同步段上的五个下降沿之间的持续时间。

1.10 唤醒管理

处于休眠状态的LIN网络中的任何节点都可以发送唤醒请求。唤醒请求为使总线处于显性(低)电平250微秒到5毫秒。每个从节点应该检测唤醒请求(一个长于150 μ s的显性(低)电平),并准备在100 毫秒接收总线命令,100毫秒从显性(低)电平的结束边缘(上升沿)开始计算。在检测到唤醒请求时,主机节点也会被唤醒,当从机节点准备好时,开始发送帧头以查找被唤醒的原因。如果主机节点在从唤醒请求开始的150毫秒内没有发出帧头,那么发出唤醒请求的节点可以尝试发出新的唤醒请求。在LINFlexD中,可以通过在BDR0中写入唤醒字符并在将LINCR2.WURQ位置1来生成唤醒请求。LINCR2.WURQ位置1后,BDR0中的字符将被发送出去。对于LIN 2.0,字符0xF0作为唤醒字符发送。

  • 在休眠模式下,当LINCR1.AUTOWU=1并检测到唤醒请求时,硬件会清零LINCR1.SLEEP位,LINESR.WUF标志置1,如果LINIER.WUIE位置1则会产生中断。LINFlexD现在进入正常模式并准备接收帧。
  • 在休眠模式下,当LINCR1.AUTOWU=0并检测到唤醒请求时,LINESR.WUF标志置1,如果LINIER.WUIE位置1则会产生中断。然后由软件来清零LINCR1.SLEEP位。

2.UART模式

2.1 帧格式

  • 8位数据的帧
  • 9位数据的帧
  • 16位数据的帧
  • 17位数据的帧
  • 13位数据的帧

2.2 数据缓存区

在UART模式下,8字节数据缓冲区分为两部分:接收缓冲区和发送缓冲区,如下图所示:

对于发送16位帧,低8位写入BDR0,高8位写入BDR1。
对于接收16位帧,低8位BDR4接收,高8位BDR5接收。

2.3 数据发送

为了在UART模式下启动发送,应将UARTCR.UART位置1并将UARTCR.TxEn位置1。当编写BDR0时开始发送,并持续到发送的字节/半字数等于UARTCR.TDFL位中的值。
发送缓冲区是四个字节(当UARTCR.WL1=0时)或两个半字(当UARTCR.WL1=1时),因此最多可以触发四个字节(两个半字)发送。一旦发送了设置的字节数(半字),则UARTSR.DTF标志置1。如果UART.TxEn位在发送过程中被清零,那么当前发送完成后,不能进行下一步的发送。
通过将控制位UARTCR.TFBM置1,可以将缓冲区配置为FIFO模式(当启用DMA Tx时必须使用)。
如果UARTSR.DTFTFF位置1,发送FIFO已满,继续对FIFO进行写操作,可能会导致发送数据错误。

2.4 数据接收

当用户退出初始化模式,UARTCT.RxEn位置1并检测起始位时,就开始接收数据。有一个专用的4字节(如果UARTCR.WL1=0)或2个半字(如果UARTCR.WL1=1)数据缓冲区用于接收数据。一旦接收到设置的字节数(UARTCR.RDFL位),UARTSR.DRF标志置1,并完成当前的接收。
通过将控制位UARTCR.RFBM置1,可以将缓冲区配置为FIFO模式(当启用DMA Rx时必须使用)。

  • 如果用户事先不知道要接收多少字节数据,就不应该事先设置UARTCT.RDFL。UARTCT.RDFL应置0,以确保接收中断将一个字节一个字节地发生。在每次字节接收后,状态机将转移到空闲状态。
    如果UARTCT.RDFL被编程为某个值,但没有接收到这个字节数,那么接收将挂起。在这种情况下,软件需要通过查看标志来处理超时。软件必须设置LINCR1.SLEEP位以转移到空闲状态。
  • 如果停止请求在接收过程中到达,则只有在接收到所有设置的字节数后才会被响应,停止请求不是立即响应。如果没有接收到所设置的字节数,那么必须注意超时。当状态机转移到空闲状态时,只响应一个停止请求。
  • 如果在接收任何字节时发生奇偶校验错误,则相应的UARTSR.PE位被置1,但不会产生中断。如果帧错误发生在任何字节(设置了UARTSR中的FE位),那么如果设置了LINIER中的FEIE位,则会产生一个中断。由于只有一个寄存器位用于帧错误,这个中断将有助于识别哪个字节有帧错误。
  • 如果在接收任何字节时发生奇偶校验错误,则在UARTSR中设置相应的PEx位。在这种情况下不会产生中断。
  • 如果帧错误发生在任何字节(UARTSR.FEF位置1),那么如果LINIER.FEIE位置1,则会产生一个中断。由于只有一个寄存器位用于帧错误,这个中断将有助于识别哪个字节有帧错误。

3.中断

LINFlexD模块可以根据LINESR中断使能寄存器来使能中断,但是可以触发的中断源只有三个,分别为:

  • Error
  • Rx
  • Tx

各个标志所触发的中断如下表所示:

特别注意HRF标志触发的Tx中断,此中断是在使能ID过滤器,并且接收到的帧头中的ID与过滤器中发送发现的ID匹配时才会触发此中断。

四、例程分析

1.LIN

程序需要实现的功能:

  • 实现主机向从机写数据功能。
  • 实现主机从从机读数据功能。

程序设计要求:

  • 主机接收、从机接收发送使用中断。
  • 实现查询ID与ID过滤器两种通信方式。
#include "derivative.h"extern void xcptn_xmpl(void);
uint8_t RxBuffer1[8] = {0};//00 11
uint8_t RxBuffer2[8] = {0};//88 99
uint8_t RxBuffer3[8] = {0};//00 01
uint8_t RxBuffer4[8] = {0};//08 09
uint8_t over1,over2,over3 = 0;
int main(void)
{xcptn_xmpl ();MC_ME.RUN_PC[0].R=0x00000000;MC_ME.RUN_PC[1].R=0x000000FE;MC_ME.PCTL204.B.RUN_CFG = 0x1;MC_ME.PCTL91.B.RUN_CFG = 0x1;MC_CGM.SC_DC0.B.DIV=3;//系统时钟分频器分频系数为3,PBRIDGEn_CLK的频率为系统时钟频率的(3+1)=4分之一MC_CGM.SC_DC0.B.DE=1;//使能系统时钟分频器MC_CGM.AC3_SC.B.SELCTL=0;//选择IRCOSC作为 PLL0的输入MC_CGM.AC4_SC.B.SELCTL=1;//选择XOSC作为 PLL1的输入//PLL0输入为IRCOSC的16MHz时钟,将PHI配置为160MHz,PHI1配置为40MHz//fPLL0_PHI=fPLL0_ref*PLL0DV[MFD]/(PLL0DV[PREDIV]*PLL0DV[RFDPHI])=16MHz*20/(1*2)=160MHz//fPLL0_PHI1=fPLL0_ref*PLL0DV[MFD]/(PLL0DV[PREDIV]*PLL0DV[RFDPHI1])=16MHz*20/(1*8)=40MHzPLLDIG.PLL0DV.B.RFDPHI1=8;PLLDIG.PLL0DV.B.RFDPHI=2;PLLDIG.PLL0DV.B.PREDIV=1;PLLDIG.PLL0DV.B.MFD=20;//PLL1输入为XOSC的40MHz时钟,将PHI配置为160MHz//fPLL1_PHI=fPLL1_ref*(PLL1DV[MFD]+PLL1FD[FRCDIV]/2^12)/(2*PLL1DV[RFDPHI]))=40MHz*(16+0)/(2*2)=160MHzPLLDIG.PLL1DV.B.RFDPHI=2;PLLDIG.PLL1DV.B.MFD=16;MC_ME.DRUN_MC.R=0x001300F2;//FLAON=11Flash正常工作模式,PLL1ON=1PLL1打开,PLL0ON=1PLL0打开,XOSCON=1XOSCON打开,IRCON=1IRCON打开,SYSCLK=primary PLL(PLL0_PHI)系统时钟选择PLL0_PHIMC_ME.MCTL.R=0x30005AF0;//调整至DRUN模式,输入两次KEYMC_ME.MCTL.R=0x3000A50F;while(MC_ME.GS.B.S_MTRANS==1);//等待模式转换完成SIUL2.MSCR[18].B.SSS = 1;//设置PB2为LIN0_TXDSIUL2.MSCR[18].B.OBE = 1;//使能输出SIUL2.MSCR[18].B.SRC = 3;//全强度驱动SIUL2.MSCR[23].B.IBE = 1;//使能输入SIUL2.IMCR[165].B.SSS = 2;//设置PB7为LIN0_RXD//设置LINFlexD_0为主机LINFlexD_0.LINCR1.B.INIT = 1;//进入初始化模式LINFlexD_0.LINCR1.B.SLEEP = 0;//退出休眠模式while(LINFlexD_0.LINSR.B.LINS != 1);//等待进入初始化模式LINFlexD_0.LINCR1.B.MBL = 3;//同步间隔段长度设置为13位LINFlexD_0.LINCR1.B.MME = 1;//主模式//配置波特率为9600//80000000/9600/16=520.833//0.833*16=13.328LINFlexD_0.LINIBRR.R = 520;LINFlexD_0.LINFBRR.R = 13;LINFlexD_0.LINCR1.B.INIT = 0;//退出初始化模式while(LINFlexD_0.LINSR.B.LINS == 1);INTC_0.PSR[376].B.PRC_SELN0=1;//允许LINFlexD_0接收中断INTC_0.PSR[376].B.PRIN=9;//优先级为9INTC_0.PSR[377].B.PRC_SELN0=1;//允许LINFlexD_0发送中断INTC_0.PSR[377].B.PRIN=10;//优先级为10SIUL2.MSCR[94].B.SSS = 1;//设置PF14为LIN1_TXDSIUL2.MSCR[94].B.OBE = 1;//使能输出SIUL2.MSCR[94].B.SRC = 3;//全强度驱动SIUL2.MSCR[29].B.IBE = 1;//使能输入SIUL2.IMCR[166].B.SSS = 1;//设置PB13为LIN1_RXD//设置LINFlexD_1为从机LINFlexD_1.LINCR1.B.INIT = 1;//进入初始化模式LINFlexD_1.LINCR1.B.SLEEP = 0;//退出休眠模式while(LINFlexD_1.LINSR.B.LINS != 1);//等待进入初始化模式LINFlexD_1.LINCR1.B.MBL = 3;//同步间隔段长度设置为13位LINFlexD_1.LINCR1.B.MME = 0;//从模式//配置波特率为9600//80000000/9600/16=520.833//0.833*16=13.328LINFlexD_1.LINIBRR.R = 520;LINFlexD_1.LINFBRR.R = 13;LINFlexD_1.IFER.B.FACT = 0x3;//使能滤波器0,1LINFlexD_1.IFMI.B.IFMI = 0x0;//滤波器0,1为列表模式LINFlexD_1.IFCR[0].B.DFL = 7;//数据段长度为8字节LINFlexD_1.IFCR[0].B.DIR = 0;//接收数据LINFlexD_1.IFCR[0].B.CCS = 0;//增强校验和LINFlexD_1.IFCR[0].B.ID = 0x36;LINFlexD_1.IFCR[1].B.DFL = 7;//数据段长度为8字节LINFlexD_1.IFCR[1].B.DIR = 1;//发送数据LINFlexD_1.IFCR[1].B.CCS = 0;//增强校验和LINFlexD_1.IFCR[1].B.ID = 0x16;LINFlexD_1.LINCR1.B.INIT = 0;//退出初始化模式while(LINFlexD_1.LINSR.B.LINS == 1);INTC_0.PSR[380].B.PRC_SELN0=1;//允许LINFlexD_1接收中断INTC_0.PSR[380].B.PRIN=9;//优先级为11INTC_0.PSR[381].B.PRC_SELN0=1;//允许LINFlexD_1发送中断INTC_0.PSR[381].B.PRIN=10;//优先级为12LINFlexD_0.LINIER.B.DRIE = 1;//LINFlexD_0使能接收完成中断LINFlexD_0.LINIER.B.DTIE = 1;//LINFlexD_0使能发送完成中断LINFlexD_0.LINIER.B.HRIE = 0;//LINFlexD_0不使能帧头接收完成中断LINFlexD_1.LINIER.B.DRIE = 1;//LINFlexD_1使能接收完成中断LINFlexD_1.LINIER.B.DTIE = 1;//LINFlexD_1使能发送完成中断LINFlexD_1.LINIER.B.HRIE = 1;//LINFlexD_1使能帧头接收完成中断LINFlexD_0.BDRL.B.DATA0 = 0x00;LINFlexD_0.BDRL.B.DATA1 = 0x11;LINFlexD_0.BDRL.B.DATA2 = 0x22;LINFlexD_0.BDRL.B.DATA3 = 0x33;LINFlexD_0.BDRM.B.DATA4 = 0x44;LINFlexD_0.BDRM.B.DATA5 = 0x55;LINFlexD_0.BDRM.B.DATA6 = 0x66;LINFlexD_0.BDRM.B.DATA7 = 0x77;LINFlexD_0.BIDR.B.DFL = 7;//数据段长度为8LINFlexD_0.BIDR.B.DIR = 1;//发送LINFlexD_0.BIDR.B.CCS = 0;//增强校验和LINFlexD_0.BIDR.B.ID = 0x35;//ID为0x35LINFlexD_0.LINCR2.B.HTRQ = 1;//主机开始发送while(over1 == 0);//等待第一次通信完成LINFlexD_0.BIDR.B.DFL = 7;//数据段长度为8LINFlexD_0.BIDR.B.DIR = 0;//接收LINFlexD_0.BIDR.B.CCS = 0;//增强校验和LINFlexD_0.BIDR.B.ID = 0x15;//ID为0x15LINFlexD_0.LINCR2.B.HTRQ = 1;//主机发送帧头while(over2 == 0);//等待第二次通信完成LINFlexD_0.BDRL.B.DATA0 = 0x00;LINFlexD_0.BDRL.B.DATA1 = 0x01;LINFlexD_0.BDRL.B.DATA2 = 0x02;LINFlexD_0.BDRL.B.DATA3 = 0x03;LINFlexD_0.BDRM.B.DATA4 = 0x04;LINFlexD_0.BDRM.B.DATA5 = 0x05;LINFlexD_0.BDRM.B.DATA6 = 0x06;LINFlexD_0.BDRM.B.DATA7 = 0x07;LINFlexD_0.BIDR.B.DFL = 7;//数据段长度为8LINFlexD_0.BIDR.B.DIR = 1;//发送LINFlexD_0.BIDR.B.CCS = 0;//增强校验和LINFlexD_0.BIDR.B.ID = 0x36;//ID为0x36LINFlexD_0.LINCR2.B.HTRQ = 1;//主机开始发送while(over3 == 0);//等待第三次通信完成LINFlexD_0.BIDR.B.DFL = 7;//数据段长度为8LINFlexD_0.BIDR.B.DIR = 0;//接收LINFlexD_0.BIDR.B.CCS = 0;//增强校验和LINFlexD_0.BIDR.B.ID = 0x16;//ID为0x16LINFlexD_0.LINCR2.B.HTRQ = 1;//主机发送帧头for(;;);
}void LIN0_RXI(void)
{uint8_t i;if(LINFlexD_0.LINSR.B.DRF == 1)//根据状态寄存器判断中断源{LINFlexD_0.LINSR.R &= 0x0004;//清除接收完成标志if(LINFlexD_0.BIDR.B.ID == 0x15)//判断ID,ID为0x15则数据段为为从机发送,主机接收{for (i=0; i<4;i++)//读取低4个字节{RxBuffer2[i]= (LINFlexD_0.BDRL.R>>(i*8));}for (i=4; i<8;i++)//读取高4个字节{RxBuffer2[i]= (LINFlexD_0.BDRM.R>>((i-4)*8));}over2 = 1;//接收完成后第二次通信完成}if(LINFlexD_0.BIDR.B.ID == 0x16)//判断ID,ID为0x16则数据段为为从机发送,主机接收{for (i=0; i<4;i++)//读取低4个字节{RxBuffer4[i]= (LINFlexD_0.BDRL.R>>(i*8));}for (i=4; i<8;i++)//读取高4个字节{RxBuffer4[i]= (LINFlexD_0.BDRM.R>>((i-4)*8));}//over2 = 1;//接收完成后第二次通信完成}LINFlexD_0.LINSR.R &= 0x0200;//清释放数据缓冲区}if(LINFlexD_0.LINSR.B.HRF == 1)//根据状态寄存器判断中断源{LINFlexD_0.LINSR.R &= 0x0001;//清除帧头接收完成标志}
}
void LIN0_TXI(void)
{LINFlexD_0.LINSR.R &= 0x0002;//清除发送完成标志
}
void LIN1_RXI(void)
{uint8_t i;if(LINFlexD_1.LINSR.B.DRF == 1)//根据状态寄存器判断中断源{LINFlexD_1.LINSR.R &= 0x0004;//清除接收完成标志if(LINFlexD_1.BIDR.B.ID == 0x35)//判断ID,ID为0x35则数据段为为主机发送,从机接收{for (i=0; i<4;i++)//读取低4个字节{RxBuffer1[i]= (LINFlexD_1.BDRL.R>>(i*8));}for (i=4; i<8;i++)//读取高4个字节{RxBuffer1[i]= (LINFlexD_1.BDRM.R>>((i-4)*8));}over1 = 1;//接收完成后第一次通信完成}if(LINFlexD_1.IFMI.B.IFMI == 1)//匹配到滤波器0{for (i=0; i<4;i++)//读取低4个字节{RxBuffer3[i]= (LINFlexD_1.BDRL.R>>(i*8));}for (i=4; i<8;i++)//读取高4个字节{RxBuffer3[i]= (LINFlexD_1.BDRM.R>>((i-4)*8));}over3 = 1;//接收完成后第三次通信完成}LINFlexD_1.LINSR.R &= 0x0200;//清释放数据缓冲区}if(LINFlexD_1.LINSR.B.HRF == 1)//根据状态寄存器判断中断源{if(LINFlexD_1.BIDR.B.ID == 0x15)//判断ID,ID为0x15则数据段为为从机发送,主机接收{//在收到帧头并且ID位0x15后,从机需要发送数据段LINFlexD_1.BDRL.B.DATA0 = 0x88;LINFlexD_1.BDRL.B.DATA1 = 0x99;LINFlexD_1.BDRL.B.DATA2 = 0xAA;LINFlexD_1.BDRL.B.DATA3 = 0xBB;LINFlexD_1.BDRM.B.DATA4 = 0xCC;LINFlexD_1.BDRM.B.DATA5 = 0xDD;LINFlexD_1.BDRM.B.DATA6 = 0xEE;LINFlexD_1.BDRM.B.DATA7 = 0xFF;LINFlexD_1.BIDR.B.DFL = 7;//数据段长度为8LINFlexD_1.BIDR.B.DIR = 1;//发送LINFlexD_1.BIDR.B.CCS = 0;//增强校验和LINFlexD_1.LINCR2.B.DTRQ = 1;LINFlexD_1.LINSR.R &= 0x0001;//清除帧头接收完成标志}if(LINFlexD_1.BIDR.B.ID == 0x35)//判断ID,ID为0x35则数据段为为主机发送,从机接收{//在收到ID为0x35的帧头后,从机需要设置BIDR以准备接收数据LINFlexD_1.LINSR.R &= 0x0001;//清除帧头接收完成标志LINFlexD_1.BIDR.B.DFL = 7;//数据段长度为8LINFlexD_1.BIDR.B.DIR = 0;//接收LINFlexD_1.BIDR.B.CCS = 0;//增强校验和}}
}
void LIN1_TXI(void)
{if(LINFlexD_1.LINSR.B.HRF == 1){if(LINFlexD_1.IFMI.B.IFMI == 2)//匹配到滤波器1{//在收到帧头并且ID位0x16后,从机需要发送数据段LINFlexD_1.BDRL.B.DATA0 = 0x08;LINFlexD_1.BDRL.B.DATA1 = 0x09;LINFlexD_1.BDRL.B.DATA2 = 0x0A;LINFlexD_1.BDRL.B.DATA3 = 0x0B;LINFlexD_1.BDRM.B.DATA4 = 0x0C;LINFlexD_1.BDRM.B.DATA5 = 0x0D;LINFlexD_1.BDRM.B.DATA6 = 0x0E;LINFlexD_1.BDRM.B.DATA7 = 0x0F;LINFlexD_1.LINCR2.B.DTRQ = 1;LINFlexD_1.LINSR.R &= 0x0001;//清除帧头接收完成标志}}if(LINFlexD_1.LINSR.B.DTF == 1){LINFlexD_1.LINSR.R &= 0x0002;//清除发送完成标志}
}
  • 第4~7行:保存四次通信接收到的数据。第一次通信为主机向从机发送数据,采用查询ID法;第二次通信为主机从从机读取数据,采用查询ID法;第三次为主机向从机发送数据,从机使用ID过滤器 ;第四次为主机从从机读取数据,从机使用ID过滤器。
  • 第8行:三次通信完成标志,以便开始标识下一次通信开始时间。
  • 第11~41行:系统初始化,设定系统时钟为160MHz。
  • 第43~48行:设定LIN0_TX引脚为PB2,LIN0_RX引脚为PB7。
  • 第51~53行:进入初始化模式。
  • 第55~56行:设置同步见那个段长度为13位,并将LINFlexD_0设为主模式。
  • 第61~62行:设置波特率为9600。
  • 第64~65行:退出初始化模式。
  • 第67~71行:在中断系统中打开LINFlexD_0的收发中断,并设置中断优先级。
  • 第73~78行:设定LIN01_TX引脚为PF14,LIN1_RX引脚为PB13。
  • 第81~83行:进入初始化模式。
  • 第85~86行:设置同步见那个段长度为13位,并将LINFlexD_0设为从模式。
  • 第91~92行:设置波特率为9600。
  • 第94行:使能ID过滤器0,1。
  • 第95行:将过滤0,1设置为列表模式。
  • 第96~99行:设置过滤器0为:数据段长8个字节,接收数据,使用增强校验和,ID为0x16。
  • 第101~104行:设置过滤器1为:数据段长8个字节,发送数据,使用增强校验和,ID为0x36。
  • 第106~107行:退出初始化模式。
  • 第109~113行:在中断系统中打开LINFlexD_1的收发中断,并设置中断优先级。
  • 第115~117行:使能LINFlexD_0的接收完成与发送完成中断。
  • 第118~120行:使能LINFlexD_1的接收完成、发送完成、接收帧头完成中断。
  • 第122~134行:进行第一次通信。第一次通信为主机向从机发送数据,准备好主机需要向从机发送的8个字节的数据,ID为0x35,这不在之前设置的ID过滤器中,表明从机需要使用查询法接收数据。
  • 第136行:等待第一次通信完成,及从机接收数据后进行下一次通信。
  • 第138~142行:进行第二次通信。第二次通信为从从机读取数据,主机只需发送帧头。ID为0x15,这不在之前设置的ID过滤器中,表明从机需要使用查询法发送数据。
  • 第144行:等待第二次通信完成,及主机接收完毕从机发送的数据后进行下一次通信。
  • 第146~158行:进行第三次通信。第三次通信为主机向从机发送数据,准备好主机需要向从机发送的8个字节的数据,ID为0x36,这在之前设置的ID过滤器中,表明从机可以使用ID过滤器接收数据。
  • 第160行:等待第三次通信完成,及从机接收数据后进行下一次通信。
  • 第162~166行:进行第二次通信。第二次通信为从从机读取数据,主机只需发送帧头。ID为0x16,这在之前设置的ID过滤器中,表明从机可以使用ID过滤器发送数据。
  • 第171~207行:LINFlexD_0接收中断函数。当LINFlexD_0完成接收数据、完成接收帧头后都会触发此中断函数,所以需要根据LINSR状态寄存器判断中断源。由于主机未使用过滤器,所以根据查询到的ID将接收的数据放入对应的缓存区中。
  • 第203~206行:LINFlexD_0发送中断函数,由于LINFlexD_0并未使能发送完成中断,所以该函数并不会执行。
  • 第212~273行:LINFlexD_1接收中断函数。当LINFlexD_1完成接收数据、完成接收帧头后都会触发此中断函数,所以需要根据LINSR状态寄存器判断中断源。
  • 第219~230行:使用查询法接收数据。
  • 第231~243行:使用ID过滤器接收数据,IFMI寄存器 会标记是哪个过滤器的ID与接收到的帧头匹配。
  • 第247~263行:当ID为0x15时,从机需要向主机发送数据。在接收到主机发送的帧头后发送数据段,发送数据的流程与主机发送数据时相同。
  • 第264~270行:当ID为0x35时,从机从主机接收数据,在接收到帧头后需要通过设置BIDR寄存器准备好接收数据。设置完毕BIDR后,从机才能正常接收主机发送的数据并在将数据全部接收后再次触发接收完毕中断。
  • 第274~298行:LINFlexD_1发送中断函数。当LINFlexD_1发送数据完毕,或者当接收到的ID与数据方向为发送的过滤器匹配时,都会触发该中断,所以需要根据LINSR状态寄存器判断中断源。
  • 第279~293行:使用过滤器发送数据时,不需要再次设置BIDR寄存器。
  • 第294~297行:清除发送完成状态标志。
  • 同时,需要在intc_SW_mode_isr_vectors_MPC5744P.c文件中声明中断函数并注册。

2.UART

程序需要实现的功能:

  • 接收到上位机发出的数据后再次发出。

程序设计要求:

  • 使用中断实现数据收发。
  • 接收与发送使用队列完成。
#include "derivative.h"extern void xcptn_xmpl(void);//i指向队尾的下一个存储空间,及指向下一个数据接收后存放的地址
//j指向队头,及指向下一个需要发送的数据
int i,j = 0;
//长度为10的队列
int buf[10];int main(void)
{   xcptn_xmpl ();MC_ME.RUN_PC[0].R=0x00000000;MC_ME.RUN_PC[1].R=0x000000FE;MC_ME.PCTL204.B.RUN_CFG = 0x1;MC_CGM.SC_DC0.B.DIV=3;//系统时钟分频器分频系数为3,PBRIDGEn_CLK的频率为系统时钟频率的(3+1)=4分之一MC_CGM.SC_DC0.B.DE=1;//使能系统时钟分频器MC_CGM.AC3_SC.B.SELCTL=0;//选择IRCOSC作为 PLL0的输入MC_CGM.AC4_SC.B.SELCTL=1;//选择XOSC作为 PLL1的输入//PLL0输入为IRCOSC的16MHz时钟,将PHI配置为160MHz,PHI1配置为40MHz//fPLL0_PHI=fPLL0_ref*PLL0DV[MFD]/(PLL0DV[PREDIV]*PLL0DV[RFDPHI])=16MHz*20/(1*2)=160MHz//fPLL0_PHI1=fPLL0_ref*PLL0DV[MFD]/(PLL0DV[PREDIV]*PLL0DV[RFDPHI1])=16MHz*20/(1*8)=40MHzPLLDIG.PLL0DV.B.RFDPHI1=8;PLLDIG.PLL0DV.B.RFDPHI=2;PLLDIG.PLL0DV.B.PREDIV=1;PLLDIG.PLL0DV.B.MFD=20;//PLL1输入为XOSC的40MHz时钟,将PHI配置为160MHz//fPLL1_PHI=fPLL1_ref*(PLL1DV[MFD]+PLL1FD[FRCDIV]/2^12)/(2*PLL1DV[RFDPHI]))=40MHz*(16+0)/(2*2)=160MHzPLLDIG.PLL1DV.B.RFDPHI=2;PLLDIG.PLL1DV.B.MFD=16;MC_ME.DRUN_MC.R=0x001300F2;//FLAON=11Flash正常工作模式,PLL1ON=1PLL1打开,PLL0ON=1PLL0打开,XOSCON=1XOSCON打开,IRCON=1IRCON打开,SYSCLK=primary PLL(PLL0_PHI)系统时钟选择PLL0_PHIMC_ME.MCTL.R=0x30005AF0;//调整至DRUN模式,输入两次KEYMC_ME.MCTL.R=0x3000A50F;while(MC_ME.GS.B.S_MTRANS==1);//等待模式转换完成LINFlexD_0.LINCR1.B.INIT = 1;//进入初始化模式LINFlexD_0.LINCR1.B.SLEEP = 0;//退出休眠模式while(LINFlexD_0.LINSR.B.LINS != 1);//等待进入初始化模式LINFlexD_0.UARTCR.B.UART = 1;//将模块配置为UART模式LINFlexD_0.UARTCR.B.RxEn = 1;//使能接收LINFlexD_0.UARTCR.B.TxEn = 1;//使能发送LINFlexD_0.UARTCR.B.WL0 = 1;//8位数据,无校验位LINFlexD_0.UARTSR.R = 0xFF;//清除所有状态标志//配置波特率为9600//80000000/9600/16=520.833//0.833*16=13.328LINFlexD_0.LINIBRR.R = 520;LINFlexD_0.LINFBRR.R = 13;LINFlexD_0.LINCR1.B.INIT = 0;//退出初始化模式while(LINFlexD_0.LINSR.B.LINS == 1);SIUL2.MSCR[18].B.SSS = 1;//设置PB2为TXDSIUL2.MSCR[18].B.OBE = 1;//使能输出SIUL2.MSCR[18].B.SRC = 3;//全强度驱动SIUL2.MSCR[19].B.IBE = 1;//使能输入SIUL2.IMCR[165].B.SSS = 1;//设置PB3为RXDLINFlexD_0.LINIER.B.DRIE = 1;//使能接收完成中断LINFlexD_0.LINIER.B.DTIE = 0;//不使能发送完成中断INTC_0.PSR[376].B.PRC_SELN0=1;//允许接收中断INTC_0.PSR[376].B.PRIN=9;//优先级为9INTC_0.PSR[377].B.PRC_SELN0=1;//允许发送中断INTC_0.PSR[377].B.PRIN=10;//优先级为10for(;;);
}//接收中断函数
void LIN0_RXI(void)
{LINFlexD_0.UARTSR.R &= 0x0004;//清除接收完成标志buf[i] = LINFlexD_0.BDRM.B.DATA4;//将接收到的数据放入队列if(i == 9){i = 0;}else{i ++;}if(LINFlexD_0.LINIER.B.DTIE == 0){LINFlexD_0.BDRL.B.DATA0 = buf[j];//接收到第一个字节的数据后发送一个字节LINFlexD_0.LINIER.B.DTIE = 1;//使能发送完成中断if(j == 9){j = 0;}else{j ++;}}
}//发送完成中断函数
void LIN0_TXI(void)
{LINFlexD_0.UARTSR.R &= 0x0002;//清除发送完成标志if(i != j){LINFlexD_0.BDRL.B.DATA0 = buf[j];//从队列发送数据if(j == 9){j = 0;}else{j ++;}}else{LINFlexD_0.LINIER.B.DTIE = 0;//队列清空后关闭发送完成中断}
}
  • 第13行:新建工程时自动生成代码。
  • 第15~42行:系统初始化,时钟配置。
  • 第44行:进入初始化模式,以初始化模块。
  • 第45行:退出休眠模式。
  • 第49行:将模块配置为UART模式。必须先配置此位。
  • 第50~51行:使能收发。
  • 第52行:将UART数据格式配置为8位数据位,无校验位。
  • 第54行:清除所有标志位。
  • 第59~60行:设置波特率。系统时钟频率为160MHz,则波特率生成时钟为其频率的一半,及80MHz.需要将波特率配置为9600,80000000/9600/16=520.833。所以波特率设置寄存器中整数部分及为520。0.833*16=13.328,所以波特率设置寄存器分数部分及为13。
  • 第62~63行:初始化完毕后,退出初始化模式。
  • 第65~70行:将TXD引脚映射为PB2,将RXD引脚映射为PB3。
  • 第72~73行:使能接收完成中断,禁用发送完成中断。
  • 第75~79行:在中断系统中允许收发中断,并设置优先级。
  • 第86行:清除接收完成标志。
  • 第87行:将接收到的数据存入队列。
  • 第88~95:队尾指针加1,指向下一次接收到的数据存放的地址。
  • 第96~108:收到数据后查看发送是否开始,若发送未开始,则发送数据,并开启发送完成中断。
  • 第114行:清除发送完成标志。
  • 第115~130行:判断队列是否已经清空,若没有清空则继续发送数据,若队列已经清空,则关闭发送完成中断。
  • 同时,需要在intc_SW_mode_isr_vectors_MPC5744P.c文件中声明中断函数并注册。

MPC5744-LINFlexD相关推荐

  1. NXP MPC574x LinFlexd配置和DMA配置

    概述 Lin总线在汽车电子中使用非常广泛,下面简单介绍一下NXP MPC574X系列PowerPC的Lin总线配置.由于Lin总线的通信速率比较低,所以一般在实际开发中会使用DMA外设进行数据的搬运, ...

  2. VCU整车控制器主控芯片MPC5744,原理图+源代码

    VCU整车控制器主控芯片MPC5744,原理图+源代码. ID:451000645853340880tbNick_62hsp

  3. MPC5744 Data Flash 仿真 EEPROM

    一 .目的 本文主要是使用 MPC5744 中的 Data Flash 仿真 EEPROM .之前在 < MPC5744 烧录一直停留在 98% 的解决方法 > 中也简单介绍了 Flash ...

  4. MPC5744之时钟(1)

      MPC5744的系统和外设时钟Diagram如下: 给设备提供输入的时钟源有:PLL(0和1).外部振荡器.外部晶振和内部的16MHZ的RC振荡器 在配置时钟时,一定不要让时钟超过限制: PLL ...

  5. TC397 LIN Master 用例

    文章目录 LIN简介 单片机与LIN TC397 LIN USB-LIN分析仪 TC397 KIT LIN 工程示例 参考 LIN简介 LIN (Local Interconnect Network) ...

  6. 【MPC5744P】劳特巴赫调试器Trace32的使用方法

    对于大部分MCU来说,官方IDE一般都带有调试功能,配合JTAG接口使用即可,也支持变量查看.断点等功能.绝大多数工业开发的中小型程序,使用自带调试器即可,价格便宜,几十到几千不等. 在某些特殊领域( ...

  7. MPC5744-PIT

    目录 一.基本功能 二.寄存器介绍 1.PIT模块控制寄存器PIT_MCR 2.运行时间计数器PIT_LTMR64H.PIT_LTMR64L 3.定时器初值寄存器PIT_LDVALn(n=0,1,2, ...

  8. MPC5744P-DMA模块及SPI DMA发送

    1.MPC5744P 主从机模块 mpc5744含有z4d_0 core.z4d_0 core Nexus.DMA.SIPI.FlexRay五个主机模块和FLASH CTRL.PRAM CTRL.PB ...

  9. MPC5744P-PIT模块(周期中断定时器)

    1.功能描述 在周期中断定时器使能的情况下,定时器加载被LDVAL寄存器指定的计数初值,然后递减计数,当递减到0时自动重载LDVAL指定的计数初值并触发一次中断.中断的使能由TCTR寄存器TIE位控制 ...

  10. 这样开发PWM,保证你准时下班

    摘要 本篇笔记主要记录基于MBD模型设计的PWM输出步骤和方法.前期工具箱的安装不在本文档讨论范围内. 准备工作 安装好MPC5744基于模型的工具箱和支持包,这个可以在NXP官网下载 2,按照文档配 ...

最新文章

  1. pytorch使用gpu就是这么简单
  2. ELK报错expected block end, but found BlockMappingStart
  3. 在 VMware Clone Ubuntu Server 之后,解决网卡问题
  4. 如果用户希望将一台计算机,计算机网络试卷(有答案版)
  5. spring的controller是单例模式,但是是多线程,各个线程之间不影响
  6. 利用 apache ab 测试服务器性能
  7. 复述-简历-面试-常见问答整理
  8. labview dll 崩溃
  9. 老子《道德经》第三十七章
  10. Python学习之解释器的简单使用
  11. 在线问诊、找科室、找医生、查疾病、图文问诊、电话急诊、健康咨询、问诊平台、咨询平台、问诊服务、语音问诊、开药问诊、看病平台、在线医疗、健康平台、登录注册、信息架构图、全局说明、组件规范、需求清单、
  12. html的下拉刷新页面,html下拉刷新上拉加载Refresher3.0
  13. TensorFlow 学习(八)—— 梯度计算(gradient computation)
  14. [渝粤教育] 中国地质大学 现代控制理论 复习题 (2)
  15. codeigniter CI 框架 在helper 中 使用 全局变量 方法
  16. gitee怎么看用户名_怎么优雅的写博客 Typora + picGo
  17. 用简道云做一个可以账号密码登陆和找回密码并查询修改已填信息的公开表单
  18. Windows源码编译运行pgAdmin4
  19. 《SEM长尾搜索营销策略解密》一一2.4 长尾的主动与被动
  20. VC++连接wifi功能(有密码)源代码

热门文章

  1. 安卓手机wifi速度测试软件,手机WiFi网络测速专家
  2. PMP之工作绩效数据、信息和报告的区别
  3. 课后习题3.4 编程序,用getchar函数读入两个字符给c1,c2,然后分别用putchar函数和cout语句输出这两个字符。并思考以下问题: (1)变量c1,c2应定义为字符型还是整形?抑或两者皆
  4. Google Safe Browsing API的实施
  5. 我们软件开发常用的协作工具
  6. 餐馆点菜系统python程序_Python写一个自动点餐程序
  7. JavaScript数组扁平化
  8. 企业微信应用授权/静默登录
  9. Python也有对象了哈哈哈哈哈哈嗝
  10. 扔掉代码,程序员月薪达到了80000