单片机/MCU论坛
直播中

文甘翀

8年用户 1037经验值
私信 关注
[问答]

如何查找 TLE9881 接收帧的 DLC?

我们的项目使用 TLE9881,并使用经典 CAN 协议进行通信
您能帮我找到接收到的 CAN 帧的 DLC 吗?

回帖(1)

陈键

2025-7-22 17:42:39

要查找TLE9881接收到的经典CAN帧的DLC(Data Length Code),需要通过编程访问芯片的寄存器。以下是详细步骤和示例代码:


1. 理解寄存器结构



  • CAN控制寄存器 (CANCTRL):DLC位于接收报文对象(Message Object)的CANCTRL寄存器中。

  • DLC位置:在CANCTRL寄存器中,DLC占据 位[27:24](具体请核对芯片手册,但常见设计如此)。DLC值范围是0-8(4位)。


2. 步骤



  • 使能接收中断:配置报文对象为接收模式,设置标识符(ID)和掩码。

  • 等待接收中断:当CAN帧被接收时,中断标志位会置位。

  • 读取CANCTRL寄存器:从中提取DLC值。




示例代码(基于Infineon SDK或寄存器操作)


// 假设使用TLE9881的SDK,此处为伪代码逻辑
#include

// 接收处理函数
void handleRxInterrupt(uint8 mob_index) {
    // 1. 获取报文对象的控制寄存器值
    uint32 ctrl_reg = CAN_MO[mob_index].CTRL.U;

    // 2. 提取DLC(位27:24)
    uint8 dlc = (ctrl_reg >> 24) & 0x0F; // 屏蔽高28位,取低4位

    // 3. 清除中断标志(根据手册操作)
    CAN_MO[mob_index].STAT.B.RXUPD = 1; // 假设需写1清除

    // 使用DLC值
    printf("Received DLC: %dn", dlc); // 输出DLC
}

// 主配置
void main() {
    // 初始化CAN模块和报文对象(省略详细配置)
    // ...
    // 配置报文对象n为接收模式,设置ID和掩码
    CAN_MO[0].CTRL.B.MSGVAL = 1; // 启用报文对象
    CAN_MO[0].CTRL.B.RXIE   = 1; // 使能接收中断
    // ...
    while(1) {
        // 等待中断触发
    }
}



关键寄存器说明(简化)






















寄存器 位域 说明
CANCTRL [27:24] DLC值(直接表示字节数)
CANSTAT RXUPD 接收更新标志(中断源)



注意事项




  1. 核对手册

    请查阅 TLE9881数据手册用户手册CAN章节,确认DLC在CANCTRL中的精确位置(不同版本可能有差异)。




  2. 中断处理:  



    • 确保在中断服务程序(ISR)中清除中断标志。

    • 验证报文对象是否已成功接收帧(检查NEWDATRXUPD标志)。




  3. DLC与数据长度:  



    • 经典CAN中,DLC = 实际数据字节数(0-8),与CAN FD不同。




通过上述步骤,您即可在接收帧时准确获取DLC值。如遇问题,建议结合芯片手册调试寄存器读写操作。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分