在汽车电子领域,传感器与 ECU(电子控制单元)的可靠通信是系统稳定运行的核心。SENT(Single Edge Nibble Transmission)协议凭借其结构简单、抗干扰能力强的特点,成为传感器数据传输的主流选择之一。英飞凌 Aurix TC33x/TC32x 系列 MCU 内置 6 路 SENT 通道,通过灵活的寄存器配置可适配不同传感器需求。本文基于官方数据手册与实际代码实现,系统解析 SENT 模块的初始化配置逻辑,帮助开发者理解底层原理与实践要点。
一、SENT 模块概述
SENT 协议采用单边缘 nibble(4 位)传输机制,通过脉冲宽度编码数据,无需时钟线即可实现异步通信。Aurix TC33x/TC32x 的 SENT 模块支持多通道独立配置,可灵活适配不同传感器的通信参数(如波特率、数据长度、校验方式等),其核心优势在于:
- 硬件级脉冲检测与解码,降低 CPU 负担;
- 支持多种分频模式,适配宽范围通信频率;
- 丰富的中断与错误检测机制,提升通信可靠性;
- 可配置的 I/O 映射,兼容不同硬件布局
二、SENT 模块配置流程与关键寄存器
SENT 模块的初始化需遵循严格的顺序,确保寄存器配置的有效性。整体流程为:
模块使能→时钟配置→接收控制→I/O 映射→中断使能
1. 模块使能与时钟控制(CLC)
作用:激活 SENT 模块,解除复位状态。
- 关键字段:
DISR
(Disable Reset):置 0 解除 SENT 模块的复位状态(复位状态不工作)。
2. 时钟分频配置(SENT_FDR、CPDR、CFDR)
SENT 通信依赖精确的时钟信号,时钟配置分三级实现:全局分频→通道预分频→通道频率分频。
2.1 全局频率分频寄存器(SENT_FDR)
作用:为所有通道提供基础时钟(f_MSC),DM
分频模式,STEP
分频参数
关键字段:
字段 | 位域 | 核心行为 |
---|---|---|
STEP | 9:0 | - 正常分频模式(DM=01₂ ):作为 RESULT 的重载初始值,决定整数分频的计数周期(如 STEP=N-1 实现 N 分频);- 分数分频模式( DM=10₂ ):每个输入时钟周期,该值累加到 RESULT ,通过溢出实现非整数分频的步长控制。 |
DM | 15:14 | - 00₂ :分频器关闭,无 f_MSC 输出,RESULT 停止更新(复位默认状态);- 01₂ :使能 正常分频模式(整数分频,RESULT 作为重载计数器);- 10₂ :使能 分数分频模式(非整数分频,RESULT 累加 STEP );- 11₂ :分频器关闭,无 f_MSC 输出,RESULT 停止更新。 |
RESULT | 25:16 | 只读字段,存储分频计算的中间结果: - 正常模式:记录计数器当前值(从 STEP 开始递增,溢出后重置为 STEP );- 分数模式:记录 RESULT + STEP 后的累加值(含溢出余数,反映分频实时进度)。 |
2.2 通道整数分频寄存器(CPDR)
作用:对全局分频后的时钟进行整数分频 (每个通道独立配置预分频)
关键字段:
字段 | 位域 | 类型 | 核心行为 |
---|---|---|---|
PDIV | 11:0 | rw | - 分频因子:定义预分频比为 PDIV + 1 (如 PDIV=3 → 4 分频);- 时钟计算: f_pdiv_x = f_fracdiv / (PDIV + 1) ,输出给 CFDRx;- 修改约束:必须先清除 RCR.CEN (通道使能位),否则配置无效;- 范围: 0~4095 (对应分频比 1~4096 )。 |
2.3 通道分数分频寄存器(CPDR)
作用:对全局分频后的时钟进行分数分频,最终生成通道通信时钟
关键字段:
字段 | 位域 | 类型 | 核心行为 |
---|---|---|---|
DIV | 15:0 | rw | - 初始分频值:设置分数分频的目标值(必须 >0 ,范围 2200~49100 );- 修改约束:必须先清除 RCR.CEN (通道使能位),否则配置无效;- 作用:作为硬件调整 DIVM 的参考值,决定理论分频比。 |
DIVM | 31:16 | rh | - 测量分频值:硬件实时测量的实际分频值(只读,软件写入会被忽略); - 自校准逻辑:自动适配收发端频率偏差,保证 75% DIV < DIVM < 125% DIV (确保频率误差在可接受范围);- 意义:补偿时钟漂移,提升 SENT 通信稳定性。 |
注意:控制通道整数/分数分频的CPDR命名一致。
3. 接收控制配置(SENT_RCR)
作用:定义 SENT 数据接收的格式(长度、校验等)。
关键字段:
字段 | 位域 | 核心作用 | 关键细节 |
---|---|---|---|
CEN | 0(rw) | 控制通道 x 的接收功能:0= 禁用(默认),1= 使能。 | 配置其他参数前需先置 0(禁用通道),避免运行中修改触发异常。 |
IEP | 1(rw) | 忽略结束脉冲:0= 正常检测(默认),1= 忽略(避免误判连续校准脉冲为暂停)。 | 适用于 SPC 模式或校准脉冲连续出现的场景。 |
IDE | 18(rw) | 忽略漂移错误:0= 启用检测(默认,漂移超差触发帧丢弃 + 中断),1= 禁用。 | 若 FDFL=1,必须置 1(配合 FDFL 的漂移检查逻辑)。 |
CFC | 7(rw) | 连续帧检查(比较同步 / 校准脉冲长度):0= 与前一帧比较,1= 与后一帧比较。 | 若 FDFL=1,CFC 被忽略(优先 FDFL 的漂移检查)。 |
FDFL | 20(rw) | 基于帧长度的频率漂移检查(针对脉冲值固定的帧):0= 禁用(默认),1= 启用。 | 启用时需配合 IEP=1 和 IDE=1,否则功能不生效。 |
ACE | 2(rw) | 替代 CRC 模式:0=J2716 标准 6 位 CRC(默认),1= 并行 CRC(如 TLE4998C 传感器)。 | 若 ESF=1(增强帧),ACE 被忽略(强制标准 CRC)。 |
SNI | 3(rw) | 状态 nibble 是否参与 CRC:0= 不参与(默认),1= 参与(如霍尔传感器场景)。 | 需与传感器的 CRC 配置一致,否则校验失败。 |
SCDIS | 5(rw) | 禁用串行数据的 CRC:0= 启用(默认),1= 禁用(CRC nibble 需软件校验)。 | 独立控制串行数据路径的 CRC,与 CDIS(整体 CRC)功能区分。 |
CDIS | 6(rw) | 禁用整个帧的 CRC:0= 启用(默认),1= 禁用(CRC nibble 需软件校验)。 | 控制信号数据 + 串行数据的整体 CRC,与 SCDIS 功能互补。 |
CRZ | 16(rw) | CRC 是否添加零 nibble:0= 添加(默认,适配 legacy 模式),1= 不添加。 | 增强帧(ESF=1)下,CRZ 被忽略(强制标准 6 位 CRC,无需零 nibble)。 |
FRL | 15:8(rw) | 设置帧的数据 nibble 数量(0~255,不含同步、状态、CRC nibble)。 | 若 > 8 个 nibble,每 8 个 nibble 触发 RDI 中断,最终帧结束触发 RSI/RDI(依错误状态)。 |
ESF | 17(rw) | 帧结构切换:0= 短帧(16 帧,4 位 ID+8 位数据 + 4 位 CRC,默认),1= 增强帧(18 帧,更长 ID / 数据 + 6 位 CRC)。 | 增强帧下,ACE、CRZ 等字段行为变化(如强制标准 CRC)。 |
SDP | 4(rw) | 串行数据处理模式:0= 软件手动处理(默认,从 RSRx 读 nibble),1= 硬件自动处理(从 SDSx 读解析后数据)。 | 自动处理需配合串行数据中断(SDI) 触发。 |
SUSEN | 19(rw) | 挂起使能:0= 忽略 OCDS 触发(默认),1= 使能(触发后通道 idle,寄存器可读,丢弃部分接收帧)。 | 仅用于调试场景,挂起后可安全读取寄存器状态。 |
4. I/O 引脚配置(SENT_IOCR、SENT_INP)
SENT 模块需通过 I/O 引脚与外部传感器连接,配置包括引脚功能复用、输入特性与中断映射。
4.1. I/O 控制寄存器(SENT_IOCR)
作用:将物理引脚复用为 SENT 功能,并配置输入特性
关键字段:
字段 | 位域 | 核心行为 | 应用逻辑 |
---|---|---|---|
REG | 12 | 上升沿毛刺标志:1 = 检测到上升沿毛刺,0 = 无(只读,由 CREG 清除) | 监控输入信号质量,毛刺过多需检查硬件或增大 DEPTH |
FEG | 13 | 下降沿毛刺标志:1 = 检测到下降沿毛刺,0 = 无(只读,由 CFEG 清除) | 互补监控上升 / 下降沿毛刺,定位噪声来源 |
TRM | 29 | 触发监控标志:1 = 检测到触发,0 = 无(只读,由 CTR 清除) | 配合 ETS 的触发源,判断触发事件是否发生 |
RXM | 30 | 接收电平监控:显示滤波后 + IIE 反相的输入电平,0 = 低,1 = 高(复位值由芯片定义) | 调试接收信号状态,快速判断输入是否有效 |
TXM | 31 | 发送电平监控:显示 OIE 反相后的输出电平,0 = 低,1 = 高(复位值由芯片定义) | 调试发送信号状态,快速判断输出是否正确 |
CREG | 14 | 清除上升沿毛刺标志:1 = 清除 REG(写 1 有效,只读 0) | 清除 REG 后,可重新监控上升沿毛刺 |
CFEG | 15 | 清除下降沿毛刺标志:1 = 清除 FEG(写 1 有效,只读 0) | 清除 FEG 后,可重新监控下降沿毛刺 |
CTR | 28 | 清除触发监控标志:1 = 清除 TRM(写 1 有效,只读 0) | 清除 TRM 后,可重新监控触发事件 |
CEC | 10 | 清除边沿计数器(EC):1 = 清除 EC(写 1 有效,只读 0) | 调试时重置 EC 的下降沿计数,需配合 EC 的统计功能使用 |
ETS | 19:16 | 选择外部触发源:0ₕ=TRIG0,…,Fₕ=TRIG15(与 SCRx.TRIG=11₂配合) | 配置触发输入(如定时器、GPIO),实现事件驱动的 SENT 通信 |
EC | 27:20 | 统计输入引脚的下降沿数量,饱和到 0xFF(所有状态下保持值,调试用) | 检测输入信号活性(如总线脉冲数),注意饱和特性(≥255 后不再增加) |
4.2 输入配置寄存器(SENT_INP)
作用:将 SENT 中断源(如接收成功、错误)映射到中断节点(TRIG00~TRIG15),实现中断路由控制。“中断源→硬件路由→服务响应”
关键字段:
-
字段 位域 作用 RSI
3:0
映射 “接收成功中断”:当 INTSTATx.RSI=1
且INTENx.RSI=1
时,指定触发的 TRIG(00~15)。RDI
7:4
映射 “接收数据中断”:当 INTSTATx.RDI=1
且INTENx.RDI=1
时,指定触发的 TRIG(00~15)。RBI
11:8
映射 “接收错误中断”:当 INTSTATx.RBI=1
且INTENx.RBI=1
时,指定触发的 TRIG(00~15)。TDI
15:12
映射 “发送数据中断”:当 INTSTATx.TDI=1
且INTENx.TDI=1
时,指定触发的 TRIG(00~15)。TBI
19:16
映射 “发送错误中断”:当 INTSTATx.TBI=1
且INTENx.TBI=1
时,指定触发的 TRIG(00~15)。ERRI
23:20
映射 “错误聚合中断”:当 INTSTATx
中 FRI/FDI/NNI 等 7 类错误标志置位且对应INTENx
使能时,指定触发的 TRIG(00~15)。SDI
27:24
映射 “串行数据中断”:当 INTSTATx.SDI=1
且INTENx.SDI=1
时,指定触发的 TRIG(00~15)。WDI
31:28
映射 “看门狗 / 监控中断”:当 INTSTATx.WDI=1
且INTENx.WDI=1
时,指定触发的 TRIG(00~15)。0x40400003;
5. 中断配置(Interrupt Router)
SENT 模块,中断与 CPU 交互,配置中断优先级、中断源,中断服务程序(ISR)。
5.1 中断控制寄存器(ICR
)
作用:系统中断控制器(SRC)负责配置中断优先级、清除挂起标志并使能中断
关键字段:
SRPN | 7:0 | rw | 定义服务请求的优先级(同服务提供者内,值越大优先级越高)。 |
CLRR | 25 | w | 清除服务请求标志(SRR )的写使能位(写1 有效,读恒为0 )。 |
SRE | 10 | rw | 控制服务请求的使能状态(0 = 禁用,1 = 使能)。 |
三、配置要点与注意事项
-
寄存器配置顺序:修改分频(CPDR、CFDR)或接收控制(RCR)前,需先禁用通道(RCR.CEN=0),否则配置无效。
-
时钟校准:CFDR.DIVM 为硬件自校准结果,若偏差超出 75%~125% 范围,需检查时钟源或传感器频率。
-
中断优先级:错误中断优先级应高于数据接收中断(如代码中 ERR 优先级 245 > 接收优先级 248~250),确保错误及时处理。
-
数据校验:ISR 中需添加数据范围校验(如代码中
Sent_DataBuffer[3] < 8
),避免传感器异常数据导致系统故障。
四、总结
Aurix TC33x/TC32x 的 SENT 模块通过分层寄存器配置实现了灵活的传感器通信适配,核心在于理解 “时钟分频→数据格式→I/O 映射→中断响应” 的全流程逻辑。实际开发中,需结合传感器数据手册调整分频参数与帧结构,并通过错误中断与数据校验机制提升系统可靠性。本文结合代码实例解析了关键寄存器的配置原理,为开发者提供从理论到实践的完整参考。
附参照代码:
void Sent_Init(void)
{
SENT_CLC.B.DISR = 0; // Enable SENT module (DISR=0 means not disabled)
SENT_FDR.B.DM = 1; // Set frequency division mode
SENT_FDR.B.STEP = 1023; // Set frequency step parameter
SENT_CPDR0.B.PDIV = 0; // T1 channel: prescaler setting
SENT_CPDR5.B.PDIV = 0; // T2 channel: prescaler setting
SENT_CPDR4.B.PDIV = 1; // AS channel: prescaler setting
SENT_CFDR0.B.DIV = 0x2418; // T1 channel: frequency divider setting
SENT_CFDR5.B.DIV = 0x2418; // T2 channel: frequency divider setting
SENT_CFDR4.B.DIV = 0x20D0; // AS channel: frequency divider setting
SENT_RCR0.U = 0x00603; // T1 channel: reception control parameters
SENT_RCR5.U = 0x00603; // T2 channel: reception control parameters
SENT_RCR4.U = 0x00603; // AS channel: reception control parameters
SENT_VIEW0.U = 0x76543012; // T1 channel: view register value
SENT_VIEW5.U = 0x76543012; // T2 channel: view register value
SENT_VIEW4.U = 0x76543012; // AS channel: view register value
SENT_IOCR0.U = 0x00000022; // T1 channel: IO control parameters
SENT_IOCR5.U = 0x00000022; // T2 channel: IO control parameters
SENT_IOCR4.U = 0x00000222; // AS channel: IO control parameters
SENT_INTEN0.U = 0x000033E1; // T1 channel: interrupt enable configuration
SENT_INTEN5.U = 0x000033E1; // T2 channel: interrupt enable configuration
SENT_INTEN4.U = 0x000033E1; // AS channel: interrupt enable configuration
SENT_INP0.U = 0x40400001; // T1 channel: input control parameters
SENT_INP5.U = 0x40400002; // T2 channel: input control parameters
SENT_INP4.U = 0x40400003; // AS channel: input control parameters
SRC_SENT1.B.SRPN = INTERRUPT_SENT0_PRIORITY; // Interrupt priority
SRC_SENT1.B.CLRR = 1; // Clear interrupt flag
SRC_SENT1.B.SRE = 1; // Enable interrupt
}