NXP MCU 技术论坛
直播中

杨秀英

7年用户 1375经验值
私信 关注
[问答]

mcan驱动没有实现timestamp初始化步骤?

我在使用以下环境的项目中工作:
- LPC55S06JHI48 MCU
- MCUXpresso IDE v11.7.1 [Build 9221] [2023-03-28]
- SDK_2.x_LPC55S06 v3.10

我无法读取 CAN 协议寄存器内的时间戳值. 我的项目设置为使用 CAN 2.0B(扩展帧 - 29 位 ID)。目前我没有使用 CAN-FD。
我正在使用 mcan 驱动程序实现来读取 CAN RX 缓冲区。
用户手册 UM11424 说可以在 RXTS 字段中读取时间戳值(第 779 页)。

我知道有必要按照第 753 页上的说明配置时间戳计数器配置寄存器 (TSCC)。

但是,查看 fsl_mcan.c 实现,我找不到任何对 TSCC 寄存器的引用。似乎 mcan 驱动程序没有初始化这个寄存器,也没有任何方法来配置它。
查看 LPC55S06.h 文件,我找到了 TSCC 寄存器声明,如下所示:

我尝试使用寄存器上的直接调用来设置时间戳,但没有成功。我总是将时间戳读为零。

我的问题是:mcan驱动没有实现timestamp初始化步骤?
在 MCU 中没有外部计时器/计数器块的情况下,如何在收到的包中使用 CAN 时间戳?


回帖(1)

郝埃连

2024-5-31 17:38:28
mcan驱动确实没有提供初始化时间戳计数器的步骤。这意味着需要在自己的应用程序中实现时间戳的计数器初始化和读取,以确保正确读取CAN协议寄存器中的时间戳值。

以下是一些步骤,可用于在LPC55S06JHI48 MCU中使用MCUXpresso IDE和SDK_2.x_LPC55S06 v3.10实现CAN时间戳初始化和读取:

1. 首先需要配置时间戳计数器配置寄存器(TSCC),该寄存器用于配置CAN帧时间戳计数器的参数。此寄存器位于MCAN模块的容器寄存器中,可以使用LPC55S06JHI48 MCU提供的寄存器映射来直接访问。配置TSCC寄存器可以使用以下代码:

MCAN->RAMn[TxBufIndex].TSCC = MCAN_RAMn_TSCC_TCP_MASK |
                                MCAN_RAMn_TSCC_TSS_MASK |
                                MCAN_RAMn_TSCC_TFE_MASK |
                                ((CAN_TIME_STAMP_COUNTER_PRESCALER - 1) << MCAN_RAMn_TSCC_TCP_SHIFT);

这里,我们将TSCC寄存器配置为使用TCP分频器、时间戳溢出中断选项和时间戳使能选项。还需要在PRESCALER字段中设置CAN时间戳计数器的预分频器值。

2. 现在,可以在每次读取CAN帧时读取时间戳。为此,需要在MCAN帧缓冲区对象中配置帧缓冲区,以启用时间戳记录选项。我们可以在MCAN->RAMn[TxBufIndex].TSCC寄存器的TSS字段中启用时间戳记录选项,如下所示:

MCAN->RAMn[TxBufIndex].TSCC |= MCAN_RAMn_TSCC_TSS_MASK;

3. 最后,在每个接收中断处理程序中,可以使用以下代码来读取CAN协议寄存器中的时间戳值:

uint32_t timeStamp = ((CAN->RXGFC & CAN_RXGFC_FLSSA_MASK) << 19) |
                        ((MCAN->RAMn[RxBufIndex].RXF0S & MCAN_RAMn_RXF0S_F0FL_MASK) * sizeof(MCAN_RX_FIFO0_t));

这里,我们使用CAN_RXGFC_FLSSA字段和MCAN_RAMn_RXF0S_F0FL字段来计算接收帧的时间戳值。
举报

更多回帖

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