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.

[参考译文] TMS320F280037C:MCAN 模块配置不正确且无法发送

Guru**** 2534330 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1377516/tms320f280037c-mcan-module-not-configuring-correctly-and-fails-to-transmit

器件型号:TMS320F280037C

工具与软件:

 在使用 MCAN 模块进行配置和通信期间会遇到一些错误行为。  

我的应用中的 MCAN 模块配置设置遵循 mCAN 示例项目(例如 mcan_EX7_classical_transmit.c)中的一般设置顺序、特别是 MCANConfig 函数。 但是、在调用 MCAN_setOpMode (MCANA_DRIVER_BASE、MCAN_OPERATION_MODE_NORMAL)后、我看不到 MCAN_CCCR。 INIT 位从1转换为0。 我正在等待至少11个连续时钟周期、以便根据手册对寄存器字段进行更新、但仍然不会相应地进行更新。

因此、当我尝试启动消息传输时、MCU 无法启动。  具体来说、当我对 MCAN_TXBAR 进行写入指示缓冲区添加请求时、我看到我尝试向其发送消息的缓冲区的 MCAN_TXBRP 寄存器更新为1、但应用程序此时只是挂起、因为 MCAN_TXBRP 位 从不会设置为0、表示已传输消息。 我假设这与上面遇到的问题有关、INIT 也没有被复位。

附加信息:使用的时钟源是 外设系统时钟、它被分频为40MHz 以提供 MCAN 时钟。

有几个问题:

  • 具有 MCAN_CCCR 的行为。 是否曾看到 INIT 位? 是否有任何其他与 INIT 位交互的过程会在我的应用程序将其写入0后将其保持为1?
  • 在为该关联缓冲器设置 MCAN_TXBRP 位后、是否没有理由不发送发送缓冲器中的消息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在 CCCR 的示例中未观察到 MCAN 初始化例程的问题。 INIT 位。  在示例中,函数 MCANConfig()通过以下函数调用将 MCAN 置于初始化模式:

    MCAN_setOpMode (MCANA_DRIVER_BASE、MCAN_OPERATION_MODE_SW_INIT); //设置 CCCR。 INIT 位至"1"

    然后、接着接着使用轮询来清除该位:

    while (MCAN_OPERATION_MODE_SW_init!= MCAN_getOpMode (MCANA_DRIVER_BASE))
    {}

    您是否可以尝试改用轮询方式?

    此致、

    Joseph

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Joseph、

    正如您所描述的、我实际上使用的是轮询方法。 CCCR 似乎为空。 INIT 位短暂从1翻转为0、以通过以下循环:

    while (MCAN_OPERATION_MODE_NORMAL!= MCAN_getOpMode (MCANA_DRIVER_BASE))
    {}

    但是、CCCR。 离开此循环后、INIT 位立即返回到1。 似乎 是 ,其他东西是采取行动,迫使它恢复到1由于某种原因。

    我还看到了 CCCR。 CSR 和 CCCR。 当我进行 MCAN_Init ()函数调用时正在设置 CSA 位。 查看技术参考手册、只有在发出时钟停止请求时才应设置这些位、而只能通过调用 MCAN_addClockStopRequest (MCANA_DRIVER_BASE、1U)来设置该请求;但我不是在调用该函数。

    我确实注意到、如果我将 MCAN_InitParams 结构 成员 wkupReqEnable、wkupReqEnable 和 emulationEnable 设置为0x1U、那么我就可以得到所有 CCCR。 INIT、CCCR。 CSA 和 CCCR。 调用 MCAN_Init 后要清除的 CSR。 遗憾的是、这仍然没有解决我的问题、因为当我尝试启动传输时、使用 CANbus 单调工具和 PSR 仍然看不到总线上的任何流量。 LEC 值为0x7、表示总线上没有发生变化。 PSR。 ACT 为0x1、表示总线只是处于空闲状态和 PSR。 EW 和 PSR。 EP 都为0。

    我将使用以下方法发送一个帧、该帧基本上完全从示例工程中获取(tx_buf 是类型 MCAN_TxBufElement、bufNum 是0u、表示缓冲器0):

    MCAN_writeMsgRam (MCANA_DRIVER_BASE、MCAN_MEM_TYPE_BUF、bufNum、TX_buf);

    MCAN_txBufAddReq (MCANA_DRIVER_BASE、bufNum);  

    while (MCAN_getTxBufReqPend (MCANA_DRIVER_BASE)){};  

    为了从专用传输缓冲区成功传输数据、我还应该做些什么吗?

    是否还有其他因素会影响 时钟 停止逻辑阻止发送消息?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jacob:

    您可以首先单独运行 mcan_EX7示例吗、我们将尝试回溯为什么它在 MCAN init 对您的应用不起作用?  如果运行 mcan_EX7、什么是接收节点?  您是否碰巧有一个 CAN 分析仪正在从 F280037器件接收数据、还是其他 CAN 节点?  另一方面、您在使用什么硬件?  是 F28003x LaunchPad 还是定制硬件设计?

    很抱歉提出了更多问题、但希望先从已知的工作设置和示例开始、然后再尝试找出可能导致 MCAN 未正确实现最小化的原因。

    谢谢。

    Joseph

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Joseph:

    事实证明、我没有遵循  mcan_EX7的所有初始化步骤。 我没有调用 Device_initGPIO()、而是调用 GPIO_unlockPortConfig ()来解锁端口 A、B 和 H 的 GPIO 引脚的引脚锁。在我将此函数调用添加到初始化序列中后、我不再看到我在之前的帖子中提到的 MCAN 错误。 我现在可以发送和接收、没有任何问题。 根据我的理解、如果 未调用 GPIO_unlockPortConfig、则 GPIO 引脚无法配置为其他功能、例如 MCAN RX/TX 使用等。

    感谢您的帮助。