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

📄 复件 can_code.c

📁 基于菲利普的LPC2100的集成CAN控制器的应用程序
💻 C
📖 第 1 页 / 共 2 页
字号:

#define PSS_GLOBALS
#include "GloVar.h"
#include "LUT.H"
extern void Dly_Ns(uint16 Dly);

// ========================函数定义===================================================
//	函数名称:Can_Init()
//	函数功能: CAN 通信模块的初始化
//	输入参数:无
//	输出参数:无
//	全局变量:无
//	调用模块:无

// -------------------------------------------------------------------------------------
//	修 改 人:
//	日    期:
//	描    述:
// ====================================================================================
void CANInit(void)
{
	CAN1MOD = 0x00000001;	// enter the reset status
	CAN1BTR = 0x007F400B;	// the baud of the can is 40k(注意:波特率的设置与TEG1/TEG2有关)
	CAN1EWL = 0x60;			// CAN error warning limit, the 0x60 is the default value when reset
	CAN1IER = 0x00000001;	// 0x07 = 0 0101
							//     	  - ----
							//     	  | ||||___ enable the recieve interrupt
							//     	  | |||____ enable the transmit interrupt
							//     	  | ||_____ enable the EI: the error warning interrupt
							//	   	  | |______ disable the overrun interrupt
							//		  |________ all of the other interrupts are disabled
	CAN1MOD = 0x00000000;	// cancle the reset status
}

// ========================函数定义===================================================
//	函数名称:Can_Send()
//	函数功能:CAN 总线的数据发送
//	输入参数:*iTranData: 指向被传送数据的指针,其中包括CAN总线帧数据信息
//	输出参数:无
//	全局变量:无
//	调用模块:无

// -------------------------------------------------------------------------------------
//	修 改 人:
//	日    期:
//	描    述:
// ====================================================================================
void CAN1TxPrg(void)//uint8 *iTranData)		// iTranData[0]: the length of the data to be sent
											// iTranData[1]: the higher three bits of the Identifier 
											// iTranData[2]: the lower eight bits of the Identifier
											// iTranData[3]-iTranData[10]: the data to be sent

{
	uint8 i;
	uint8 iLength;

	iLength = iTranData[0] & 0x0F;
	if(iLength > 0x08)
	{
		iLength = 0x08;
	}
	CAN1TFI1 = iLength << 16;						// load the length of data to be sent to the register of CANTFI1
	CAN1TID1 = iTranData[1] << 8 | iTranData[2]; 	// load the ID
	
	CAN1TDA1 = 0x00000000;
	CAN1TDB1 = 0x00000000;
	
	for(i = 0; i < iLength; i++)					// load the data
	{
		if(i <=3)
		{
			CAN1TDA1 = (iTranData[3 + i] << (i * 8)) | CAN1TDA1;
		}
		else
		{
			CAN1TDB1 = (iTranData[3 + i] << ((i - 4) * 8)) | CAN1TDB1;
		}
	}
	
	CAN1CMR = 0x00000021;							// select Tx Buffer1 for transmission,request to send
/*	
	for(i = 0; i < 50; i++)
	{
		Dly_Ns(10000);
	}
	IO1CLR = LEDCON124;
	for(i = 0; i < 50; i++)
	{
		Dly_Ns(10000);
	}
	IO1SET = LEDCON124;
*/	
//	VICVectAddr = 0x00;
}

// ========================函数定义===================================================
//	函数名称:CAN1RxPrg()
//	函数功能:CAN总线的接收数据中断处理程序
//	输入参数:*iRcvData: 接收数据缓存
//	输出参数:无
//	全局变量:无
//	调用模块:无

// -------------------------------------------------------------------------------------
//	修 改 人:
//	日    期:
//	描    述:
// ====================================================================================
void CAN1RxPrg(void)//uint8 *iRcvData)
{
	uint8 i;
	uint8 iLength;
	float fPrePos;
	
	uint32 iTmp;
		
	T0TCR = 0x00;

	iTmp = CAN1RFS;
	iTmp = CAN1ICR;

	// here, we should jugde if the frame is a remote request frame
	// then if it is not a remote request frame, we do the reception

	if((CAN1RFS  & 0x40000000) == 0x40000000)				// if the frame is remote frame, then send the data
	{

		// ????????????????????????????????
		// 若为远程帧,应该如何处理? 应如何组织数据把数据发送出去
		// ????????????????????????????????
										
		while((CAN1GSR & 0x00000004) == 0x00000004);		// 判断是否可以发送,若可以发送则发送数据
		CAN1TxPrg();
	}
		
	else
	{
		iLength = ((CAN1RFS >> 16) & 0x0000000F);			// get the length of the data recieved
		if(iLength > 0x08)
		{
			iLength = 0x08;
		}
		
		for( i = 0; i < iLength; i++)
		{
			if(i <= 3)
			{
				iRcvData[i] = (CAN1RDA >> (i * 8)) & 0x000000FF;
			}
			else
			{
				iRcvData[i] = (CAN1RDB >> ((i - 4) * 8)) & 0x000000FF;
			}
		}

	// -------------------------------
	// added by BaiHuanXu, 2004/10/30
		if(iRcvData[0] == 0x20)				// 上位机发来的测试命令
		{
			iCANCmdTst = 1;
			iTmp = Ad_Get();
			if(iTmp < 616)
			{
				PWMMR0 = 25000;
				PWMMR3 = 0;
				PWMMR4 = 25001;
				PWMMR5 = 25001;
				PWMMR6 = 0;
				PWMLER = 0x79;
			}
			else
			{
				PWMMR0 = 25000;
				PWMMR3 = 25001;
				PWMMR4 = 0;	
				PWMMR5 = 0;
				PWMMR6 = 25001;
				PWMLER = 0x79;
			}
			for(i = 0; i < 255; i++)
			{
				Dly_Ns(20000);
			}
			PWMMR0 = 25001;
			iTmp = PWMMR3;
			PWMMR3 = PWMMR5;
			PWMMR5 = iTmp;
			iTmp = PWMMR4;
			PWMMR4 = PWMMR6;
			PWMMR6 = iTmp;
			PWMLER = 0x79;
			for(i = 0; i < 255; i++)
			{
				Dly_Ns(20000);
			}
			PWMMR3 = 25001;
			PWMMR4 = 0;
			PWMMR5 = 25001;
			PWMMR6 = 0;
			PWMLER = 0x79;
			
		}
		if(iRcvData[0] == 0x80)				// 上位机发来的开阀命令
		{
			iCANCmdAct = 1;
			
			iTranData[0] = 0x01;
			iTranData[1] = 0x00;
			iTranData[2] = 0x01;
			iTranData[3] = 0x00;			// 向上位机发送一个确认阀门开始动作标识		
			CAN1TxPrg();
			
			
			iCtrlStpFlg = 0;
			iNum = 0;
			fPrePos = (float)(iRcvData[1] + iRcvData[2] * 0.01);
			iPrePos = (uint16)(fPrePos * 6.92) + 270;
	//		iLstPos = Ad_Get();
		/*	
			iLstSign = (iLstPos > iPrePos) ? 1:0;
			if(iLstSign)
			{
				PWMMR6 = 25001;
			}
			else
			{
				PWMMR4 = 25001;
			}
			PWMLER = 0x79;
			for(i = 0; i < 200; i++)
			{
				Dly_Ns(20000);
				Dly_Ns(20000);
				Dly_Ns(20000);
				Dly_Ns(20000);
			}
			

			if(fabs(iPrePos - iLstPos) < 60)
			{
				iLstSign = (iLstPos > iPrePos) ? 1:0;
				if(iLstSign)
				{
					PWMMR0 = 25000;
					PWMMR3 = 25001;
					PWMMR4 = 0;
					PWMMR5 = 0;
					PWMMR6 = 25001;
					PWMLER = 0x79;
				}
				else
				{
					PWMMR0 = 25000;
					PWMMR3 = 0;
					PWMMR4 = 25001;
					PWMMR5 = 25001;
					PWMMR6 = 0;
					PWMLER = 0x79;
				}	
				Dly_Ns(20000);
			}
*/
		}
	// ---------------------------------

	}

	CAN1CMR = 0x04;
	T0TCR = 0x01;
	VICVectAddr = 0x00;
}
// ========================函数定义===================================================
//	函数名称:AFBuildLUT()
//	函数功能:创建 LUT 表格,指定每个表格 Cell 的个数,每个 Cell 为32bits
//	输入参数:***_nCell 对应表格的预留空间的大小,Cell 的个数
//	输出参数:参考enum LUT_BUILD_ERR
//	全局变量:无
//	调用模块:无

//	作    者:Bai Huan-Xu
//	日    期:2004/7/19
// -------------------------------------------------------------------------------------
//	修 改 人:
//	日    期:
//	描    述:
// ====================================================================================
uint32 AFBuildLUT(uint32 FCAN_nCell,
				  uint32 SFF_INIV_nCell,
				  uint32 SFF_GRP_nCell,
				  uint32 EFF_INIV_nCell,
				  uint32 EFF_GRP_nCell)
{
	uint16 i;
	uint32 *pU32;
	_CANAFMR afmr;
	uint32 tmpREGSFF_sa, tmpREGSFF_GRP_sa, tmpREGEFF_sa;
	uint32 tmpREGEFF_GRP_sa, tmpREGENDofTable;
	
	if(4 * (FCAN_nCell + SFF_INIV_nCell + SFF_GRP_nCell + EFF_INIV_nCell + EFF_GRP_nCell ) > 0x800)
	{
		return TOTAL_SIZE_TOO_LARGE;
	}

	if((EFF_GRP_nCell % 2) != 0)
	{
		return EFF_GRP_SIZE_INVALID;
	}

	

	tmpREGSFF_sa		= FCAN_nCell * 4;
	tmpREGSFF_GRP_sa	= tmpREGSFF_sa + (SFF_INIV_nCell * 4);
	tmpREGEFF_sa		= tmpREGSFF_GRP_sa + (SFF_GRP_nCell * 4);
	tmpREGEFF_GRP_sa	= tmpREGEFF_sa + (EFF_INIV_nCell * 4);
	tmpREGENDofTable	= tmpREGEFF_sa + (EFF_GRP_nCell * 4);

	if((0x800 - tmpREGSFF_sa * 6) < tmpREGENDofTable)
	{
		return FCAN_STORE_SIZE_INVALID;
	}

	afmr.dwValue = 0;
	afmr.Bits.AccBp = 1;
	REGAFMR = afmr.dwValue;					// it must set AccBP bit before modify LUT setting
//	memset((void *)&REGAFMR, 0xFF, 0x800);	// to include <string.h> when memset function used

	pU32 = (uint32 *)(&REGAFRAM);
	for(i = 0; i < (tmpREGENDofTable / 4); i++)
	{
		*(pU32 + i) = -1;					// disable all AF cell
	}

	for(i = (tmpREGENDofTable / 4); i < 0x800; i++)
	{
		*(pU32 + i) = 0;					// clear FullCAN auto store RAM
	}

	REGSFF_sa		= tmpREGSFF_sa;
	REGSFF_GRP_sa	= tmpREGSFF_GRP_sa;
	REGEFF_sa		= tmpREGEFF_sa;
	REGEFF_GRP_sa	= tmpREGEFF_GRP_sa;
	REGENDofTable	= tmpREGENDofTable;

	return LUT_SETTING_OK;
}

// ========================函数定义===================================================
//	函数名称:AFSetMode()
//	函数功能:指定模式启动或关闭全局接收过滤器
//	输入参数:1,Bypass mode, all message will be recieved
//			  2, normal filter
//			  3, FullCAN mode filter
//			  0 or other, all message on CAN buses are ignored
//	输出参数:none
//	全局变量:无
//	调用模块:无

//	作    者:Bai Huan-Xu
//	日    期:2004/7/19
// -------------------------------------------------------------------------------------
//	修 改 人:
//	日    期:
//	描    述:
// ====================================================================================
void AFSetMode(uint32 mode)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -