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.

[参考译文] TMS320F28388D:将特定 CAN 外设从 CPU1传递到 CPU2

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/936675/tms320f28388d-passing-specific-can-peripheral-from-cpu1-to-cpu2

器件型号:TMS320F28388D

您好专家、

我们正在修改示例项目"cm_common_config_C28x.c"、以便将 CAN 外设的控制传递给 CPU2、我们的目标是让 CPU2使用 CANB。 我们按此配置、但似乎没有成功。 (CPU2 CANB 初始化失败)。

1.我们是否提供了有关如何将外设从 CPU1正确分配到 CPU2的示例? 它似乎使用不同的 API 来防止将外设传递到 CM 内核。

2.您能告诉我们我们我们是否正确了吗? 如果不是、您能帮助我们正确行事吗? (如下所示)

ifdef CANB
//
//为 CAN B 配置 GPIO
//
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);

//
//将共享外设 CAN B 分配给 CM 侧。
//
//sysctl_allocateSharedPeripheral (SYSCTL_PALLOCATE_CAN_B、0x1U);
SYSCTL_selectCPUForPeripheral (SYSCTL_CPUSEL8_CAN、1、SYSCTL_CPUSEL_CPU2);
#endif 

谢谢

谢尔登

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

    您好、Sheldon、

    让我以不同的方式回答该帖子、并让我知道这是否有意义:

    1.  只能 在 CPU1中将内核分配到外设。
      1. 如果将外设分配给 CPU2,请使用驱动程序函数 sysctl_selectCPUForPeripheral();
      2. 如果将外设分配给 CM,请使用 cm_common_config_C28x.c 文件中的驱动程序函数 sysctl_allocateSharedPeripheral()
    2. 上述驱动程序功能不启用外设时钟。  您应该为每个外设单独执行此操作、以便寄存器写入这些外设(如初始位设置)。  使用驱动程序函数 sysctl_enablePeripheral()来执行此操作 ,并且可以从 分配外设的内核调用此函数(例如:当 CANB 分配给 CPU2时,可以调用 SYSCtl_enablePeripheral (SYSCtl_Periph_CLK_CANiniti B),这应允许写入 CANB 寄存器,如 CAN_CTL 中的位)

    作为最佳做法、 在 步骤1中分配模块分配之前、首先禁用模块的外设时钟。

    此致、

    Joseph  

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

    您好、Joseph、

    以下是我对您的回答的反馈:

    1.  只能 在 CPU1中将内核分配到外设。
      1. 如果将外设分配给 CPU2,请使用驱动程序函数 sysctl_selectCPUForPeripheral();
      2. 如果将外设分配给 CM,请使用 cm_common_config_C28x.c 文件中的驱动程序函数 sysctl_allocateSharedPeripheral()

      当然、我们在 CPU1中使用此 API 来执行托管。 但该 API 只能使用参数"sysctl_CPUSEL8_CAN"传递、该参数未指定目标的 CAN 模式(CANA 或 CANB)。  

    2. 上述驱动程序功能不启用外设时钟。  您应该为每个外设单独执行此操作、以便寄存器写入这些外设(如初始位设置)。  使用驱动程序函数 sysctl_enablePeripheral()来执行此操作 ,并且可以从 分配外设的内核调用此函数(例如:当 CANB 分配给 CPU2时,可以调用 SYSCtl_enablePeripheral (SYSCtl_Periph_CLK_CANiniti B),这应允许写入 CANB 寄存器,如 CAN_CTL 中的位)

    我们在 CPU2上使用示例项目"CAN_Ex5_transmit _receive.c"、并且所有外设都是通过您提到的 API 启用的。 在这种情况下、CANA 的寄存器将写入 CPU2、而 CANB 将无法写入。  

     

    现在、我和我的客户都可以根据对 TI 示例项目的微小修改重现此问题。 这个问题只发生在 CANB 上、而不是发生在 CANA 上。 因此、我们不知道接下来要做什么。

    我可以通过 TI DRIVE 向您发送该测试程序。 它们可以在 TI LP 上轻松复制。 您能帮我们找到答案吗?

    谢谢

    谢尔登

     

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

    您好、Sheldon、

    很抱歉得到较晚的响应。我认为客户代码中的问题是在函数调用 sysctl_selectCPUForPeripheral()中,第二个参数是'1'。  它应该为"2"、以便将 CANB 正确分配给 CPU2。  下面是我根据您发送的内容尝试使用的简化代码:

    在 CPU1中、尝试以下基本代码、以便将 CANB 分配给 CPU2:

    //
    //初始化设备时钟和外设
    // Device_init()函数 Device_enableAllPeripherals ()为包括 CANA 和 CANB 在内的所有外设打开时钟
    device_init();
    
    //
    //为 CAN B 配置 GPIO
    //
    GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
    GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);
    
    //sysctl_resetPeripheral (sysctl_Periph_RES_CANB);
    //
    //将共享外设 CAN B 分配给 CM 侧。
    //
    SYSCTL_selectCPUForPeripheral (SYSCTL_CPUSEL8_CAN、2、SYSCTL_CPUSEL_CPU2);
    :
    : 

    在 CPU2中、尝试以下基本代码来配置 CANB:

    //
    //初始化设备时钟和外设
    //
    device_init();
    
    //
    //初始化 CAN 控制器
    //
    CAN_initModule (CANB_BASE);
    
    //
    //将 CAN 总线位速率设置为500kHz
    //有关如何设置的信息,请参阅驱动程序库用户指南
    //更严格的计时控制。 此外、请参阅器件数据表
    //了解有关 CAN 模块计时的更多信息。
    //
    CAN_setBitRate (CANB_BASE、DEVICE_SYSCLK_FREQ、50000、20);
    :
    : 

    请告诉我这是否可行。

    此致、

    Joseph