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.
工具与软件:
SDK 版本:9.2
当我们使用 AM62A7中的 MCU CAN0、MCU CAN1和 SOC CAN0时、我们发现只有 MCU CAN0可以正确地发送和接收 FD 帧 、并进行比特率切换。 当 MCU CAN1 配置为与 MCU CAN0相同的配置时、MCU CAN1无法 在进行比特率切换的情况下正确发送 FD 帧 (可以正常发送和接收标准消息)。
使用 ZLG 的 USBCANFD-200U 作为升序调试器件、并按如下所示设置通信参数:
协议标准: 启用具有比特率切换功能的 CAN FD ISO、FD 帧。 仲裁波特率:500kbps、数据 字段波特率2Mbps、 采样点为 80%。
使用 此配置、 可以正常发送和接收具有比特率切换功能的 MCU CAN0 FD 帧。
修改 MCU CAN1通信配置参数、使其与 MCU CAN0一致。 研究发现只能正常发送和接收标准消息、但 可以接受调试器件发送具有比特率切换功能的 CAN FD 帧。 当 MCU CAN1尝试发送 具有比特率切换功能的 CAN FD 帧时、中断
触发 MCAN_INTR_SRC_PROTOCOL_ERR_DATA。 发送比特率切换的 FD CAN FD 帧失败。
已初始化的配置参数:
您好!
您是否能够修改 MCAN 位时序参数中的 Tseg1和 Tseg2值并重试。 每个段中的时间量子数量都受到限制。
此致、
Aparna
您好、Aprna:
感谢你的帮助。
您的意思是修改数据字段 SP 百分比吗?
我试过60% 不起作用。 MCAN_INTR_SRC_PROTOCOL_ERR_DATA 中断 将处于活动状态。 ->总线关闭
和 75% 不起作用。 MCAN_INTR_SRC_PROTOCOL_ERR_DATA 将 处于活动状态。 ->总线关闭
还有80% 不起作用。 MCAN_INTR_SRC_PROTOCOL_ERR_DATA 将 处于活动状态。 ->总线关闭
您好!
我会检查并在几个小时内回复您。
此致、
Aparna
您好!
请先检查内部回送模式是否正常工作。
接下来、MCU_MCAN0和 MCU_MCAN1连接之间的硬件差异是什么?
当使用完全相同的代码时、一个 CAN 实例正在工作、而另一个实例却不工作、这是不常见的。
此外、请在您的 ZLG USBCANFD 软件上共享 MCAN 位时序参数设置。
此致、
Aparna
---请先检查内部回送模式是否正常工作。
首先、SDK 源代码环回不起作用。 我会再次检查它。
您的 MCU_MCAN0和 MCU_MCAN1连接之间的硬件差异是什么?
连接是相同的。 我尝试了很多 次。
--- ZLG USBCANFD 软件。
是的、am62a 的时钟 si 80MHz、 但 ZLG USBCANFD 的时钟为60MHz。、但比特率和 SP 相同。
您是否参考本文档来计算位参数: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/920090/faq-tda4vm-can-how-is-bit-rate-calculated-for-can
当时序参数不匹配时、会触发 MCAN_INTR_SRC_PROTOCOL_ERR_DATA 中断。
此致、
Aparna
嗨、Aparna
我 再次在 mcu_plus_sdk_am62ax_09_02_00_38/examples/drivers/mcan/mcan_loopback_polling/mcan_loopback_polling.c 上检查原始样本、
仅对于 MCU_CAN1:
/* MCAN Instance Macros */ #define CONFIG_MCAN0_BASE_ADDR (CSL_MCU_MCAN1_MSGMEM_RAM_BASE) #define CONFIG_MCAN0_INTR (46U) #define CONFIG_MCAN_NUM_INSTANCES (1U)
static void App_mcanConfigTxMsg(MCAN_TxBufElement *txMsg, uint32_t idx) { ....... MCAN_initTxBufElement(txMsg); /* Standard message identifier 11 bit, stored into ID[28-18] */ txMsg->id = ((APP_MCAN_EXT_ID + idx) & APP_MCAN_EXT_ID_MASK); txMsg->dlc = MCAN_DATA_SIZE_8BYTES; /* Payload size is 64 bytes */ txMsg->fdf = TRUE; /* Frame transmitted in CAN FD format */ txMsg->brs = TRUE; /* CAN FD frames transmitted with bit rate switching */ txMsg->xtd = TRUE; /* Extended id configured */ ...... }
MCAN_BitTimingParams gMcanBitTimingDefaultParams = { .nomRatePrescalar = 0x7U, .nomTimeSeg1 = 0x5U, .nomTimeSeg2 = 0x2U, .nomSynchJumpWidth = 0x0U, .dataRatePrescalar = 0x1U, .dataTimeSeg1 = 0x3U, .dataTimeSeg2 = 0x2U, .dataSynchJumpWidth = 0x0U, };
TQ 枚举值:(1+TSEG1 + TSEG2) =(1+6+3)=10、因此比特率:10m/10=1Mbps、SP:(1+6)/10 = 70%。
TQ 枚举:(1+TSEG1+TSEG2)=(1+4+3)=8 、所以比特率:40M/8=5Mbps、SP:(1+4)/8=62.5%。
结果:所有测试均已通过!!
MCAN_BitTimingParams gMcanBitTimingDefaultParams = { .nomRatePrescalar = 1, .nomTimeSeg1 = 62, .nomTimeSeg2 = 15, .nomSynchJumpWidth = 4, .dataRatePrescalar = 1, .dataTimeSeg1 = 14, .dataTimeSeg2 = 3, .dataSynchJumpWidth = 1, };
TQ 枚举:(1+TSEG1+TSEG2)=(1+63+16)=80 、所以比特率:40m/80=500Kbps、SP:(1+63)/80=80%。
TQ 枚举值:(1+TSEG1 + TSEG2)= (1+15+4)=20 、所以比特率:40m/20=2Mbps,SP:(1+15)/20=80% 。
结果: 所有测试均已通过!!
3.情况3:使用默认时序参数 Normal:1Mbps Data:5Mpbs、但禁用 CAN 环回模式。
MCAN_BitTimingParams gMcanBitTimingDefaultParams = { .nomRatePrescalar = 0x7U, .nomTimeSeg1 = 0x5U, .nomTimeSeg2 = 0x2U, .nomSynchJumpWidth = 0x0U, .dataRatePrescalar = 0x1U, .dataTimeSeg1 = 0x3U, .dataTimeSeg2 = 0x2U, .dataSynchJumpWidth = 0x0U, };
App_mcanConfig(TRUE);
结果:测试失败。(上部 CAN 调试器件设置为1Mbps 和5Mbps)、
此处封锁的代码:
嗨 Aparna、
我做其他测试:
仍然使用以下示例: mcu_plus_sdk_am62ax_09_02_00_38/examples/drivers/mcan/mcan_loopback_polling/mcan_loopback_polling.c
在轮询示例中、代码仅发送经典帧。 因此我修改 below4行代码、以使用 BRS 发送 CAN FD 帧:
和 时序参数:
当 CAN 实例为 CSL_MCU_MCAN0_MSGMEM_RAM_BASE (即 MCU_CAN0)时、 具有 BRS 发送功能的 CAN FD 电报良好。
您好!
您能否共享 PSR 的寄存器转储以了解触发了什么错误?
此致、
Aparna
bitPos = (1U << fifoStartIdx); /* Poll for Tx completion */ uint32_t mcu_PSR = 0; do { txStatus = MCAN_getTxBufTransmissionStatus(gMcanBaseAddr); mcu_PSR = HW_RD_REG32(0x04E18044); DebugP_log("mcu_PSR:0X%02x\r\n", mcu_PSR); appLogWaitMsecs(1000u); } while ((txStatus & bitPos) != bitPos);
结果:
[MCU1_0] 2699.930199 s: [MCAN] Loopback Polling mode, application started ... [MCU1_0] 2699.931499 s: mcu_PSR:0X707 [MCU1_0] 2700.931280 s: mcu_PSR:0Xf040f [MCU1_0] 2701.931353 s: mcu_PSR:0Xf070f [MCU1_0] 2702.931431 s: mcu_PSR:0Xf070f [MCU1_0] 2703.931511 s: mcu_PSR:0Xf070f [MCU1_0] 2704.931589 s: mcu_PSR:0Xf070f [MCU1_0] 2705.931669 s: mcu_PSR:0Xf070f [MCU1_0] 2706.931746 s: mcu_PSR:0Xf070f [MCU1_0] 2707.931824 s: mcu_PSR:0Xf070f [MCU1_0] 2708.931905 s: mcu_PSR:0Xf070f [MCU1_0] 2709.931983 s: mcu_PSR:0Xf070f [MCU1_0] 2710.932060 s: mcu_PSR:0Xf070f [MCU1_0] 2711.932148 s: mcu_PSR:0Xf070f [MCU1_0] 2712.932225 s: mcu_PSR:0Xf070f [MCU1_0] 2713.932305 s: mcu_PSR:0Xf070f [MCU1_0] 2714.932381 s: mcu_PSR:0Xf070f [MCU1_0] 2715.932460 s: mcu_PSR:0Xf070f
正常:500K、数据:2M
MCAN_BitTimingParams gMcanBitTimingDefaultParams = { .nomRatePrescalar = 1, .nomTimeSeg1 = 62, .nomTimeSeg2 = 15, .nomSynchJumpWidth = 4, .dataRatePrescalar = 1, .dataTimeSeg1 = 14, .dataTimeSeg2 = 3, .dataSynchJumpWidth = 1, };
似乎没有触发任何错误。
是否要使用 syscfg 将 MCAN 实例更改为 MCU_MCAN1并重新编译示例?
默认情况下、该示例支持 MCU_MCAN0实例、因此相关配置(例如中断号)与 MCU_MCAN0相关联。
似乎没有触发任何错误。
--- 也许你错了。 第一次转储 TDC 为0、第二次转储 DLEC 为4、、即数据 BIT1错误、TDC 已更改为0xF。 所配置的 CPU。 TDC 设置为0。
--- 是否要使用 syscfg 将 MCAN 实例更改为 MCU_MCAN1并重新编译示例?
我会再试一次。 奇怪的是、对于 CAN0、配置相同、CAN0实例运行良好。 但 CAN1没有。
您好、Aprana、
我尝试 使用 SysConfig 工具({rtos_SDK}/sysconfig_1.19.0/sysconfig_GUI.sh)打开{rtos_sdk_path}/vision_apps/platform/am62a/rtos/mcu1_0/example.syscfg 、然后重新添加 MCU-CAN1:
当 make SDK 如此错误才会抛出错误:
因此 我禁用并删除 UART 调试模块、同时保持 CAN 模块启用:
如下所示的错误:
我不知道为什么。
下面是我的 example.config:
/** * These arguments were used when this file was generated. They will be automatically applied on subsequent loads * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments. * @cliArgs --device "AM62Ax" --package "AMB" --part "Default" --context "mcu-r5fss0-0" --product "MCU_PLUS_SDK_AM62Ax@09.02.00" * @versions {"tool":"1.19.0+3426"} */ /** * Import the modules used in this configuration. */ const mcan = scripting.addModule("/drivers/mcan/mcan", {}, false); const mcan1 = mcan.addInstance(); const clock = scripting.addModule("/kernel/dpl/clock"); const debug_log = scripting.addModule("/kernel/dpl/debug_log"); const mpu_armv7 = scripting.addModule("/kernel/dpl/mpu_armv7", {}, false); const mpu_armv71 = mpu_armv7.addInstance(); const mpu_armv72 = mpu_armv7.addInstance(); const mpu_armv73 = mpu_armv7.addInstance(); const mpu_armv74 = mpu_armv7.addInstance(); const mpu_armv75 = mpu_armv7.addInstance(); const mpu_armv76 = mpu_armv7.addInstance(); const mpu_armv77 = mpu_armv7.addInstance(); const mpu_armv78 = mpu_armv7.addInstance(); const mpu_armv79 = mpu_armv7.addInstance(); /** * Write custom configuration values to the imported modules. */ mcan1.$name = "CONFIG_MCAN1"; mcan1.MCU_MCAN.$assign = "MCU_MCAN1"; mcan1.MCU_MCAN.RX.$assign = "MCU_MCAN1_RX"; mcan1.MCU_MCAN.TX.$assign = "MCU_MCAN1_TX"; mpu_armv71.allowExecute = false; mpu_armv71.$name = "REGISTER_REGION"; mpu_armv71.tex = 0; mpu_armv71.isCacheable = false; mpu_armv71.attributes = "CUSTOM"; mpu_armv71.isBufferable = false; mpu_armv72.$name = "TCMA_VEC"; mpu_armv72.size = 15; mpu_armv72.attributes = "CUSTOM"; mpu_armv72.tex = 5; mpu_armv72.isCacheable = false; mpu_armv73.baseAddr = 0x80000000; mpu_armv73.size = 31; mpu_armv73.$name = "DDR"; mpu_armv73.attributes = "CUSTOM"; mpu_armv73.tex = 5; mpu_armv73.isCacheable = false; mpu_armv74.baseAddr = 0x41010000; mpu_armv74.size = 15; mpu_armv74.$name = "TCMB"; mpu_armv74.attributes = "CUSTOM"; mpu_armv74.isCacheable = false; mpu_armv74.isBufferable = false; mpu_armv74.tex = 4; mpu_armv75.baseAddr = 0x50000000; mpu_armv75.$name = "FSS_DAT"; mpu_armv75.size = 27; mpu_armv75.attributes = "CUSTOM"; mpu_armv75.tex = 5; mpu_armv75.isCacheable = false; mpu_armv76.baseAddr = 0x9C800000; mpu_armv76.size = 21; mpu_armv76.$name = "IPC_VRING_RESOURCE_TABLE_LINUX"; mpu_armv76.attributes = "CUSTOM"; mpu_armv76.tex = 0; mpu_armv76.isCacheable = false; mpu_armv76.isBufferable = false; mpu_armv76.allowExecute = false; mpu_armv77.baseAddr = 0xA0000000; mpu_armv77.allowExecute = false; mpu_armv77.$name = "IPC_RTOS_VRING_TIOVX"; mpu_armv77.attributes = "CUSTOM"; mpu_armv77.isCacheable = false; mpu_armv77.isBufferable = false; mpu_armv77.tex = 0; mpu_armv77.size = 24; mpu_armv78.$name = "TIOVX_RUN_TIME_LOGGING1"; mpu_armv78.allowExecute = false; mpu_armv78.attributes = "CUSTOM"; mpu_armv78.isCacheable = false; mpu_armv78.isBufferable = false; mpu_armv78.tex = 0; mpu_armv78.baseAddr = 0xA1000000; mpu_armv78.size = 24; mpu_armv79.$name = "TIOVX_RUN_TIME_LOGGING2"; mpu_armv79.allowExecute = false; mpu_armv79.attributes = "CUSTOM"; mpu_armv79.isCacheable = false; mpu_armv79.isBufferable = false; mpu_armv79.tex = 0; mpu_armv79.baseAddr = 0xA2000000; mpu_armv79.size = 24;
您能告诉我如何解决此问题吗?
您是否曾尝试使用 MCU+ SDK 并在其中构建库和示例?
MCU + SDK: https://www.ti.com/tool/download/MCU-AM62A/10.00.00.14 MCU-PLUS-SDK
此致、
Aparna
尊敬的 Aparna:
感谢你的帮助。
我已经解决了这个问题。
您好!
您能否分享一下、您是如何解决该问题的?
此致、
Aparna
是的、当然可以。
基于此转储信息。
第一次转储是正常的。 第二次转储不正确(TDC 值被修改、BIT1错误。)。 我想这可能与 TDC 函数有关。 我尝试禁用 TDC、这样 CAN1实例使用 BRS 发送 FD 帧也可以。
运转相当正常。 当 BRS 启用且数据字段比特率>= 2Mpbs 时、TDC 应启用。
另外、之前我 在 TDA4-entry 和 TDA4-eco 定制的 TJA1051TK 收发器上使用过、但 启用 TDC 时、它能与 BRS 良好配合使用。 我不知道为什么它在 AM62A 上不起作用。
顺便说一下如何 在 TDCR 寄存器中计算和配置 TDCO 和 TDCF、 我在 TRM 中找不到详细说明。 什么是 TDCF? 它是 TDCO 的阈值吗?
您好!
用作辅助采样点(SSP)的传输延迟补偿值(TDCV)由 CAN 控制器自动选择。 控制器测量在 m_can_tx 上驱动显性信号到相应边沿出现在 m_can_rx 上(每个 tq 采样)之间的延迟。 在 CAN FD 帧的每次传输时、该测量值在协议状态寄存器(PSR 地址= h1044)的 TDCV 字段中进行更新、它用作参考、并在 CAN FD 传输的数据部分用于验证良好的传输。
可以使用发送器延迟补偿偏移(TDCO)和滤波器窗口长度(TDCF)将 CAN 控制器选择的 SSP 限制在特定的窗口内。 偏移量提供了额外的时间份额、要添加到 CAN 控制器的延迟测量中。 滤波器窗口长度定义了最小有效延迟测量值、以确保 SSP 大于此处定义的值。 这些值可以在发送器延迟补偿寄存器(TDCR 地址= h1048)中进行配置。
此致、
Aparna