主题中讨论的其他器件: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、0x18123456、CAN_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 数据包。