This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
客户遇到 有关 TI F28388D 的严重配置问题。 特别是、由连接管理器 CPU (ARM)控制的 MCAN 器件表现出一些令人担忧的行为。
他们尝试向其嵌入式操作系统添加 CAN XCP 功能、并使用随附的 CPU3示例(ex2)、我们为 CAN-FD 配置了 MCAN。
当它们从 Peak PCAN-USB FD 适配器向 TI F28388D MCAN 器件发送一系列消息时、我们会看到一致但随机的消息丢失。 如果它们在发送和接收时 相互连接了2个 TI F28388D 微控制器(每个微控制器都配备了 CAN 收发器)、则不会发生这种行为。 预期应用是主设备(通常不是 TI CAN 适配器)与多个 TI F28388D 从设备单元通信、CM 上的 TI MCAN 通过 CAN-XCP 将遥测数据发送到主设备。 这种一致的消息丢失使其无法使用。
查找有关调试信息的指导以解决该问题。 实验中的当前测试配置如下。
尊敬的 Lawrence:
当它们从 Peak PCAN-USB FD 适配器向 TI F28388D MCAN 器件发送一系列消息时、我们会看到一致但随机的消息丢失
这些邮件是否具有相同的邮件 ID? 接收到的消息可以存储在 RX 缓冲器或 RX FIFO 中。 RX 缓冲区和 RX FIFO 存在单独的中断。 您是否启用了两个中断?
您能否共享 MCAN 配置(包括项目中的时序参数)?
您好、QJ:
将单独共享 MCAN 代码调试报告
测试报告是
回答您的问题
此致、
Lawrence
尊敬的 Lawrence:
PCAN 重复发送消息的周期时间是多少?
我正在运行测试时周期时间= 20ms、未出现任何问题。
我的 MCAN 配置为:ID 为1Mbps、数据为2Mbps
我使用 ex4 (接收)示例、但做了少量更改。
将周期时间更改为2ms 后、我注意到(105344-10494)=40条消息将丢失(第一次测试)、并且(23612-23543)=69条消息将丢失。 要使消息丢失、周期时间必须大于2ms。
您好、QJ:
客户正在运行1Mbit ID 和1Mbit 数据。 其限制是它们 在设置中使用 SN65HVD230、我的理解是不支持更高的 CAN FD 速度。
不确定是否是该问题、但您可以以1Mbit ID 和1Mbit 数据运行吗?
此致、
Lawrence
您好、QJ:
客户提供的更新:
>>> PCAN 重复发送消息的周期是多久?
我已经在1ms 到10s 的周期时间范围内尝试发送一系列消息。
>>运行测试时、周期时间= 20ms、未产生任何问题。
我得到了类似的结果、即 消息总数 正常、但接收到的消息内容不符合预期。
在上一个报告中、我在10s 的周期时间内按序列(如下图所示)发送了一条"锯齿状消息"。 (我手动发送了每条消息)、观察结果是消息总数正确、但消息与已发送消息不同。
此外、您是否可以使用 MCAN ex1或 ex2配置来运行测试? 由于我们在 ARM 内核上使用 MCAN 模块、如果您的可用、我们可以直接尝试配置。
尊敬的 Lawrence:
对于常规 CAN 通信是相同的。 如果正在接收 CAN 消息的 CAN 节点从消息 RAM 中读取消息需要很长时间、新接收到的消息将覆盖消息 RAM 中尚未读出的前一条消息。
这是我使用常规 CAN 进行的测试。 中断模式用于接收 CAN 消息、RX ISR 无需进一步处理即可从消息 RAM 读取消息。 如果周期时间为1ms (在 PCAN GUI 中最小值)、则不会丢失消息。
发送的消息数(PCAN)= F28 MCU 接收的消息数(以蓝色圆圈显示的数字)
如果我在 RX ISR 中添加了大的延迟、则大多数数据包都会丢失(7139 - 101)。 为了不会丢失数据、应用程序应在下一条消息到来之前清空 RX 缓冲区/FIFO。 关于 TX 节点、应用程序应在尝试新消息之前检查是否已成功发送前一条消息。
QJ:
谢谢。 您能否提供测试代码?
此致、
Lawrence
QJ:
另外、客户表示他们需要手动与 F28388D 通信、因此周期时间约为10秒。 系统中会有其他东西。
此致、
Lawrence
尊敬的 Lawrence:
当然、我将上传测试代码。
您好、QJ:
客户对您的项目的反馈:
您能否详细解释一下该项目的内容? 它似乎不是我们希望从之前的响应中得到的结果。
我有原来的 ex4项目和修改的设置,我可以看到它接收数据,但我可以看到中断函数产生了很多错误。 我怀疑采样点百分比不正确。
您能否提供有关以百分比形式配置采样的标称段和数据段的说明?
如下面代码所示、这是什么 以百分比表示的采样点 ?
//
//初始化位时序。
//=Mbps/[ 40MHz (1+1)*(14+3+3)]= 1Mbps
bitTimes.nomRatePrescalar = 0x1U;//标称波特率预分频器
bitTimes.nomTimeSeg1 = 14u;// SP 之前的标称时间段
bitTimes.nomTimeSeg2 = 0x3U;// SP 之后的标称时间段
bitTimes.nomSynchJumpWidth = 0x3U;//标称 SJW
//=Mbps/[ 40MHz (0+1)*(14+3+3)]= 1Mbps
bitTimes.dataRatePrescalar = 0x1U;//数据波特率预分频器
bitTimes.dataTimeSeg1 = 14u;// SP 之前的数据时间段
bitTimes.dataTimeSeg2 = 3U;// SP 之后的数据时间段
bitTimes.dataSynchJumpWidth = 3U;//数据 SJW
//
您是否可以支持与客户的呼叫、因为这将变得非常紧急。
此致、
Lawrence
尊敬的 Lawrence:
只需稍作更改即可完成 ex4。
1.使用常规 CAN: fdMore=0和 brsEnable=0
2. PCAN 每1ms 持续传输一条消息(ID=4)。
3. F28可以处于中断模式,并在 while ()循环中等待消息
GPIO18和 GPIO19用于 CAN
5.使用20MHz 晶体
您好、QJ:
对 在 MCAN-receive/ex2示例中使用 ARM 代码中存储器缓冲区的代码示例进行了任何更新?
此致、
Lawrence
客户提出的其他问题:
==============
感谢您提供详细信息。 我已经熟悉示例中的滤波器和 SFT 设置。 我想要具体查找的是有关中断函数中使用的函数以及这些函数的调用顺序的说明。 这对于确保我们的执行正确至关重要。
您能否更深入地介绍一下中断环境中的函数调用及其序列?
==========
此致、
Lawrence
尊敬的 Lawrence:
CM (连接管理器、cortex-M4)支持15种异常(复位、NMI、硬故障、MOU 故障、总线故障、 SVCall、SysTick 等)和64个外部中断。 所有外部中断都 通过一个 被称为嵌套向量中断控制器 (NVIC)的外设进行配置。 。 异常号 外部中断从开始 16. . 请参阅 表41-5。 器件 TRM 中的 NVIC 中断映射(页4230):
带连接管理器的 TMS320F2838x 实时微控制器 TRM (修订版 F)
NVIC 有一组寄存器用于配置"外部"中断线路。 请参阅 TRM 中的41.12.9 NVIC 寄存器(页4375)。 MCAN 内核有两条中断线路、并提供两个中断请求(MCAN_INT0和 MCAN_INT1)。 NVIC 表中 MCAN 的中断数为16 (MCAN_INT0)和17 (MCAN_INT1)。
在 CM MCAN (ex2)示例中、MCAN_INT0的 ISR 是 MCANIntr0ISR、而 MCANIntr1ISR 是 MCAN_INT1。 中断线路1用于所有 MCAN RX 中断(MCANIntr1ISR (void))、中断线路0用于所有 MCAN TX 中断(MCANIntr0ISR (void))。
启用所有30个 MCAN 中断源(RX 缓冲区突出显示):
您好、QJ:
客户:
======
感谢您对中断和异常的深入了解。 但是、为了确保我们可以正确高效地实现 MCAN 代码、如果我们有一个可正常工作的参考示例来专门处理中断上下文中的中断函数、我们将更有信心。
此示例对我们尤其重要、因为许多未来的产品将依赖此 MCAN 代码。 明确的参照不仅有助于我们、而且确保我们的执行是稳健和可靠的。
您能否提供一个包含功能序列的示例 中断服务例程(ISR)中的调用、尤其关注如何处理这些函数内的中断 ? 非常感谢您在提供这方面的支持。
提前感谢您的持续帮助
======
此致、
Lawrence
软件团队正在处理来自 Lawrence 的问题。
尊敬的 Lawrence:
请查看随附的示例。 未来具有标准 ID 的消息存储在 RX 缓冲区中、而具有扩展 ID 的消息存储在 FIFO 1中。 中断1用于 RX。
必须首先在 CPU1中执行"mcan_config_C28x"。 它会初始化 M4的 GPIO 和时钟。
e2e.ti.com/.../mcan_5F00_config_5F00_c28x.zipe2e.ti.com/.../mcan_5F00_ex2_5F00_receive_5F00_F28388_5F00_CortexM4.zip
您好、QJ:
客户反馈:
======
感谢您分享提供的示例。 回顾它时、我注意到、 除位时序配置的更改外、 与官方 mcan_ex2_external_loopback 示例相比、似乎没有任何其他更新。
具体而言、我需要帮助的是了解我应该在接收 ISR 中调用哪些函数、以及使用存储器缓冲区进行接收时处理传入消息的正确顺序。 这些信息对于确保 ISR 在应用中正确运行至关重要。
======
对此有何指导?
此致、
Lawrence
尊敬的 Lawrence:
如前所述、MCAN 内核有2条中断线路和20个中断源。 每个源都可以配置为驱动两条中断线路之一。 例如、对 TX 中断源使用 INT 线路0、对 RX 中断源使用 INT 线路1。 MCAN_IR 寄存器的位显示了当相应的中断发生时设置的中断标志。
接收到的消息可以存储在 RX 缓冲区中、或者两个 FIFO 中的一个(FIFO 0或 FIFO 1)。 MCAN 模块有两组接受过滤器、一组用于标准 ID、一组用于扩展 ID。 如果过滤器匹配、那么在 SFEC[2:0]=0x7或 EFEC[2:0]=0x7的情况下、消息将存储在 RX 缓冲区中(请参阅 MSG ID 过滤器元素字段说明)。
1.过滤器元素接受接收到的消息后、该消息将存储到消息 RAM 中的 RX 缓冲区中。 标志 MCAN_IR。 DRX 已设置。
MCAN_getIntrStatus (...)
MCAN_clearIntrStatus (..)
2.将匹配的接收消息的最后一个字写入消息 RAM 后、会设置寄存器 MCAN_NDAT1或 MCAN_NDAT2中相应的新数据标志。
MCAN_getNewDataStatus (..)
只要设置了新数据标志、相应的 Rx 缓冲区就会被锁定、以防止通过接收到的匹配帧进行更新。 必须由主机 CPU 通过向相应位位置写入1来复位新数据标志。
MCAN_clearNewDataStatus (..)
3.扫描 newData 寄存器并读取相应的邮箱(如果收到任何消息)。
Mcan_Read g42RAM(...)
4.清除 EOI 寄存器中的中断。
MCAN_ClearLineInterrupt()
5. 必须手动清除中断组的 PIEACK 位。 如果 PIEACK 位未被清除、则 CPU 不会接收到来自该组的任何进一步中断。
MCAN_ClearACKGroup()
感谢您详细介绍 MCAN 内核的中断处理序列。 我有一些跟进要点和要求:
1.您提供的设置似乎侧重于的处理流程 CPU1 (引用 mcan_ex4_receive 示例)。 但是、我们需要在上运行的版本 Arm 内核实现 . 您能否提供此信息?
2.我的 主要/原始问题 是使用 MCAN_ClearLineInterrupt ()和 MCAN_ClearACKGroup ()函数,这两个函数"必须手动清除"。 这些函数似乎不存在于 MCAN 库中、这可能会给我们的程序实现带来重大问题。 您能否说明一下这些函数是不同模块的一部分、或者我们是否应该使用其他函数来手动清除中断、尤其是在 ARM 内核的上下文中?
3.您能提供一个 工作示例 演示如何使用接收消息 和存储器缓冲区 以及相应的 ISR 函数调用? 我们也非常感谢对该顺序的简要说明、特别是如何针对我们的情况实施该顺序。
您好、QJ:
是否有任何更新? 客户请求召开会议以讨论此需求。
此致、
Lawrence
尊敬的 Lawrence:
MCAN_ClearACKGroup()应为 Interrupt_clearACKGroup(interrupt_ACK_group9)、这是 C2000ware 的 API。
MCAN_ClearLineInterrupt ()是 C2000ware 中的 MCAN_clearInterrupt ()
对于 C28和 CM、应按照相同的过程处理 MCAN 中断。 对于 CM、不需要 Interrupt_clearACKGroup (interrupt_ACK_group9)。
必须在用户代码中手动清除中断组的 PIEACK 位。 这通常在 ISR 结束时完成。 如果 PIEACK 位未被清除、则 CPU 不会接收到来自该组的任何进一步中断。 这不适用于 Timer1和 Timer2中断、它们并不通过 PIE。
对于 C28x、中断路径分为:外设、PIE 和 C28x CPU
对于 CM、中断路径为:外设、NVIC 和 Cortex-M4 MCU。 NVIC 将来自各种外设的中断多路复用到 CM 中断线路中。
MCAN 有两条中断线路和30个内部中断源。 每个中断源都可以配置为驱动两条中断线路之一。 这些中断是电平敏感中断。
当 CM 进入 ISR 时、中断状态将从挂起变为已激活。 对于电平式中断、当 CM 从 ISR 返回时、NVIC 将对中断信号进行采样。 如果中断信号有效、则中断状态将变为挂起、这可能导致 CM 立即重新进入 ISR。 因此、我们需要清除中断状态并清除线路中断。
QJ:
客户仍需要对您的最新回复进行一些澄清:
==============
您提到、
>>>
"当 CM 进入 ISR 时、中断状态将由挂起变为已激活。 对于电平式中断、当 CM 从 ISR 返回时、NVIC 将对中断信号进行采样。 如果中断信号有效、则中断状态将变为挂起、这可能导致 CM 立即重新进入 ISR。 所以我们需要清除中断状态并清除线路中断。"
如果您能提供一个完整的工作示例、演示如何正确处理使用内存缓冲区接收消息、包括 ISR 函数调用的序列、尤其是与清除前文所述的中断状态和线路中断相关的序列、我将不胜感激。 分步说明对于确保在我们的场景中正确实施非常有帮助。
我们定于明天上午举行一次会议、希望我们能够利用这个机会澄清任何混淆。 由于这种情况已经过去4周了、一个明确的例子将有助于我们最终取得进展。
==========
此致、
Lawrence
尊敬的 Lawrence:
很高兴与客户会面。 附件是会议中使用的示例:
e2e.ti.com/.../MCAN_5F00_Receive_5F00_RxBuff_5F00_FIFO_5F00_F28388_5F00_CortexM4.zip