📄 can_funs.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 + -