⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.c

📁 Arm7
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -