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

📄 can_funs.c

📁 CAN工业节点设计、CAN控制器为SJA1000.C源码
💻 C
字号:
#include <REGX52.h>
#include <absacc.h>	

#include "xkcan_defs.h"
#include "sja1000.h"

#include "CAN_defs.h"

void CAN_Reset( )
{
	SJAReset( );
}

ubyte CAN_ReadReg( ubyte addr )
{
	return rbyte( addr );
}

ubyte CAN_WriteReg( ubyte addr,  ubyte dat )
{
	wbyte( addr, dat );
	return 0;
}

ubyte CAN_Open(  _t_can_status * s )
{
	CAN_WriteReg( SJA1000_MOD,  s->mod );
	CAN_WriteReg( SJA1000_IER,  s->ier );
	return 0;
//	return CAN_WriteReg( SJA1000_MOD, 0 );
}
ubyte CAN_Close( )
{
	return CAN_WriteReg( SJA1000_MOD, SJA1000_MOD_RM );
}

ubyte CAN_Init( _t_can_status * s )
{
	CAN_Reset( );
	CAN_Close( );

	CAN_WriteReg( SJA1000_BTR0,  s->btr0 );
	CAN_WriteReg( SJA1000_BTR1,  s->btr1 );	
	
	CAN_WriteReg( SJA1000_CDR,  s->cdr ); 

	CAN_WriteReg( SJA1000_ACR_BEGIN, 	s->acr0	 );	//( ( s->cobid )>>3 ) & 0xff 	 );
	CAN_WriteReg( SJA1000_ACR_BEGIN+1, 	s->acr1	 );	//( ( s->cobid )<<5 ) & 0xe0	 );  
	CAN_WriteReg( SJA1000_ACR_BEGIN+2, 	s->acr2	 );	//( ( s->cobid )>>3 ) & 0xff 	 );
	CAN_WriteReg( SJA1000_ACR_BEGIN+3, 	s->acr3	 );	//( ( s->cobid )<<5 ) & 0xe0	 );
	

	CAN_WriteReg( SJA1000_AMR_BEGIN,	s->amr0	 );	//0xf0 );
	CAN_WriteReg( SJA1000_AMR_BEGIN+1, 	s->amr1	 );	//0x1f );
	CAN_WriteReg( SJA1000_AMR_BEGIN+2, 	s->amr2	 );	//0x1f );
	CAN_WriteReg( SJA1000_AMR_BEGIN+3, 	s->amr3	 );	//0xff );
	
	CAN_WriteReg( SJA1000_OCR, s->ocr );
		
	return 0;
}

ubyte CAN_Receive( _t_can_frame * s )
{
	ubyte rxfi, rxid1, rxid2, i;

	rxfi = 	CAN_ReadReg( SJA1000_RX_FI );
	rxid1 = CAN_ReadReg( SJA1000_SFF_RX_ID_BEGIN );
	rxid2 = CAN_ReadReg( SJA1000_SFF_RX_ID_END );

	s->cobid = ((uint)rxid1) << 3 | ( ( rxid2 >> 5 ) & 0x07 );
	s->rtr	= ( rxfi>>6 ) & 1;

	rxfi = rxfi & 0x0f;
	s->dlc	= rxfi;

	for ( i = 0; i < rxfi; i++ )
	{
		s->dat[i] = CAN_ReadReg( SJA1000_SFF_RX_DATA_BEGIN + i );
	}

	CAN_WriteReg( SJA1000_CMR, SJA1000_CMR_RRB );//^= SJA1000_IR_RI;
	return 0;
}

ubyte CAN_Transmit( _t_can_frame * s )
{
	ubyte dlc, i;
	
	dlc = s->dlc;
	
	CAN_WriteReg( SJA1000_TX_FI, ( s->rtr<<6 )|dlc );
	//CAN_WriteReg( SJA1000_CMR, SJA1000_CMR_RRB|SJA1000_CMR_CDO );//SJA1000_CMR_TR;
	
	CAN_WriteReg( SJA1000_SFF_TX_ID_BEGIN, 	( ( s->cobid )>>3 ) & 0xff );
	CAN_WriteReg( SJA1000_SFF_TX_ID_END, 	( ( s->cobid )<<5 ) & 0xe0 );

	for ( i = 0; i < dlc; i++ )
	{
		 CAN_WriteReg( SJA1000_SFF_TX_DATA_BEGIN + i, s->dat[i] );
	}

	CAN_WriteReg( SJA1000_CMR, SJA1000_CMR_TR );
	return 0;

}



/*ubyte CAN_Receive( _t_can_frame * s )
{
	ubyte t0, t1, t2;
	t0 = CAN_ReadReg( SJA1000_RX_FI );
	t1 = CAN_ReadReg( SJA1000_SFF_RX_ID_BEGIN );
	t2 = CAN_ReadReg( SJA1000_SFF_RX_ID_END );
	s->fc	= t1>>4;
	s->nid	= ( t1<<3|t2>>5 ) & 0x7f;
	s->rtr	= ( t0>>6 ) & 1;
	t0 = t0 & 0x0f;
	s->dlc	= t0;

	for ( t1 = 0; t1 < t0; t1++ )
	{
		s->dat[t1] = CAN_ReadReg( SJA1000_SFF_RX_DATA_BEGIN+t1 );
	}

	CAN_WriteReg( SJA1000_CMR, SJA1000_CMR_RRB );//^= SJA1000_IR_RI;
	return 0;
}

ubyte CAN_Transmit( _t_can_frame * s )
{
	ubyte dlc, i;
	
	dlc = s->dlc;
	
	CAN_WriteReg( SJA1000_TX_FI, ( s->rtr<<6 )|dlc );
	CAN_WriteReg( SJA1000_CMR, SJA1000_CMR_RRB|SJA1000_CMR_CDO );//SJA1000_CMR_TR;
	
	CAN_WriteReg( SJA1000_SFF_TX_ID_BEGIN, ( s->fc<<4 )|( s->nid>>3 ) );
	CAN_WriteReg( SJA1000_SFF_TX_ID_END, ( s->nid<<5 ) );

	for ( i = 0; i < dlc; i++ )
	{
		 CAN_WriteReg( SJA1000_SFF_TX_DATA_BEGIN + i, s->dat[i] );
	}

	CAN_WriteReg( SJA1000_CMR, SJA1000_CMR_TR );
	return 0;

}*/

⌨️ 快捷键说明

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