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.

[参考译文] CCS/TM4C1294NCPDT:CAN 消息 ID 过滤器不工作

Guru**** 2482225 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/722666/ccs-tm4c1294ncpdt-can-message-id-filter-not-working

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

我要设置的 CAN 代码如下所示、我的问题是:

我只想在收到 ID = 2001的消息时触发 g_bRXFlag1、因此我使用 idmask = FFFF、但所发生的情况是每次收到消息时 g_bRXFlag1都是触发器

void setupCAN1() 
{ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
SysPeripheralEnable (SYSCTL_Periph_GPIOB);GPSCL_GPIO1

(GPIOPINB0_Configure);GPCTL_GPIO1 (CANCTL_GPIO_Configure)
GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
SysCtlPeripheralDisable (SYSCTL_Periph_CAN1);
SysCtlPeripheralReset (SYSCTL_Periph_CAN1);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);CANCtlInbase
(CAN1);CANCtlPeripheralEnable)
CANBitRateSet (CAN1_base、ui32SysClock、50000);
CANIntRegister (CAN1_base、CAN1IntHandler);
CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);IntEnable (INT_CAN1);
CANEnable (CAN1_base);
sCANMessage.ui32MsgID = 0x00002001;
sCANMessage.ui32MsgIDMask = 0x0000FFFF;
sCANMessage.ui32Flags =(MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER);
sCANMessage.ui32MsgLen = 8;
CANMessageSet (CAN1_base、1、&sCANMessage、 MSG_OBJ_TYPE_RX);
}

void CAN1IntHandler (void)
{unsigned long status = CANIntStatus (CAN1_base、CAN_INT_STS_CAUST);
//读取中断状态
if (status = CAN_INT_INTID_STATUS)
{//控制器状态中断
STATUS = CANStatusGet (CAN1_BASE、CAN_STS_CONTROL);
G_bErrFlag = 1;
}
否则(status = 1)
{// msg 对象1
CANIntClear (CAN1_base、1);//清除中断
G_bRXFlag1 = 1;//设置 Rx 标志
G_bErrFlag = 0;//清除任何错误标志
}
否则
{
//永远不会发生
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、您的测试和代码看起来都是格式化为代码的。 我尝试更正了、但我丢失了、并尝试在您的代码中重新创建退货。 这可能不是您最初发布的内容。

    您使用的标识符不适合11位。 如果系统也使用11位标识符、则可能还需要包含标志 MSG_OBJ_USE_EXT_FILTER。 您的文本提示您将 idmask 设置为 FFFF、但在代码中您可以设置为0x00001111。 请确保您的掩码为20位、因为您的 ID 大于11位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob Crosby、大家好、感谢您的回复和帮助、我设法解决了这个问题、下面是我的项目应该做的事情、在编写本文档时、我提出了解决方案、因为下面介绍的内容不能使用 ID 的十进制声明、 我必须使用十六进制声明、如下面的代码所示、因此在这样的情况下、它的工作方式符合我的要求、  

    sCANMessage.ui32MsgID = 0x7D1;
    sCANMessage.ui32MsgIDMask = 0xFFF; 

    我在这里让下面的文本帮助理解我的问题以及我如何解决它、目的是帮助其他人。

    为了更好地了解我的项目、我必须通过 CANBUS 协议更改消息、 我正在使用具有 TM4C1294NCPDT 处理器和 Raspberry PI 3的器件、目标是 RPI3将命令发送到 ID 为2001的 CANBUS、并且可以存在更多连接到 CANBUS 的器件、但只有具有正确 ID 的器件才会响应。 但是、如果 RPI 发送一个广播 ID、这意味着(从我读取的内容中)、一个 ID = 0、每个器件应该对此做出反应。  

    知道我正在通过 CAN 在 RPI3中手动发送消息,使用以下命令 cansend CAN0 7D1#, 我知道我的 CANBUS 协议在 RPI3中正常工作,我已经通过将消息从器件发送到 RPI3对其进行了测试 (但并非相反、这正是我尝试做的)、但我要通过以十六进制(7D1)十六进制->(2001)十进制形式声明 ID 来阐明这一点、这可能会导致与器件发生某种冲突。

    sCANMessage.ui32MsgID = 0x2001;
    sCANMessage.ui32MsgIDMask = 0xFFFF;
    sCANMessage.ui32Flags =(MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER | MSG_OBJ_USE_EXT_FILTER); 

    TM4C1294NCPDT

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、我最后解决了一个问题、遇到了另一个问题...

    现在我的问题是:
    我能够通过 canbus 接收消息、但它们不正确、例如。 我以十六进制形式向器件发送一个00000000的数据帧、但在器件中收到一个十六进制的20030780数据帧。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    接收到的 ID 是否与发送的 ID 相匹配? 您是否能够使用解码 CAN 协议的逻辑分析仪查看 CAN 总线? 这将确定是否实际发送了正确的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现问题了、问题就是我。

    每个东西都可以正常工作、但我看到了错误的变量、在下面的代码写入中、声明了将引用 cantus 数据缓冲区的变量。

    msgObjectRx.pui8MsgData = msgData;
    
    CANMessageSet (CAN1_base、1、&msgObjectRx、MSG_OBJ_TYPE_RX); //现在将消息对象加载到中 

    我不是查看变量  msgData 的值、 而是查看变量  pui8MsgData 的值、在该变量中、这些值与我发送的内容毫无关系。

    谢谢你们的帮助、我希望这能以某种方式帮助任何人。