工具与软件:
您好!
我在一条 CAN 总线上连接了多个 ISK、设置以下值后、我能够从传感器接收数据、没有任何问题:
mcanCfgParams->errInterruptEnable = 0U
mcanCfgParams->dataInterruptEnable = 0U
但是、我现在无法向传感器发送任何数据。 一位 e2e 用户同事在 本主题中提到 、他们发现了一个配置、可以用于发送和接收来自多个传感器的数据。
我想知道需要在配置中设置的确切值。
非常感谢您的任何帮助
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.
工具与软件:
您好!
我在一条 CAN 总线上连接了多个 ISK、设置以下值后、我能够从传感器接收数据、没有任何问题:
mcanCfgParams->errInterruptEnable = 0U
mcanCfgParams->dataInterruptEnable = 0U
但是、我现在无法向传感器发送任何数据。 一位 e2e 用户同事在 本主题中提到 、他们发现了一个配置、可以用于发送和接收来自多个传感器的数据。
我想知道需要在配置中设置的确切值。
非常感谢您的任何帮助
嗨、Rami、
感谢您提出在我们的器件上使用 CAN 的问题。 我需要更深入地了解您是如何发送和接收数据的。 当前的 mcanCfgParams、mcanBitTimingParams 和 rxMsgObjectParams 是什么? 接收时、您是轮询 NDAT 寄存器还是 FIFO 状态寄存器的更改?
您是否已浏览过 《雷达工具箱 CAN 集成指南》中包含的用户指南和示例项目? 在 SDK 3器件的 CAN 集成部分下、有几个有关使用 CAN 驱动程序的有用信息位。 这已经过发送和接收 CAN 数据的测试、尽管仅在具有两个 CAN 节点(包括6843本身)的总线上进行。
此致、
Kristien
您好、Kristien、
感谢您的答复。 以下是我当前使用的设置:
mcanCfgParams->fdMode = 0x1U; mcanCfgParams->brsEnable = 0x1U; mcanCfgParams->txpEnable = 0x0U; mcanCfgParams->efbi = 0x0U; mcanCfgParams->pxhddisable = 0x0U; mcanCfgParams->darEnable = 0x1U; mcanCfgParams->wkupReqEnable = 0x1U; mcanCfgParams->autoWkupEnable = 0x1U; mcanCfgParams->emulationEnable = 0x0U; mcanCfgParams->emulationFAck = 0x0U; mcanCfgParams->clkStopFAck = 0x0U; mcanCfgParams->wdcPreload = 0x0U; mcanCfgParams->tdcEnable = 0x1U; mcanCfgParams->tdcConfig.tdcf = 0U; mcanCfgParams->tdcConfig.tdco = 8U; mcanCfgParams->monEnable = 0x0U; mcanCfgParams->asmEnable = 0x0U; mcanCfgParams->tsPrescalar = 0x0U; mcanCfgParams->tsSelect = 0x0U; mcanCfgParams->timeoutSelect = CANFD_MCANTimeOutSelect_CONT; mcanCfgParams->timeoutPreload = 0x0U; mcanCfgParams->timeoutCntEnable = 0x0U; mcanCfgParams->filterConfig.rrfe = 0x1U; mcanCfgParams->filterConfig.rrfs = 0x1U; mcanCfgParams->filterConfig.anfe = 0x1U; mcanCfgParams->filterConfig.anfs = 0x1U; mcanCfgParams->msgRAMConfig.lss = 127U; mcanCfgParams->msgRAMConfig.lse = 64U; mcanCfgParams->msgRAMConfig.txBufNum = 32U; mcanCfgParams->msgRAMConfig.txFIFOSize = 0U; mcanCfgParams->msgRAMConfig.txBufMode = 0U; mcanCfgParams->msgRAMConfig.txEventFIFOSize = 0U; mcanCfgParams->msgRAMConfig.txEventFIFOWaterMark = 0U; mcanCfgParams->msgRAMConfig.rxFIFO0size = 0U; mcanCfgParams->msgRAMConfig.rxFIFO0OpMode = 0U; mcanCfgParams->msgRAMConfig.rxFIFO0waterMark = 0U; mcanCfgParams->msgRAMConfig.rxFIFO1size = 64U; mcanCfgParams->msgRAMConfig.rxFIFO1waterMark = 64U; mcanCfgParams->msgRAMConfig.rxFIFO1OpMode = 64U; mcanCfgParams->eccConfig.enable = 1; mcanCfgParams->eccConfig.enableChk = 1; mcanCfgParams->eccConfig.enableRdModWr = 1; mcanCfgParams->errInterruptEnable = 1U; mcanCfgParams->dataInterruptEnable = 1U; mcanCfgParams->appErrCallBack = sblErrStatusCallback; mcanCfgParams->appDataCallBack = sblDataCallback;
mcanBitTimingParams.nomBrp = 0x2U; mcanBitTimingParams.nomPropSeg = 0x8U; mcanBitTimingParams.nomPseg1 = 0x6U; mcanBitTimingParams.nomPseg2 = 0x5U; mcanBitTimingParams.nomSjw = 0x1U; mcanBitTimingParams.dataBrp = 0x1U; mcanBitTimingParams.dataPropSeg = 0x2U; mcanBitTimingParams.dataPseg1 = 0x2U; mcanBitTimingParams.dataPseg2 = 0x3U; mcanBitTimingParams.dataSjw = 0x1U;
/* Setup the receive message object for receiving data packets. */ rxMsgObject2Params.direction = CANFD_Direction_RX; rxMsgObject2Params.msgIdType = CANFD_MCANXidType_11_BIT; rxMsgObject2Params.msgIdentifier = SBL_CANFD_DATA_MSG_ID; rxMsgObj2Handle = CANFD_createMsgObject(canHandle, &rxMsgObject2Params, &errCode); if (rxMsgObj2Handle == NULL) { SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode); return; } /* Setup the receive message object for receiving terminate packets. */ rxMsgObject3Params.direction = CANFD_Direction_RX; rxMsgObject3Params.msgIdType = CANFD_MCANXidType_11_BIT; rxMsgObject3Params.msgIdentifier = SBL_CANFD_TERMINATE_MSG_ID; rxMsgObj3Handle = CANFD_createMsgObject(canHandle, &rxMsgObject3Params, &errCode); if (rxMsgObj3Handle == NULL) { SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode); return; } /* Setup the receive message object for receiving start packets. */ rxMsgObject4Params.direction = CANFD_Direction_RX; rxMsgObject4Params.msgIdType = CANFD_MCANXidType_11_BIT; rxMsgObject4Params.msgIdentifier = SBL_CANFD_START_MSG_ID; rxMsgObj4Handle = CANFD_createMsgObject(canHandle, &rxMsgObject4Params, &errCode); if (rxMsgObj4Handle == NULL) { SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode); return; }
至于发送数据、我将在微控制器上使用以下代码:
#include <linux/can.h> #include <linux/can/raw.h> bool sendFrame(const canfd_frame &frame) { if (write(sock_, &frame, sizeof(struct canfd_frame)) < 0) { return false; } return true; }
接收时、是否轮询 NDAT 寄存器或 FIFO 状态寄存器的更改?
不,我不知道你这么说是什么意思。 你想解释一下吗?
[报价 userid="567309" url="~/support/sensors-group/sensors/f/sensors-forum/1371077/iwr6843isk-issues-when-handling-mutliple-sensors-on-one-can-bus/5236298 #5236298"]您是否仔细阅读了 《雷达工具箱 CAN 集成指南》中包含的用户指南和示例项目?[/QUOT]感谢提示、我将查看它。
再次感谢您的帮助。
嗨、Rami、
感谢您发送所需的信息! 我需要更多时间来审核您发送的内容、但我明天会向您发送更新。 关于轮询注释、 您在帖子中提到数据和错误中断使能设置为零、这意味着接收消息不会触发中断。 因此、我想您可能一直在使用轮询方法(即持续检查)来监测 NDAT 寄存器(新数据-由缓冲器接收新数据触发)或 FIFO 状态寄存器(当收到消息时、填充级别应增大)。
此致、
Kristien
嗨、Rami、
我仔细看了一下您发送的代码片段、发现没有任何固有的错误、但我们可以研究一些内容。 首先、根据数据位时序参数、我注意到您使用了与标称采样点不同的采样点(62.5%、标称采样点75%)。 采样点减小是否有特定的原因? 许多时序因素(如比特率和采样点)取决于总线拓扑。 例如、随着总线长度的增加、位速率应减小、采样点应增大。 通常建议为数据和标称时序使用87.5%的采样点。
这也给我带来了另一个问题:您是否已验证以下内容?
如果考虑了之前的注释、我建议将示波器或逻辑分析仪直接连接到 CAN 总线、以查看 信号是否正确传播、即正确的电压电平、位时序、消息确认等
此致
Kristien