📄 can.c
字号:
break;
}
}
/************************************************************************************
功能:软件复位CAN控制器,禁止CAN,允许向相关寄存器写入数据
参数:CanNum -- CAN1、CAN2、CAN3或CAN4
调用本函数的函数:void CAN_Init(eCANNUM CanNum, CAN_Setting * setting) 初始化CAN
返回值:无
*************************************************************************************/
__inline void CAN_SoftRst(eCANNUM CanNum)
{
regCANMOD(CanNum) |= 0x01; /* CANMOD.RM = 1, CAN复位模式 */
}
/************************************************************************************
功能:软件使能(启动)CAN控制器
参数:CanNum -- CAN1、CAN2、CAN3或CAN4
调用本函数的函数:void CAN_Init(eCANNUM CanNum, CAN_Setting * setting) 初始化CAN
返回值:无
*************************************************************************************/
__inline void CAN_SoftEn(eCANNUM CanNum)
{
regCANMOD(CanNum) &= 0xbe; /* CANMOD.RM = 0,(未使用位CANMOD.6写入0),CAN正常工作模式 */
}
/************************************************************************************
功能:释放接收缓冲区,若接收到的帧可用,释放以接收下一帧信息
参数:CanNum -- CAN1、CAN2、CAN3或CAN4
调用本函数的函数:__irq void CAN1_Rx_Exception(void) CAN1发送中断服务
__irq void CAN2_Rx_Exception(void) CAN2发送中断服务
__irq void CAN3_Rx_Exception(void) CAN3发送中断服务
__irq void CAN4_Rx_Exception(void) CAN4发送中断服务
返回值:无
*************************************************************************************/
__inline void CAN_RelRecBuf(eCANNUM CanNum)
{
regCANCMR(CanNum) |= 0x04; /* CANCMR.RRB = 1 */
}
/************************************************************************************
功能:清除数据溢出
参数:CanNum -- CAN1、CAN2、CAN3或CAN4
返回值:无
*************************************************************************************/
__inline void CAN_ClrDataOver(eCANNUM CanNum)
{
regCANCMR(CanNum) |= 0x08; /* CANCMR.CDO = 1 */
}
/************************************************************************************
功能:CAN控制器出现总线关闭错误处理
参数:CanNum -- CAN1、CAN2、CAN3或CAN4
返回值:无
备注:有待研究
*************************************************************************************/
__inline void Can_BufOffLinePrg(eCANNUM CanNum)
{
if ((regCANMOD(CanNum) & 0x01) != 0) /* CANMOD.RM = 1,CAN复位模式,CAN被禁止 */
{
regCANGSR(CanNum) = 0; /* 有到CAN控制器的信息未被发送,以及有发送请求未被处理(不大理解?)*/
regCANMOD(CanNum) &= 0xbe; /* CANMOD.RM = 0,CAN正常工作 */
regCANCMR(CanNum) = 0x02; /* CANCMR.AT = 1,中止发送 */
}
}
/************************************************************************************
功能:使CAN控制器进入休眠模式
参数:CanNum -- CAN1、CAN2、CAN3或CAN4
返回值:无
*************************************************************************************/
__inline void Can_EntrySM(eCANNUM CanNum)
{
regCANMOD(CanNum) |= 0x10; /* CANMOD.SM = 1 进入睡眠模式 */
}
/************************************************************************************
功能:使CAN控制器退出休眠模式
参数:CanNum -- CAN1、CAN2、CAN3或CAN4
调用本函数的函数:uint32 CAN_WriteTxBuf(eCANNUM CanNum) 发送缓冲区数据
返回值:无
*************************************************************************************/
__inline void Can_QuitSM(eCANNUM CanNum)
{
regCANMOD(CanNum) |= 0x01; /* CANMOD.RM = 1 复位模式 */
regCANMOD(CanNum) &= 0xaf; /* CANMOD.SM = 0 退出睡眠模式 */
regCANMOD(CanNum) &= 0xbe; /* CANMOD.RM = 0 正常工作模式 */
}
/************************************************************************************
功能:CAN1发送中断处理
参数:无
本函数调用的函数:uint32 CAN_WriteTxBuf(eCANNUM CanNum) 发送缓冲区数据
返回值:无
*************************************************************************************/
__irq void CAN1_Tx_Exception(void)
{
volatile uint32 tempCANICR = regCANICR(CAN1); /* 读CANICR寄存器,清中断源 */
regVICIntEnClr |= (1U << 20); /* 关CAN1发送中断 */
CAN_WriteTxBuf(CAN1); /* 发送数据 */
regVICVectAddr = 0U; /* 通知中断控制器中断结束 */
regVICIntEnable |= (1U << 20); /* 开CAN1发送中断 */
}
/*******************************************************************************************
功能:CAN1接收中断处理
参数:无
本函数调用的函数:void CAN_WriteRcvBuf(eCANNUM CanNum, uint32 BufNum, uint32 FrameNum)
__inline void CAN_RelRecBuf(eCANNUM CanNum)
返回值:无
********************************************************************************************/
__irq void CAN1_Rx_Exception(void)
{
volatile uint32 temp = regCANICR(CAN1); /* 读CANICR寄存器,清中断源 */
volatile uint32 tempCANRID = regCANRID(CAN1);
volatile uint32 tempFrameNum;
regVICIntEnClr |= (1U << 26); /* 关CAN1接收中断 */
tempFrameNum = tempCANRID & 0x07U; /* 读取3位帧号 */
tempCANRID >>= 3; /* 获取8位ID号,ID号定义了报文的优先级 */
switch (tempCANRID)
{
case 0x04U:
CAN_WriteRcvBuf(CAN1, 0, tempFrameNum); /* 测速测距1 */
break;
case 0x05U:
CAN_WriteRcvBuf(CAN1, 1, tempFrameNum); /* 测速测距2 */
break;
case 0x08U:
CAN_WriteRcvBuf(CAN1, 2, tempFrameNum); /* 机车信号1 */
break;
case 0x09U:
CAN_WriteRcvBuf(CAN1, 3, tempFrameNum); /* 机车信号2 */
break;
case 0x48U:
CAN_WriteRcvBuf(CAN1, 4, tempFrameNum); /* 显示器按键1 */
break;
case 0x49U:
CAN_WriteRcvBuf(CAN1, 5, tempFrameNum); /* 显示器按键2 */
break;
case 0x4cU:
case 0x4dU:
CAN_WriteRcvBuf(CAN1, 6, tempFrameNum); /* 显示器设定信息1 */
break;
case 0x50U:
case 0x51U:
CAN_WriteRcvBuf(CAN1, 7, tempFrameNum); /* 显示器设定信息2 */
break;
case 0x54U:
case 0x55U:
CAN_WriteRcvBuf(CAN1, 8, tempFrameNum); /* 显示器设定信息3 */
break;
case 0xc8U:
CAN_WriteRcvBuf(CAN1, 9, tempFrameNum); /* 显示器自检信息1 */
break;
case 0xc9U:
CAN_WriteRcvBuf(CAN1, 10, tempFrameNum); /* 显示器自检信息2 */
break;
case 0xccU:
case 0xcdU:
CAN_WriteRcvBuf(CAN1, 11, tempFrameNum); /* 显示器转储请求 */
break;
case 0xe0U:
CAN_WriteRcvBuf(CAN1, 12, tempFrameNum); /* 记录单元自检 */
break;
case 0xe1U:
CAN_WriteRcvBuf(CAN1, 13, tempFrameNum); /* 记录单元发文件目录 */
break;
case 0xe2U:
CAN_WriteRcvBuf(CAN1, 14, tempFrameNum); /* 记录单元发文件数据 */
break;
case 0xf8U:
CAN_WriteRcvBuf(CAN1, 15, tempFrameNum); /* 通信板(保留)*/
break;
default:
break;
}
CAN_RelRecBuf(CAN1); /* 释放接收缓冲区 */
regVICVectAddr = 0U; /* 通知中断控制器中断结束 */
regVICIntEnable |= (1U << 26); /* 开CAN1接收中断 */
}
#if CAN_MAX_NUM >= 2
/************************************************************************************
功能:CAN2发送中断处理
参数:无
本函数调用的函数:uint32 CAN_WriteTxBuf(eCANNUM CanNum) 发送缓冲区数据
返回值:无
*************************************************************************************/
__irq void CAN2_Tx_Exception(void)
{
volatile uint32 tempCANICR = regCANICR(CAN2); /* 读CANICR寄存器,清中断源 */
regVICIntEnClr |= (1U << 21); /* 关CAN2发送中断 */
CAN_WriteTxBuf(CAN2); /* 发送数据 */
regVICVectAddr = 0U; /* 通知中断控制器中断结束 */
regVICIntEnable |= (1U << 21); /* 开CAN2发送中断 */
}
/*******************************************************************************************
功能:CAN2接收中断处理
参数:无
本函数调用的函数:void CAN_WriteRcvBuf(eCANNUM CanNum, uint32 BufNum, uint32 FrameNum)
__inline void CAN_RelRecBuf(eCANNUM CanNum)
返回值:无
********************************************************************************************/
__irq void CAN2_Rx_Exception(void)
{
volatile uint32 temp = regCANICR(CAN2); /* 清中断源 */
volatile uint32 tempCANRID = regCANRID(CAN2);
volatile uint32 tempFrameNum;
regVICIntEnClr |= (1U << 27); /* 关CAN2接收中断 */
tempFrameNum = tempCANRID & 0x07U; /* 读取3位帧号 */
tempCANRID >>= 3; /* 获取8位ID号,ID号定义了报文的优先级 */
switch (tempCANRID)
{
case 0x04U:
CAN_WriteRcvBuf(CAN2, 0, tempFrameNum); /* 测速测距1 */
break;
case 0x05U:
CAN_WriteRcvBuf(CAN2, 1, tempFrameNum); /* 测速测距2 */
break;
case 0x08U:
CAN_WriteRcvBuf(CAN2, 2, tempFrameNum); /* 机车信号1 */
break;
case 0x09U:
CAN_WriteRcvBuf(CAN2, 3, tempFrameNum); /* 机车信号2 */
break;
case 0x48U:
CAN_WriteRcvBuf(CAN2, 4, tempFrameNum); /* 显示器按键1 */
break;
case 0x49U:
CAN_WriteRcvBuf(CAN2, 5, tempFrameNum); /* 显示器按键2 */
break;
case 0x4cU:
case 0x4dU:
CAN_WriteRcvBuf(CAN2, 6, tempFrameNum); /* 显示器设定信息1 */
break;
case 0x50U:
case 0x51U:
CAN_WriteRcvBuf(CAN2, 7, tempFrameNum); /* 显示器设定信息2 */
break;
case 0x54U:
case 0x55U:
CAN_WriteRcvBuf(CAN2, 8, tempFrameNum); /* 显示器设定信息3 */
break;
case 0xc8U:
CAN_WriteRcvBuf(CAN2, 9, tempFrameNum); /* 显示器自检信息1 */
break;
case 0xc9U:
CAN_WriteRcvBuf(CAN2, 10, tempFrameNum); /* 显示器自检信息2 */
break;
case 0xccU:
case 0xcdU:
CAN_WriteRcvBuf(CAN2, 11, tempFrameNum); /* 显示器转储请求 */
break;
case 0xe0U:
CAN_WriteRcvBuf(CAN2, 12, tempFrameNum); /* 记录单元自检 */
break;
case 0xe1U:
CAN_WriteRcvBuf(CAN2, 13, tempFrameNum); /* 记录单元发文件目录 */
break;
case 0xe2U:
CAN_WriteRcvBuf(CAN2, 14, tempFrameNum); /* 记录单元发文件数据 */
break;
case 0xf8U:
CAN_WriteRcvBuf(CAN2, 15, tempFrameNum); /* 通信板(保留)*/
break;
default:
break;
}
CAN_RelRecBuf(CAN2); /* 释放接收缓冲区 */
regVICVectAddr = 0U; /* 通知中断控制器中断结束 */
regVICIntEnable |= (1U << 27); /* 开CAN2接收中断 */
}
#endif
#if CAN_MAX_NUM >= 3
/************************************************************************************
功能:CAN3发送中断处理
参数:无
本函数调用的函数:uint32 CAN_WriteTxBuf(eCANNUM CanNum) 发送缓冲区数据
返回值:无
*************************************************************************************/
__irq void CAN3_Tx_Exception(void)
{
volatile uint32 tempCANICR = regCANICR(CAN3); /* 读CANICR寄存器,清中断源 */
regVICIntEnClr |= (1U << 22); /* 关CAN3发送中断 */
CAN_WriteTxBuf(CAN3); /* 发送数据 */
regVICVectAddr = 0U; /* 通知中断控制器中断结束 */
regVICIntEnable |= (1U << 22); /* 开CAN3发送中断 */
}
/*******************************************************************************************
功能:CAN3接收中断处理
参数:无
本函数调用的函数:void CAN_WriteRcvBuf(eCANNUM CanNum, uint32 BufNum, uint32 FrameNum)
__inline void CAN_RelRecBuf(eCANNUM CanNum)
返回值:无
********************************************************************************************/
__irq void CAN3_Rx_Exception(void)
{
volatile uint32 tempCANICR = regCANICR(CAN3); /* 读CANICR寄存器,清中断源 */
volatile uint32 tempFrameNum = 0;
regVICIntEnClr |= (1U << 28); /* 关CAN3接收中断 */
CAN_WriteRcvBuf(CAN3, 16, tempFrameNum);
CAN_RelRecBuf(CAN3); /* 释放接收缓冲区 */
regVICVectAddr = 0U; /* 通知中断控制器中断结束 */
regVICIntEnable |= (1U << 28); /* 开CAN3接收中断 */
}
#endif
#if CAN_MAX_NUM == 4
/************************************************************************************
功能:CAN4发送中断处理
参数:无
本函数调用的函数:uint32 CAN_WriteTxBuf(eCANNUM CanNum) 发送缓冲区数据
返回值:无
*************************************************************************************/
__irq void CAN4_Tx_Exception(void)
{
volatile uint32 tempCANICR = regCANICR(CAN4); /* 读CANICR寄存器,清中断源 */
regVICIntEnClr |= (1U << 23); /* 关CAN4发送中断 */
CAN_WriteTxBuf(CAN4); /* 发送数据 */
regVICVectAddr = 0U; /* 通知中断控制器中断结束 */
regVICIntEnable |= (1U << 23); /* 开CAN4发送中断 */
}
/*******************************************************************************************
功能:CAN4接收中断处理
参数:无
本函数调用的函数:void CAN_WriteRcvBuf(eCANNUM CanNum, uint32 BufNum, uint32 FrameNum)
__inline void CAN_RelRecBuf(eCANNUM CanNum)
返回值:无
********************************************************************************************/
__irq void CAN4_Rx_Exception(void)
{
volatile uint32 tempCANICR = regCANICR(CAN4); /* 读CANICR寄存器,清中断源 */
volatile uint32 tempFrameNum = 0;
regVICIntEnClr |= (1U << 29); /* 关CAN4接收中断 */
CAN_WriteRcvBuf(CAN4, 17, tempFrameNum);
CAN_RelRecBuf(CAN4); /* 释放接收缓冲区 */
regVICVectAddr = 0U; /* 通知中断控制器中断结束 */
regVICIntEnable |= (1U << 29); /* 开CAN4接收中断 */
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -