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.

TM4C123 CAN滤波器配置问题

Other Parts Discussed in Thread: TM4C123AH6PM

我在使用TM4C123 CAN的时候发现发送正常滤波器不起作用,请问是什么原因呢?

CAN数据发送正常,对方正常接收数据比对也正是对方想要数据。对方也正常做了响应。

错误的地方就是滤波器不起作用。请帮忙分析。

下附源码(根据官方全程修改):

CAN1初始化函数:

void CAN1_Init(uint32_t baud)
{
           /*外设时钟使能*/
          ROM_SysCtlPeripheralEnable(CAN1_BASE);
          ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

HWREG(SDK_CAN1RxPinPort + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(SDK_CAN1RxPinPort + GPIO_O_CR) = GPIO_PIN_0;
ROM_GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_0);
HWREG(SDK_CAN1RxPinPort + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(SDK_CAN1RxPinPort + GPIO_O_CR) = 0x00;
HWREG(SDK_CAN1RxPinPort + GPIO_O_LOCK) = 0;

HWREG(SDK_CAN1TxPinPort + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(SDK_CAN1TxPinPort + GPIO_O_CR) = GPIO_PIN_1;
ROM_GPIOPinTypeCAN(GPIO_PORTA_BASE, GPIO_PIN_1);
HWREG(SDK_CAN1TxPinPort + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(SDK_CAN1TxPinPort + GPIO_O_CR) = 0x00;
HWREG(SDK_CAN1TxPinPort + GPIO_O_LOCK) = 0;

/*相关引脚IO功能配置*/
ROM_GPIOPinConfigure(GPIO_PA0_CAN1RX);
ROM_GPIOPinConfigure(GPIO_PA1_CAN1TX);

/*CAN控制器配置*/
ROM_CANInit(CAN1_BASE);
ROM_CANBitRateSet(CAN1_BASE, ROM_SysCtlClockGet(), baud);
ROM_CANIntEnable(CAN1_BASE, SDK_CAN1IntSrc);
ROM_IntEnable(INT_CAN1);
ROM_CANEnable(CAN1_BASE);

}

滤波器配置函数:

void CAN1_Config2Filter(uint16_t Id1, uint16_t Id2)

{

          tCANMsgObject l_RxCANMessage;

          l_RxCANMessage.ui32MsgID = Id1;
          l_RxCANMessage.ui32MsgIDMask = 0xFFFFFFFF;
          l_RxCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
          l_RxCANMessage.ui32MsgLen = 8;

          ROM_CANMessageSet(CAN1_BASE, 2, &l_RxCANMessage, MSG_OBJ_TYPE_RX);

          l_RxCANMessage.ui32MsgID = Id2;
          l_RxCANMessage.ui32MsgIDMask = 0xFFFFFFFF;
          l_RxCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
          l_RxCANMessage.ui32MsgLen = 8;

          ROM_CANMessageSet(CAN1_BASE, 3, &l_RxCANMessage, MSG_OBJ_TYPE_RX);

}

发送函数:

void CAN1_SendFrame(tCANMsgObject CanFrame)

{

          tCANMsgObject l_TxCANMessage;

          l_TxCANMessage.ui32MsgID = CanFrame.ui32MsgID;
          l_TxCANMessage.ui32MsgIDMask = 0;
          l_TxCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
          l_TxCANMessage.ui32MsgLen = CanFrame.ui32MsgLen;
          l_TxCANMessage.pui8MsgData = CanFrame.pui8MsgData;

          ROM_CANMessageSet(SDK_CAN1, SDK_CAN2TxMsgProj, &l_TxCANMessage, MSG_OBJ_TYPE_TX);

}

调用顺序:

CAN1_Init(500000);

CAN1_Config2Filter(0x101, 0x102);

CAN1_SendFrame(CanFrame);