Other Parts Discussed in Thread:TM4C123GE6PZ
你好,TM4C123GE6PZ的CAN0模块配置到PF0/PF3脚,无法进入CAN中断(总中断已开)。并且PF0脚也解锁了NMI功能,问题依旧。
源码
void CAN0Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);// 使能GPIO_F I/O外设 //PF0配置成GPIO需要先解锁 GPIO_PORTF_LOCK_R = GPIO_LOCK_KEY;
GPIO_PORTF_CR_R |= 0x01;
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); // 使能CAN0 GPIOPinConfigure(GPIO_PF0_CAN0RX); // 配置PF0脚为CAN0RX
GPIOPinConfigure(GPIO_PF3_CAN0TX); // 配置PF3脚为CAN0TX
GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_3); // 使能GPIO管脚 CANInit(CAN0_BASE); // CNA0初始化
CANBitRateSet(CAN0_BASE,
SysCtlClockGet(),
250000); // CAN比特率设置 50000 – 50kHz; 100000 – 100 kHz; 250000 – 250 kHz; 1000000 – 1000kHz CANIntEnable(CAN0_BASE,
CAN_INT_MASTER | CAN_INT_ERROR
| CAN_INT_STATUS); // 设置可以引起CAN中断的中断源(任何中断/错误中断/状态中断) CANEnable(CAN0_BASE); // CAN0通道使能
IntEnable(INT_CAN0); // 使能CAN0中断(NVIC嵌套中断)
//
//初始化配置message object,即待发送的报文
//配置好报文对象后调用CANMessageSet函数进行设置,报文就可以自动被发送出去 // //g_ui8TXMsgData = 0;
*(unsigned char *)ucCAN0MsgData = 0;
g_sCAN0TxMessage.ulMsgID = InclinationID; // InclinationID=0x1B 使用0x1B作为发送ID
g_sCAN0TxMessage.ulMsgIDMask = 0; // no mask needed for TX 不设置MASK屏蔽
g_sCAN0TxMessage.ulFlags = MSG_OBJ_TX_INT_ENABLE; // 使能发送中断
g_sCAN0TxMessage.ulMsgLen = sizeof(ucCAN0MsgData); // 信息位长,最长可达8位
g_sCAN0TxMessage.pucMsgData = ucCAN0MsgData; // 指向发送数据的指针
//g_sCAN0TxMessage.pucMsgData = (unsigned char *)&ucCAN0MsgData;// 指向发送数据的指针
//
// 初始化接收CAN信息的消息对象(只接受显示器发送数据)
//
g_sCAN0RxMessage.ulMsgID = 0x0730; // 设置0x0730只接受显示器消息
//g_sCAN0RxMessage.ulMsgID = 0; // 设置0可接受所有消息
g_sCAN0RxMessage.ulMsgIDMask = 0xffffffff; // 只接受显示器ID数据(只接收扩展帧)
//g_sCAN0RxMessage.ulMsgIDMask = 0xfffff; // 只接受显示器ID数据(接收扩展帧和标准帧)
//g_sCAN0RxMessage.ulMsgIDMask = 0; // 设置0可接受所有消息
//g_sCAN0RxMessage.ulFlags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER | MSG_OBJ_EXTENDED_ID); g_sCAN0RxMessage.ulFlags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER);// 使能接收中断和ID过滤
g_sCAN0RxMessage.ulMsgLen = 8; // 允许最多8个字节的数据
// 外设消息导入
CANMessageSet(CAN0_BASE, RXOBJECT, &g_sCAN0RxMessage, MSG_OBJ_TYPE_RX); // 将message object 2设置为接收报文对象}
void CAN0_IntHandler(void)
{
unsigned int ui32Status;
//读取中断状态
ui32Status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);// 读取完整的CAN控制器状态,CAN_INT_STS_CAUSE—表示终端产生的原因
if(ui32Status == CAN_INT_INTID_STATUS) //错误中断
{ ui32Status = CANStatusGet(CAN0_BASE, CAN_STS_CONTROL);// 读取完整CAN控制器状态
CAN0ErrCount = 20;
//将g_bErrFlag置1,表示有错误发生
g_ui32CAN0ErrFlag = 1;
}
else if(ui32Status == 1)// 发送中断
{
CANIntClear(CAN0_BASE,1);// 数据包发送已经完成,清除中断
//g_ui32CAN0TXMsgCount++;// 发收计数器
// 发送已经完成,清除所有的错误信息
g_ui32CAN0ErrFlag = 0;
}
else if(ui32Status == 2)// 接收中断
{
CANIntClear(CAN0_BASE,2);// 数据包接收已经完成,清除中断
g_bRXFlag = true; // 设置标志,表示收到消息等候
//CAN0receive();
// 发送已经完成,清除所有的错误信息
g_ui32CAN0ErrFlag = 0;
}
}
Susan Yang:
您使用的自己的板子还是开发板?使用TI例程的话是否可以成功进入中断?
,
user5051258:
使用自己开发的板子,初始化及中断部分在另外两块板子上使用正常, 但是I/O不是PF0/PF3。另外,没有测试TI例程
,
Susan Yang:
请参考下数据手册的说明,PF0有特殊说明