TMS320F28P550SJ9学习笔记15:Lin通信SCI模式结构体寄存器

今日初步认识与配置使用Lin通信SCI模式,用结构体寄存器的方式编程

文章提供完整工程下载、测试效果图

我的单片机平台是这个:

LIN通信引脚:

 

LIN通信PIE中断:

这个  PIE Vector Table  表在手册111页:

这是提到LINa的PIE中断向量:

LIN通信的帧结构:

在LIN总线上及逆行传送的实体就是帧。

帧的发送时间是每个字节发送时间的总和,再加上响应间隙时间和字节间隙时间。

信号是在帧的数据场里面输送的。多个信号可以打包成一个帧,只要这些信号彼此之间不会相互重叠。但是他们要由机群里面的同一个节点写入。

帧可以携带1-8byte的数据。对拥有指定标识符的帧来说,其包含的字节的数量应与发布服务器和所有认购器保持一致。

帧槽

每个预定的帧会在总线上分配一个槽。槽的间隙时间必须足够长,以便能够在最糟的情况下装载帧。

帧的类型

LIN总线上数据传输包括四种不同的帧,分别为无条件帧、事件触发帧、偶发帧、诊断帧。

28P550 LIN模块的功能:

 手册3444页提到了LIN模块的功能:

  • 兼容LIN 1.3、2.0和2.1协议
  • 可配置的波特率高达20 kbps
  • 两个外部引脚:LINRX和LINTX
  • 多缓冲的接收和发送单元
  • 识别掩码的消息过滤
  • 自动命令头生成
    • 预同步场
    • 同步场
    • 标识符字段
  • 响应器自动同步
    • 同步中断检测
    • 可选的带宽限制
    • 可编程的同步场验证
  • 2st可编程发送速率,具有7位小数位
  • 从发送器唤醒的LIN主导电平
  • 自动唤醒支持
  • 可编程的唤醒信号上的唤醒时间
  • 自动总线空闲检测
  • 错误检测
    • 位错误
    • 总线错误
    • 无响应错误
    • 校验和错误
    • 同步场错误
    • 奇偶错误
  • 使用直接内存访问(DMA)进行发送和接收数据的能力
  • 2个具有优先级编码的接收时间
    • 接收
    • 传输
    • ID、错误和状态
  • 支持LIN 2.0校验和
  • 增强的有限状态机(FSM)支持帧处理
  • 增强的处理扩展帧的能力
  • 增强的波特率发生器
  • 更新唤醒/进入睡眠

28P550 LIN时钟、频率、波特率:

LIN VCLK基于SYSCLK频率。

VCLK来自SYSCLK输入

使用每个LIN模块的CLK_CFG_REGS perclkdivsel字段分别以1、2或4的比例进行分频。

默认情况下,VCLK输入是SYSCLK除以2。

任何节点的传输波特率由CPU在开始时配置;这定义了比特时间Tbit。比特时间是从波特率选择寄存器(BRSR)中的字段P和M派生出来的。BRSR寄存器中还有一个额外的3位分数分频值,即字段U,进一步微调数据字段的波特率。

BRSR寄存器中预分频值的范围是:

P=0,1,2,3,...,2^24-1 

M = 0,1,2,...,15 

U = 0,1,2,3,4,5,6,7 

BRSR寄存器中的P、M和U值是用户可编程的。

P和M分频器可用于SCI模式和LIN模式,以选择波特率。

U值是一个额外的3位值,用于确定“每个Tbit增加一个T VCLK”(=0,1),

如第29.3.1.4.2节所述。如果适应位被设置且LIN外设处于自适应波特率模式,则在接收头部时测量同步字段时,所有这些分频值都会自动获得。

LIN协议定义了波特率边界为:1 kHz≤FLINCLK≤20 kHz

所有传输的比特都在Tbit周期内移入和移出。

波特率、字节时间计算公式

 P、M

图片描述了SCI/LIN模块的波特率设置。该模块通过内部生成的串行时钟来确定波特率,该时钟由外设VCLK和BRS寄存器中的预分频器P和M决定。

SCI使用BRS寄存器中的24位整数预分频器P值来选择所需的波特率,而额外的4位小数分频器M则用于细化波特率选择。

在异步定时模式下,SCI根据以下公式生成波特率时钟:

SCICLK频率 = VCLK频率 / (P+1) + M/16

当P=0时,异步波特率值为:

异步波特率值 = VCLK频率 / 32

P、M、D

更微小的波特率变化:

波特率计算实例:

Baund = 115200 :

Baund = 9600 :

SCI/LIN interrupts:

LIN收发框图:

LIN通信寄存器:

Offset: 寄存器的偏移地址。        Acronym: 寄存器的缩写名称。

Register Name: 寄存器的全称。 Write Protection: 写保护,表示该寄存器是否受写保护。

Section: 寄存器所属的章节或类别。

偏移量缩写寄存器名称
0hSCIGCRO全局控制寄存器0
4hSCIGCR1全局控制寄存器1
8hSCIGCR2全局控制寄存器2
ChSCISETINT中断使能寄存器
10hSCICLEARINT中断禁用寄存器
14hSCISETINTLVL设置中断级别寄存器
18hSCICLEARINTLVL清除中断级别寄存器
1ChSCIFLR标志寄存器
20hSCIINTVECTO中断向量偏移寄存器0
24hSCIINTVECT1中断向量偏移寄存器1
28hSCIFORMAT长度控制寄存器
2ChBRSR波特率选择寄存器
30hSCIED仿真缓冲寄存器
34hSCIRD接收数据缓冲寄存器
38hSCITD发送数据缓冲寄存器
3ChSCIPIOO引脚控制寄存器0
44hSCIPIO2引脚控制寄存器2
60hLINCOMP比较寄存器
64hLINRDO接收数据寄存器0
68hLINRD1接收数据寄存器1
6ChLINMASK接受掩码寄存器
70hLINIDLIN ID寄存器
74hLINTDO发送数据寄存器0
78hLINTD1发送数据寄存器1
7ChMBRSR最大波特率选择寄存器
90hIODFTCTRLIODFT for LIN
EOhLIN_GLB_INT_ENLIN全局中断使能寄存器
E4hLIN_GLB_INT_FLGLIN全局中断标志寄存器
E8hLIN_GLB_INT_CLRLIN全局中断清除寄存器

BRSR寄存器:

波特率设定相关寄存器

    LinaRegs.BRSR.bit.M = 1;/* M : 代表SCI/LIN 4位分数分频器选择(M)* 这些位仅在LIN或SCI异步模式下起作用* 用于选择SCI/LIN模块的波特率,并且它们是波特率规范的分数部分* 可以通过P预分频器对波特率进行微调,每个P整数值有15个额外的中间值,从而提供更精细的波特率调整能力* */LinaRegs.BRSR.bit.SCI_LIN_PSH = 1;/* SCI_LIN_PSH :SCI/LIN预分频器P的高位选择* 用于选择SCI/LIN模块的24位整数预分频器* 在LIN模式和SCI兼容模式下有效* SCI/LIN模块使用24位整数预分频器P来选择超过16,700,000的波特率,而额外的4位分数预分频器M则用于进一步细化波特率的选择* */LinaRegs.BRSR.bit.SCI_LIN_PSL = 1;/*SCI_LIN_PSL :SCI/LIN预分频器P的低位选择* * */LinaRegs.BRSR.bit.U = 1;/* U : 代表超级分频器选择的上半部分(Upper part of the Superfractional Divider Selection)。*  “这些位是波特率规范的额外分数部分。”:说明这些位用于进一步细化波特率的分数部分* */

Lin通信寄存器初始化:

 手册3486页提到了LIN通信的配置

29.3.5 LIN 配置

以下列表详细描述了软件在配置LIN模式的数据传输或接收之前可以执行的配置步骤。只要SWnRST位被清除为0整个配置过程,寄存器的编程顺序并不重要。

• 通过设置RESET位(SCIGCR0.0)启用LIN。
• 在配置LIN之前,将SWnRST清除为0(SCIGCR1.7)。
• 通过设置RXFUNC和TXFUNC位启用LINRX和LINTX引脚。
• 通过编程LINMODE位选择LIN模式(SCIGCR1.6)。
• 通过编程CLOCK位选择指挥官或响应模式。
• 通过编程SCIGCR1选择所需的帧格式(校验和、奇偶校验、长度控制)。
• 通过编程MBUFMODE位选择多缓冲区模式(SCIGCR1.10)。
• 通过编程BRSR选择用于通信的波特率。
• 设置最大波特率,以用于通信,通过编程MBRSR。
• 设置CONT位,使LIN在仿真断点处不会停止,直到LIN当前接收或传输完成(此位仅在仿真环境中使用)。
• 如果需要,通过设置SCIGCR1.16的LOOPBACK位将发射机连接到接收机内部(此功能用于执行自检)。
• 选择接收器启用RXENA位(SCIGCR1.24),如果要接收数据。
• 选择传输启用TXENA位(SCIGCR1.25),如果要传输数据。
• 选择LINMASK寄存器中的RXIDMASK和TXIDMASK字段。
• 在配置LIN后,将SWnRST(SCIGCR1.7)设置为1。
• 接收或传输数据(见第29.3.1.9节、第29.3.5.1节和第29.3.5.2节)。

注意:如果设置了TXENA且释放了SWnRST,LIN会立即生成新的DMA请求,但不会生成新的传输中断请求。如果使用中断,则必须通过软件向传输缓冲区写入数据,然后将所选ID写入LINID寄存器,以启动第一次传输。

 这个例子只是我自己照着初始化写了一下,没验证能否用:

void Init_LINA()
{//uint32_t i;// 链接中断服务函数 与 初始化引脚EALLOW;PieVectTable.LINA_0_INT = &level0ISR;PieVectTable.LINA_1_INT = &level1ISR;EDIS;//重载 以启用 LIN模块LinaRegs.SCIGCR0.bit.RESET = 1;LinaRegs.SCIGCR1.bit.SWnRST = 0;//选择LIN通信 使能LinaRegs.SCIGCR1.bit.LINMODE = 1;//LinaRegs.SCIGCR1.bit.LOOPBACK=1; //数据回环模式//使能收发LinaRegs.SCIGCR1.bit.RXENA = 1;LinaRegs.SCIGCR1.bit.TXENA = 1;//引脚控制寄存器LinaRegs.SCIPIO0.bit.RXFUNC = 1;LinaRegs.SCIPIO0.bit.TXFUNC = 1;//SCI兼容模式引脚LinaRegs.SCIPIO2.bit.RXIN = 1;LinaRegs.SCIPIO2.bit.TXIN = 1;//多缓冲区模式:LinaRegs.SCIGCR1.bit.MBUFMODE = 0; //是否使用RX/TX多缓冲器或使用单个寄存器RD0/TD0。//设定 波特率 115200 得到组合: P=19 M=0 U=5ClkCfgRegs.PERCLKDIVSEL.bit.LINACLKDIV = 4; // 预分频  VCLK = SYSCLK / 4 = 375 000 00LinaRegs.BRSR.bit.M = 15;LinaRegs.BRSR.bit.SCI_LIN_PSH = (19 >> 8) & 0xff;LinaRegs.BRSR.bit.SCI_LIN_PSL = 19 & 0xff;LinaRegs.BRSR.bit.U = 5;/*//设定波特率 9600 得到组合: P= M= U=ClkCfgRegs.PERCLKDIVSEL.bit.LINACLKDIV = 4; // 预分频  VCLK = SYSCLK / 4 = 375 000 00LinaRegs.BRSR.bit.M = ;LinaRegs.BRSR.bit.SCI_LIN_PSH = ;LinaRegs.BRSR.bit.SCI_LIN_PSL = ;LinaRegs.BRSR.bit.U = ;*///设定最大波特率//LinaRegs.MBRSR.bit.MBRLinaRegs.SCIGCR1.bit.CONT = 1; //使LIN在仿真断点处不会停止,直到LIN当前接收或传输完成//仅在LIN模式下有效LinaRegs.LINMASK.bit.RXIDMASK = 0xff; // 过滤传入的ID消息,并将其与ID字节进行比较LinaRegs.LINMASK.bit.TXIDMASK = 0xff; ////使能中断LinaRegs.SCISETINT.bit.SETRXINT = 1; //接收中断//重启LIN模块LinaRegs.SCIGCR1.bit.SWnRST = 1;}

LIN通信寄存器发送:

手册3487页提到了LIN的发送

29.3.5.2 传输数据

LIN发射器在TXFUNC位和TXENA位都设置为1时被启用。如果TXFUNC位未设置,LINTX引脚将作为通用I/O引脚,而不是LIN功能引脚。在将TXENA位设置为1之前写入TDO的任何值都不会被传输。这两个控制位允许LIN发射器保持不活动状态,与接收器独立。在接收到有效的LIN ID并进行TX匹配后,SCIFLR寄存器中的IDTXFLAG会被设置。如果启用,则会生成ID中断。

29.3.5.2.1 单缓冲区模式传输数据

当MBUFMODE位清零设置为0时,选择单缓冲区模式。在此模式下,LIN等待数据写入TDO,将数据从SCITXSHF传输并发送数据。TXRDY和TXEMPTY位指示传输缓冲区的状态。也就是说,当发射器准备好数据写入TDO时,TXRDY位被设置。此外,如果TDO和SCITXSHF都为空,则TXEMPTY位也被设置。你可以通过以下方式传输数据:

  1. 轮询传输就绪标志
  2. 传输中断
  3. DMA

在轮询方法中,软件可以在写入数据到TDO之前轮询TXRDY位变高。选择轮询方法会导致CPU不必要的负载过大。为了避免这种情况,你可以使用中断或DMA方法。要使用中断方法,需要设置SETXINT位。要使用DMA方法,必须设置SET_TX_DMA位。一旦TXRDY位被设置,就会立即生成中断或DMA请求。当LIN完成所有挂起帧的传输,SCITXSHF寄存器和TDO都为空时,TXRDY位被设置,如果启用,则会生成中断/DMA请求。因为所有数据都已传输,所以中断/DMA请求可以被停止。这可以通过禁用传输中断(CLRTXINT)/DMA请求(CLRTXDMA位)或禁用发射机(清除TXENA位)来完成。如果通过将发送校验和(SC)位设置为1来启用校验和方案,则校验和字节将在当前字节传输之后发送。SC位在校验和字节被传输后清除。

注意:TXRDY标志不能通过读取SCIINTVECTO或SCIINTVECT1寄存器中的相应中断偏移来清除。

LIN通信寄存器接收:

手册3487页提到了LIN接收:

29.3.5.1 接收数据

LIN接收器被启用以接收消息,如果RXFUNC位和RXENA位都设置为1。如果RXFUNC位未设置,LINRX引脚将作为通用I/O引脚,而不是LIN功能引脚。在接收到有效的LINID并进行RX匹配后,SCIFLR寄存器中的IDRXFLAG会被设置。如果启用,则会生成ID中断。

29.3.5.1.1 单缓冲区模式接收数据

当MBUFMODE位被清零时,选择单缓冲区模式。在此模式下,当LIN将新接收的数据从SCIRXSHF传输到RDO时,会设置RXRDY位。SCI在读取RDO中的新数据后清除RXRDY位。此外,当数据从SCIRXSHF传输到RDO时,如果检测到任何错误条件,LIN会设置FE、OE或PE标志。这些错误条件支持可配置的中断功能。你可以通过以下方式接收数据:

  1. 轮询接收就绪标志
  2. 接收中断
  3. DMA

在轮询方法中,软件可以轮询RXRDY位,并在RXRDY位设置高时读取LINRDO寄存器的RDO字节中的数据。选择轮询方法会导致CPU不必要的负载过大。为了避免这种情况,你可以使用中断或DMA方法。要使用中断方法,需要设置SETRXINT位。要使用DMA方法,必须设置SET_RX_DMA位。一旦RXRDY位被设置,就会立即生成中断或DMA请求。如果通过设置比较校验和(CC)位来启用校验和方案,则校验和将在当前正在接收的字节上进行比较,该字节预期为校验和字节。一旦接收到校验和,CC位就会被清除。如果存在校验和错误,则会立即标记CE。

29.3.5.1.2 多缓冲区模式接收数据

多缓冲区模式是在MBUFMODE位设置为1时选中的。在这种模式下,LIN在接收缓冲区中接收到编程数据数量和校验和字段、完整帧后设置RXRDY位。错误条件检测逻辑与单缓冲区模式相似,除该逻辑会监控完整帧。与单缓冲区模式类似,你可以使用轮询、DMA或中断方法读取数据。根据字节数,需要从LINRDO和LINRD1寄存器读取接收到的数据。对于长度小于或等于4的数据,从LINRDO寄存器读取数据会清除RXRDY标志。对于长度大于4的数据,从LINRD1寄存器读取数据会清除RXRDY标志。如果在数据接收过程中通过把比较校验和(CC)位设置为1来启用校验和方案,那么接收到的指示为长度字段所指示的编程数据字节数之后的字节会被视为校验和字节。一旦接收到并比较校验和,CC位就会清除。

LIN-SCI模式寄存器初始化:

 手册3463页提到了LINSCI模式初始化

29.2.4 SCI 配置

在SCI发送或接收数据之前,可以对SCI寄存器进行适当的配置。在上电或系统级复位时,SCI寄存器中的每一位都会设置为默认状态。只有在SCIGCR0寄存器中的RESET位设置为1之后,寄存器才可写。特别重要的是SCIGCR1寄存器中的SWnRST位。SWnRST是一个活动低电平位,初始化为0,并保持SCI在复位状态,直到该位被编程为1。因此,在将1写入SWnRST位之前,可以完成所有SCI配置。以下列表详细说明了软件可以在数据传输或接收之前执行的配置步骤。只要在整个配置过程中保持SWnRST位清零,寄存器的编程顺序并不重要。

  • 通过将RESET位设置为1来启用SCI。
  • 在配置SCI之前,将SWnRST位清零。
  • 通过编程SCIGCR1寄存器选择所需的帧格式。
  • 将SCIPIO0中的RX FUNC和TX FUNC位设置为1,以配置LINRX和LINTX引脚用于SCI功能。
  • 通过编程BRS寄存器选择用于通信的波特率。
  • 将SCIGCR1中的CLOCK位设置为1,以选择内部时钟。
  • 将SCIGCR1中的CONT位设置为1,使SCI在仿真断点处不停止,直到当前接收或传输完成(此位仅在仿真环境中使用)。
  • 将SCIGCR1中的LOOP BACK位设置为1,以将发射机连接到接收机内部(此功能用于执行自测试)。
  • 如果要接收数据,将RXENA位设置为1。
  • 如果要传输数据,将TXENA位设置为1。
  • 在SCI配置完成后,将SWnRST位设置为1。
  • 执行接收或传输数据(见第29.2.4.1节或第29.2.4.2节)。

 

 2025.4.15配置问题遗留:

 目前我按照按照手册配置LIN_SCI模式到这一步,通信在我的硬件平台是有问题的,没法找出问题在哪

/** Lin.c**  Created on: 2025年4月11日*      Author: 30313*/
#include "Lin_1.h"void Init_LINA_SCIMode(void)
{//uint32_t i;// 链接中断服务函数 与 初始化引脚EALLOW;PieVectTable.LINA_0_INT = &level0ISR; //RX_INTPieVectTable.LINA_1_INT = &level1ISR; //TX_INTPieCtrlRegs.PIEIER8.bit.INTx9 = 1;    //8.9PieCtrlRegs.PIEIER8.bit.INTx10 = 1;   //8.10IER |= M_INT8;GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;    //Enable pull-upGpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;  //Asynch input (LIN_SCI RX)GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1;   // Configure GPIO55 for RX operationGpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;   // Configure GPIO54 for TX operationGpioCtrlRegs.GPBDIR.bit.GPIO54 = 1;  // 输出(TX)GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;  // 输入(RX)EDIS;//重载 以启用 LIN模块LinaRegs.SCIGCR0.bit.RESET = 1;LinaRegs.SCIGCR1.bit.SWnRST = 0;//引脚控制寄存器LinaRegs.SCIPIO0.bit.RXFUNC = 1;LinaRegs.SCIPIO0.bit.TXFUNC = 1;//SCI兼容模式引脚LinaRegs.SCIPIO2.bit.RXIN = 1;LinaRegs.SCIPIO2.bit.TXIN = 1;//多缓冲区模式:LinaRegs.SCIGCR1.bit.MBUFMODE = 0; //是否使用RX/TX多缓冲器或使用单个寄存器RD0/TD0。LinaRegs.SCIGCR1.bit.STOP = 0;  //0:1位停止位   1:2位停止位LinaRegs.SCIGCR1.bit.PARITYENA = 0; // 禁用奇偶校验LinaRegs.SCIGCR1.bit.PARITY = 0; //0:奇校验 1::偶校验   (如果使能了奇偶校验)LinaRegs.SCIFORMAT.bit.CHAR = 7; //8位数据长度//设定 波特率 115200 得到组合: P=19 M=5 U=0ClkCfgRegs.PERCLKDIVSEL.bit.LINACLKDIV = 4; // 预分频  VCLK = SYSCLK / 4 = 375 000 00LinaRegs.BRSR.bit.M = 10;LinaRegs.BRSR.bit.SCI_LIN_PSH = (26 >> 8) & 0xff;LinaRegs.BRSR.bit.SCI_LIN_PSL = 26 & 0xff;LinaRegs.BRSR.bit.U = 0;LinaRegs.SCIGCR1.bit.CLK_COMMANDER = 1; //SCI兼容模式LinaRegs.SCIGCR1.bit.TIMINGMODE = 1; //SCI异步操作,SCI模式必须设为1LinaRegs.SCIGCR1.bit.COMMMODE = 0;//0:SCI空闲线  1:SCI地址位LinaRegs.SCIGCR1.bit.ADAPT = 0; //禁用自动波特率LinaRegs.SCIGCR1.bit.CONT = 1; //仿真断点不停LinaRegs.SCIGCR1.bit.CONT = 1; //使LIN在仿真断点处不会停止,直到LIN当前接收或传输完成//LinaRegs.SCIINTVECT0.bit.INTVECT0//LinaRegs.SCICLEARINT.bit.CLRRXINT = 1;//清除接收中断//使能收发LinaRegs.SCIGCR1.bit.RXENA = 1;LinaRegs.SCIGCR1.bit.TXENA = 1;//使能中断LinaRegs.SCISETINT.bit.SETRXINT = 1; //接收中断LinaRegs.SCISETINT.bit.SETTXINT = 1; //发送中断//重启LIN模块LinaRegs.SCIGCR1.bit.SWnRST = 1;
}void LIN_Transmit_Data_SCIMode(unsigned char Data)
{LinaRegs.SCITD.bit.TD = Data;
//    while (LinaRegs.SCIFLR.bit.TXRDY == 0) //等待发送完成
//    {
//        //考虑添加超时逻辑
//    }
//    LinaRegs.SCIFLR.bit.TXEMPTY
//    LinaRegs.SCIFLR.bit.TXRDY
}__interrupt void level0ISR(void)
{}__interrupt void level1ISR(void)
{}

通信完全没发波:

但寄存器能正常置位:

LIN-SCI模式寄存器发送:

手册3464页

29.2.4.2 传输数据

如果TXFUNC位和TXENA位都设置为1,则启用SCI发射器。如果TXFUNC位未设置,LINTX引脚将作为通用I/O引脚,而不是SCI功能引脚。在将TXENA位设置为1之前写入SCITD/TDy的任何值都不会被传输。这两个控制位允许SCI发射器独立于接收器保持不活动状态。SCI模块可以在以下模式之一中传输数据:

  • 单缓冲区(正常)模式
  • 多缓冲区或缓冲区SCI模式

29.2.4.2.1 单缓冲区模式传输数据

当SCIGCR1中的MBUFMODE位清零为0时,选择单缓冲区模式。在此模式下,SCI等待数据写入SCITD,将数据从SCITD传输到SCITXSHF,并传输数据。

TXRDY和TXEMPTY位指示传输缓冲区的状态。

也就是说,当发射器准备好数据写入SCITD时,TXRDY位被设置。

此外,如果SCITD和SCITXSHF都为空,则TXEMPTY位也被设置。

你可以通过以下方式传输数据:

  1. 轮询传输就绪标志
  2. 传输中断
  3. DMA

在轮询方法中,软件可以在将数据写入SCITD寄存器之前轮询TXRDY位变高。选择轮询方法会导致CPU不必要的负载过大。为了避免这种情况,你可以使用中断或DMA方法。要使用中断方法,需要设置SETTXINT位。要使用DMA方法,必须设置SET_TX_DMA位。一旦TXRDY位被设置,就会立即生成中断或DMA请求。当SCI完成所有挂起帧的传输,SCITXSHF寄存器和SCITD都为空时,TXRDY位被设置,如果启用,则会生成中断/DMA请求。因为所有数据都已传输,所以中断/DMA请求可以被停止。这可以通过禁用传输中断(CLRTXINT)/DMA请求(CLRTXDMA位)或禁用发射机(清除TXENA位)来完成。注意:TXRDY标志不能通过读取SCIINTVECTO或SCIINTVECT1寄存器中的相应中断偏移来清除。

LIN-SCI模式寄存器接收:

 3463页

 

29.2.4.1 接收数据

SCI接收器被启用以接收消息,如果RX FUNC位和RXENA位都设置为1。如果RX FUNC位未设置,LINRX引脚将作为通用I/O引脚,而不是SCI功能引脚。SCI模块可以在以下模式之一中接收数据:

  • 单缓冲区(正常)模式
  • 多缓冲区模式

在检测到有效的空闲期后,数据会自动接收,因为数据到达LINRX引脚。

29.2.4.1.1 单缓冲区模式接收数据

当SCIGCR1中的MBUFMODE位清零为0时,选择单缓冲区模式。在此模式下,当SCI将新接收的数据从SCIRXSHF传输到SCIRD时,会设置RXRDY位。在读取SCIRD中的新数据后,SCI会清除RXRDY位。此外,当数据从SCIRXSHF传输到SCIRD时,如果在接收到的数据中检测到任何这些错误条件,则会设置FE、OE或PE标志。这些错误条件支持可配置的中断功能。如果发生这些错误之一,唤醒和中断检测状态位也会被设置,但这些位不一定会在新数据加载到SCIRD时同时出现。你可以通过以下方式接收数据:

  1. 轮询接收就绪标志
  2. 接收中断
  3. DMA

在轮询方法中,软件可以轮询RXRDY位,并在RXRDY位设置为高时从SCIRD寄存器读取数据。选择轮询方法会导致CPU不必要的负载过大。为了避免这种情况,你可以使用中断或DMA方法。要使用中断方法,需要设置SETRXINT位。要使用DMA方法,必须设置SET_RX_DMA位。在RXRDY位被设置的那一刻,会立即生成中断或DMA请求。

测试效果图:

完整工程下载:

参考文章:

LIN通讯_lin通信-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux-设置每次ssh登录服务器的时候提醒多久需要修改密码

在 Linux 系统中,你可以通过设置 motd(Message of the Day)或 sshd 配置来在用户通过 SSH 登录时提醒他们密码即将过期。以下是具体步骤: 方法 1: 使用 motd 文件 motd 文件在用户登录时显示,你可以通过脚本动态生成内容,提醒用户密码过期时间。 编辑 /etc/motd 文件:…

matlab求和∑函数方程编程?

matlab求和∑函数方程编程? 一 题目:求下列函数方程式的和 二:代码如下: >> sum_result 0; % 初始化求和变量 for x 1:10 % 设…

electron桌面端开发-打开指定软件和文件

electron桌面端开发 现在越来越多的软件开发已经趋向于简单化,桌面端开发已经不在依赖之前的java、c等主流技术,目前基于node的开发越来越广泛。功能点也越来越多元化。 文章目录 electron桌面端开发前言一、打开文件的方式?二、exec使用步骤…

ShenNiusModularity项目源码学习(17:ShenNius.Admin.Mvc项目分析-2)

ShenNiusModularity项目的后台管理主页面如下图所示,该页面为ShenNius.Admin.Mvc项目的Views\Home\Index.cshtml,使用的是layuimini后台模板(参考文献2),在layuimini的GitHub主页中提供有不同样式的页面模版链接&#…

SpringBoot 与 Vue3 实现前后端互联全解析

在当前的互联网时代,前后端分离架构已经成为构建高效、可维护且易于扩展应用系统的主流方式。本文将详细介绍如何利用 SpringBoot 与 Vue3 构建一个前后端分离的项目,展示两者如何通过 RESTful API 实现无缝通信,让读者了解从环境搭建、代码实…

portainer.io篇

Portainer‌是一个轻量级的容器管理工具,支持Docker、Kubernetes、Docker Swarm、ACI和Nomad等多种平台。它提供了一个直观的Web界面,使用户能够轻松地管理和监控容器,包括创建、启动、停止、删除容器,以及查看容器的日志和配置信…

Dockerfile 文件常见命令及其作用

Dockerfile 文件包含一系列命令语句,用于定义 Docker 镜像的内容、配置和构建过程。以下是一些常见的命令及其作用: FROM:指定基础镜像,后续的操作都将基于该镜像进行。例如,FROM python:3.9-slim-buster 表示使用 Pyt…

Android Studio开发知识:从基础到进阶

引言 Android开发作为移动应用开发的主流方向之一,曾吸引了无数开发者投身其中。然而,随着市场饱和和技术迭代,当前的Android开发就业形势并不乐观,竞争日益激烈。尽管如此,掌握扎实的开发技能仍然是脱颖而出的关键。本…

大表查询的优化方案

‌单表优化‌: ‌字段选择‌:尽量使用TINYINT、SMALLINT、MEDIUMINT作为整数类型,而非INT;如果字段值非负,可以使用UNSIGNED。对于字符串字段,使用枚举或整数代替字符串类型,使用TIMESTAMP而非D…

常见MQ及类MQ对比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ

常见MQ及类MQ对比 基于Grok调研 Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ 关键点: Redis Pub/Sub 适合简单实时消息,但不持久化,消息可能丢失。Redis Stream 提供持久化,适合需要消息历史的场景,但…

DAPP实战篇:使用ethersjs连接智能合约并输入地址查询该地址余额

本系列目录 专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读400次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你…

库magnet使用指南

Magnet 多线程控制库使用指南 目录 库功能概述环境配置核心类与接口基础使用示例代码生成工具高级功能与改进建议完整示例代码常见问题解答 https://blink.csdn.net/details/1872803?spm1001.2014.3001.5501 1. 库功能概述 Magnet 库提供以下核心功能: 多线程…

SpringCloud-快速通关(三)

SpringCloud-快速通关(一) SpringCloud-快速通关(二) SpringCloud-快速通关(三) SpringCloud-快速通关(三) 七、Seata - 分布式事务7.1、环境搭建7.1.1、简介7.1.2、环境搭建7.1.3、seata-server7.1.4、微服务配置7.1.5、测试7.2、事务模式7.2.1、AT模式7.2.2、XA模式…

STM32 TDS+温度补偿

#define POLAR_CONSTANT (513385) /* 电导池常数,可通过与标准TDS测量仪对比计算反推 */ #define TDS_COEFFICIENT (55U) /* TDS 0.55 * 电子传导率*/void TDS_Value_Conversion() {u32 ad0;u8 i;float compensationCoefficient;float compens…

数据分析实战案例:使用 Pandas 和 Matplotlib 进行居民用水

原创 IT小本本 IT小本本 2025年04月15日 18:31 北京 本文将使用 Matplotlib 及 Seaborn 进行数据可视化。探索如何清理数据、计算月度用水量并生成有价值的统计图表,以便更好地理解居民的用水情况。 数据处理与清理 读取 Excel 文件 首先,我们使用 pan…

离线环境下docker启动springboot项目

Docker linux 离线部署springboot 搭建dcoker环境 1. 首先在有网络的机器上下载Docker的离线安装包&#xff1a; - 访问 https://download.docker.com/linux/static/stable/x86_64/ - 下载对应版本的 docker-<version>.tgz 文件 2. 将下载的安装包传输到目标Linux机器上…

分布式专题-Redis Cluster集群运维与核心原理剖析

一. 哨兵集群与Redis Cluster 架构异同&#xff1a; redis单机内存不会超过10g&#xff0c;如果太大的话bgsave命令的话对单节点压力过大。 节点多了&#xff0c;之间的通信也会非常缓慢。 redis集群模式下对从节点是没有读取操作的&#xff0c;只在主节点进行读取操作。 哨…

使用 Node.js、Express 和 React 构建强大的 API

了解如何使用 Node.js、Express 和 React 创建一个强大且动态的 API。这个综合指南将引导你从设置开发环境开始&#xff0c;到集成 React 前端&#xff0c;并利用 APIPost 进行高效的 API 测试。无论你是初学者还是经验丰富的开发者&#xff0c;这篇文章都适合你。 今天&#…

智慧声防:构筑海滨浴场安全屏障的应急广播系

海滨浴场是夏季旅游的热门目的地&#xff0c;但潮汐变化、离岸流、突发天气、溺水事故等安全隐患时刻威胁着游客安全。传统的安全管理依赖人工瞭望和喊话&#xff0c;存在覆盖范围有限、响应速度慢等问题。“智慧声防”应急广播系统&#xff0c;通过智能化、网络化、多场景协同…

Redis之缓存穿透

Redis之缓存穿透 文章目录 Redis之缓存穿透一、什么是缓存穿透&#xff1f;二、缓存穿透常见的解决方案1. 缓存空对象&#xff08;Null Caching&#xff09;2. 布隆过滤器&#xff08;Bloom Filter&#xff09;​3. 互斥锁&#xff08;Mutex Lock&#xff09;​4. 接口层校验5.…