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

📄 sja1000.c

📁 这是Pxa270下的can驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		IDTemp = pTxInfo->FrID<<3;
		for(i=0; i<4; i++)
		{
			Write_SJA1000((INT8U)(IDTemp>>8*(3-i)),TXBUF+1+i);
		}
		for(i=0; i<pTxInfo->FrIf.Bits.DLC; i++)
		{
			Write_SJA1000(pTxInfo->DA[i],TXBUF+5+i);
		}
	}
	else
	{
		IDTemp = pTxInfo->FrID<<21;
		for(i=0; i<2; i++)
		{
			Write_SJA1000((INT8U)(IDTemp>>8*(3-i)),TXBUF+1+i);
		}
		for(i=0; i<pTxInfo->FrIf.Bits.DLC; i++)
		{
			Write_SJA1000(pTxInfo->DA[i],TXBUF+3+i);
		}
	}
		
}
/*
********************************************************************************************************************
**函数原型		:  	BOOL ReadRcvBuf(stcSJA1000_BufInfo *pRcvBuf)
**参数说明		:	pRcvBuf		->	接收输出数据的结构体指针
**返回值		:	
**说	明		:	调用该函数接收CAN数据
********************************************************************************************************************
*/
BOOL ReadRcvBuf(stcSJA1000_BufInfo *pRcvBuf)
{
	INT8U i;
	INT32U IDTemp = 0;
	if(pRcvBuf == NULL) return FALSE;
	pRcvBuf->FrIf.Byte =  Read_SJA1000(RXBUF);
	pRcvBuf->FrID = 0;
	if(pRcvBuf->FrIf.Bits.FF == 1)
	{
		for(i=0; i<4; i++)
		{
			IDTemp = Read_SJA1000(RXBUF+1+i);
			IDTemp = (IDTemp<<(24-(8*i)));
			pRcvBuf->FrID |= IDTemp;
			IDTemp = 0;
		}
		pRcvBuf->FrID >>= 3;
		for(i=0; i<pRcvBuf->FrIf.Bits.DLC; i++)
		{
			pRcvBuf->DA[i] = Read_SJA1000(RXBUF+5+i);
		}
	}
	else
	{
		for(i=0; i<2; i++)
		{
			IDTemp = Read_SJA1000(RXBUF+1+i);
			IDTemp = (IDTemp<<(24-(8*i)));
			pRcvBuf->FrID |= IDTemp;
			IDTemp = 0; 
		}
		pRcvBuf->FrID >>= 21;
		for(i=0; i<pRcvBuf->FrIf.Bits.DLC; i++)
		{
			pRcvBuf->DA[i] = Read_SJA1000(RXBUF+3+i);
		}
	}
	return TRUE;
}
/*
********************************************************************************************************************
**函数原型		:  	BOOL ACRCode(INT32U ACRCode)
**参数说明		:	ACRCode		->	验收代码值	ACR0_ACR1_ACR2_ACR3
**返回值		:	
**说	明		:	调用该函数设置验收代码
********************************************************************************************************************
*/
BOOL ACRCode(INT32U ACRCode)
{
	int i;
	for(i=0; i<4; i++)
	{
		Write_SJA1000((INT8U)(ACRCode>>(24-8*i)),ACR0+i);
	}
	for (i=0; i<4; i++)
	{
		if((INT8U)(ACRCode>>(24-8*i)) != Read_SJA1000(ACR0+i))
		{
			return FALSE;
		}
	}
	return TRUE;
}
/*
********************************************************************************************************************
**函数原型		:  	BOOL AMRCode(INT32U AMRCode)
**参数说明		:	AMRCode		->	验收屏蔽码	AMR0_AMR1_AMR2_AMR3
**返回值		:	
**说	明		:	调用该函数设置验收屏蔽码
********************************************************************************************************************
*/
BOOL AMRCode(INT32U AMRCode)
{
	int i;
	for(i=0; i<4; i++)
	{
		Write_SJA1000((INT8U)(AMRCode>>(24-8*i)),AMR0+i);
	}
	for (i=0; i<4; i++)
	{
		if((INT8U)(AMRCode>>(24-8*i)) != Read_SJA1000(AMR0+i))
		{
			return FALSE;
		}
	}
	return TRUE;
}
/*
********************************************************************************************************************
**函数原型		:  	BOOL SetFliter(INT32U ACRCode, INT32U AMRCode)
**参数说明		:	ACRCode		->	验收代码值	ACR0_ACR1_ACR2_ACR3
**			:	AMRCode		->	验收屏蔽码	AMR0_AMR1_AMR2_AMR3
**返回值		:	
**说	明		:	调用该函数写入欲发送的数据
********************************************************************************************************************
*/
BOOL SetFliter(INT32U ACRCode, INT32U AMRCode)
{
	INT8U i;
	for(i=0; i<4; i++)
	{
		Write_SJA1000((INT8U)(ACRCode>>(24-8*i)),ACR0+i);
	}
	for(i=0; i<4; i++)
	{
		Write_SJA1000((INT8U)(AMRCode>>(24-8*i)),AMR0+i);
	}
	for (i=0; i<4; i++)
	{
		if((INT8U)(ACRCode>>(24-8*i)) != Read_SJA1000(ACR0+i))
		{
			return FALSE;
		}
	}
	for (i=0; i<4; i++)
	{
		if((INT8U)(AMRCode>>(24-8*i)) != Read_SJA1000(AMR0+i))
		{
			return FALSE;
		}
	}
	return TRUE;
}
/*
********************************************************************************************************************
**宏	名		:  	Write_SJA1000(Val, OffSet)
**参数说明		:	Val		->	欲写入的数据
**				:	OffSet	->	SJA1000片内寄存器偏移地址	
**说	明		:	该宏用于写SJA1000内部寄存器
********************************************************************************************************************
*/
void Write_SJA1000(INT8U Val, INT8U OffSet)
{
	//SJA1000_ALE_ADDR = OffSet;
	//SJA1000_DAT_ADDR = Val;
	writeb(OffSet,sja1000_ale);
	writeb(Val,sja1000_dat);
}
/*
********************************************************************************************************************
**宏	名		:  	Read_SJA1000(OffSet)
**参数说明		:	OffSet	->	SJA1000片内寄存器偏移地址	
**说	明		:	该宏用于写SJA1000内部寄存器
********************************************************************************************************************
*/
INT8U Read_SJA1000(INT8U OffSet)
{
	//SJA1000_ALE_ADDR = OffSet;
	//return (INT8U)SJA1000_DAT_ADDR;
	writeb(OffSet,sja1000_ale);
	return readb(sja1000_dat);
}
/*
********************************************************************************************************************
**函数原型		:  	void IntEnty(void)
**参数说明		:	NULL
**返回值		:	NULL
**说	明		:	中断处理入口
********************************************************************************************************************
*/
void IntEnty(void)
{
	INT8U IRTemp = Read_SJA1000(IR);
	if(IR_RC&IRTemp)
	{
		ReadRcvBuf(&SJA1000_RxBuf);
		SetCommand(CMR_CL_BUF);
	}
	if(IR_TR&IRTemp)
	{
	}
	if(IR_ER&IRTemp)
	{
	}
	if(IR_DO&IRTemp)
	{
		SetCommand(CMR_CL_DATA);
	}
	if(IR_WU&IRTemp)
	{
	}
	if(IR_EP&IRTemp)
	{
	}
	if(IR_AL&IRTemp)
	{
	}
	if(IR_BE&IRTemp)
	{
	}
}
/*
********************************************************************************************************************
**函数原型		:  	BOOL SJA1000Init(INT8U CanMode, INT16U BaudRate,INT32U ACRCode, INT32U AMRCode)
**参数说明		:	CanMode		->	CAN模式值	BAIS_CAN
**				:								PELI_CAN
**				:	BaudRate	->	波特率值
**				:	ACRCode		->	验收代码
**				:	AMRCode		->	验收屏蔽码
**返回值		:	
**说	明		:	该函数必须在软件复位模式下调用
********************************************************************************************************************
*/
BOOL SJA1000Init(INT8U CanMode, INT16U BaudRate,INT32U ACRCode, INT32U AMRCode)
{
	if(TRUE != SJA_SoftRst(TRUE))			//进入复位模式
	{
		printk("SJA_SoftRst Err!.\n");
		return FALSE; 
	}
	if(TRUE != SetModeReg(MOD_AFM_SIG,TRUE))	//设置验收过滤方式
	{
		printk("SetModeReg Err!.\n");
		return FALSE;
	}
	if(TRUE != SetInterrupt(IER_RC,TRUE))		//设置中断,只开放接收中断
	{
		printk("SetInterrupt Err!.\n");
		return FALSE;
	}
	if(TRUE != SetClkDiv(CanMode,FALSE,TRUE,0))	//设置工作模式
	{
		printk("SetClkDiv Err!.\n");
		return FALSE;
	}
	if(TRUE != SetFliter(ACRCode,AMRCode))		//设置验收过滤值
	{
		printk("SetFliter Err!.\n");
		return FALSE;
	}
	if(TRUE != SetBaudRate(BaudRate))		//设置波特率
	{
		printk("SetBaudRate Err!.\n");
		return FALSE;
	}
	if(TRUE != SetOutPutMod(0x1A))			//设置驱动输出模式
	{
		printk("SetOutPutMod Err!.\n");
		return FALSE;
	}
	if(TRUE != SJA_SoftRst(FALSE))			//退出软件复位模式
	{
		printk("SJA_SoftRst Err!.\n");
		return FALSE;
	}
	return TRUE;
}
/*
*********************************************************************************************************
**                            End Of File
*********************************************************************************************************
*/

⌨️ 快捷键说明

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