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: 寄存器所属的章节或类别。
偏移量 缩写 寄存器名称 0h SCIGCRO 全局控制寄存器0 4h SCIGCR1 全局控制寄存器1 8h SCIGCR2 全局控制寄存器2 Ch SCISETINT 中断使能寄存器 10h SCICLEARINT 中断禁用寄存器 14h SCISETINTLVL 设置中断级别寄存器 18h SCICLEARINTLVL 清除中断级别寄存器 1Ch SCIFLR 标志寄存器 20h SCIINTVECTO 中断向量偏移寄存器0 24h SCIINTVECT1 中断向量偏移寄存器1 28h SCIFORMAT 长度控制寄存器 2Ch BRSR 波特率选择寄存器 30h SCIED 仿真缓冲寄存器 34h SCIRD 接收数据缓冲寄存器 38h SCITD 发送数据缓冲寄存器 3Ch SCIPIOO 引脚控制寄存器0 44h SCIPIO2 引脚控制寄存器2 60h LINCOMP 比较寄存器 64h LINRDO 接收数据寄存器0 68h LINRD1 接收数据寄存器1 6Ch LINMASK 接受掩码寄存器 70h LINID LIN ID寄存器 74h LINTDO 发送数据寄存器0 78h LINTD1 发送数据寄存器1 7Ch MBRSR 最大波特率选择寄存器 90h IODFTCTRL IODFT for LIN EOh LIN_GLB_INT_EN LIN全局中断使能寄存器 E4h LIN_GLB_INT_FLG LIN全局中断标志寄存器 E8h LIN_GLB_INT_CLR LIN全局中断清除寄存器
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位也被设置。你可以通过以下方式传输数据:
- 轮询传输就绪标志
- 传输中断
- 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标志。这些错误条件支持可配置的中断功能。你可以通过以下方式接收数据:
- 轮询接收就绪标志
- 接收中断
- 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位也被设置。
你可以通过以下方式传输数据:
- 轮询传输就绪标志
- 传输中断
- 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时同时出现。你可以通过以下方式接收数据:
- 轮询接收就绪标志
- 接收中断
- DMA
在轮询方法中,软件可以轮询RXRDY位,并在RXRDY位设置为高时从SCIRD寄存器读取数据。选择轮询方法会导致CPU不必要的负载过大。为了避免这种情况,你可以使用中断或DMA方法。要使用中断方法,需要设置SETRXINT位。要使用DMA方法,必须设置SET_RX_DMA位。在RXRDY位被设置的那一刻,会立即生成中断或DMA请求。
测试效果图:
完整工程下载:
参考文章:
LIN通讯_lin通信-CSDN博客