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.

[参考译文] TMS320F280025:如何进行初始化以接收不同的 CAN 数据包?

Guru**** 2562120 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1109123/tms320f280025-how-to-do-initialization-to-receive-different-can-packets

器件型号:TMS320F280025
主题中讨论的其他器件:C2000WARE

大家好

我们发现、我们只能接收在初始化中设置了 ID 的特殊 CAN 数据包(实际上、我们希望接收所有 CAN 数据包并过滤我们希望自己使用的 CAN ID)。 如何在没有任何滤波器的情况下接收所有 CAN 数据包?

以下是初始化函数:

空 BmuCanInit (空)

unsigned int i;
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CANA);
CAN_selectClockSource (CANA_base、CAN_CLOCK_SOURCE_SYS);
CAN_enableController (CANA_base);
GPIO_setPinConfig (GPIO_12_CANA_RX);
GPIO_setPinConfig (GPIO_13_CANA_TX);
CAN_initModule (CANA_base);
//
//为每个模块将 CAN 总线位速率设置为500kHz
//有关如何设置的信息,请参阅驱动程序库用户指南
//更严格的计时控制。 此外、请参阅器件数据表
//了解有关 CAN 模块计时的更多信息。
//
//CAN_setBitRate (CANA_base、DEVICE_SYSCLK_FREQ、250000、20);
CAN_setBitTiming (CANA_base、19、0、13、4、 3);

//
//在 CAN 外设上启用中断。
//
CAN_enableInterrupt (CANA_base、CAN_INT_IE0 | CAN_INT_ERROR |
CAN_INT_STATUS);

//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//这在 PIE 矢量表中注册中断处理程序。
//
interrupt_register (INT_CANA0、canaISR);

CAN_setupMessageObject (CANA_base、1、0x18123456CAN_MSG_FRAME_EXT、
CAN_MSG_OBJ_TYPE_RX、0、CAN_MSG_OBJ_RX_INT_ENABLE、
8);

for (i=2;i<17;i++)

CAN_setupMessageObject (CANA_base、I、0、CAN_MSG_FRAME_EXT、
CAN_MSG_OBJ_TYPE_RX、0、CAN_MSG_OBJ_RX_INT_ENABLE、
8);

INTERRUPT_ENABLE (INT_CANA0);
CAN_enableGlobalInterrupt (CANA_base、CAN_GLOBAL_INT_CANINT0);

ISR

_interrupt void canaISR (void)

uint32_t status;
CAN_MsgFrameType RecvType = CAN_MSG_FRAME_STD;
u32 ID=0;
U8 RecvData[16];

//
//读取 CAN-B 中断状态以查找中断原因
//
状态= CAN_getInterruptCus层(CANA_base);

//
//如果原因是控制器状态中断,则获取状态
//
if (status =CAN_INT_INT0ID_STATUS)

//
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。
//
状态= CAN_getStatus (CANA_base);
//
//检查是否发生错误。
//

否则(((status > 16)&&(status < 33))

//
//到达这一点意味着 TX 中断发生在上
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
//
CAN_clearInterruptStatus (CANA_base、status);

//
//递增计数器以跟踪已有多少消息
//已发送。 在实际应用中、这可用于将标志设置为
//指示消息的传输时间。
//
txMsgCount++;

否则 if ((status <= 16)&&(status >0))

//
//获取收到的消息
//
CAN_readMessageWithID (CANA_base、status、&RecvType、&ID、(uint16_t*)(&RecvData[4]);
RecvData[0]=(U8) ID;
RecvData[1]=(U8)(ID>>8);
RecvData[2]=(U8)(ID>>16);
RecvData[3]=(U8)(ID=>24);
//CAN_readMessage (CANA_base、status、RecvData);
//
//到达这一点意味着 RX 中断发生在上
//消息对象1和消息 RX

我们只能接收 ID  为0x18123456的 CAN 数据包、不能接收其他 CAN 数据包。

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

    您好!

    感谢您的提问。 请从 C2000Ware 中查看并运行"CAN_EX8_MASK.c"。 它具有您所请求的所有过滤和屏蔽所需的代码。 如果未修改的示例不起作用、则设置有问题。

    此致、

    Vince