我在使用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);