CAN节点的测试程序, 实现两个节点传送数据,程序主要分三部分 SJA1000 的初始化,接收数据,发送数据.
学习Sja1000很好的参考程序实例。
unsigned char Sja_1000_Init(void)
{
bit s;
EA=0;
s=BCAN_ENTER_RETMODEL();
if (s==1) return 1;
s=BCAN_CREATE_COMMUNATION();
if
(s==1) return 2;
s=BCAN_SET_OUTCLK(0xc0);//Pelican
if (s==1) return 3;
s=BCAN_SET_OBJECT(0xFF,0x4E,0x16,0x00,0xff,0x00,0x00,0x00);
if (s==1) return 4;
s=BCAN_SET_BANDRATE(CAN_BPS_1M);
if
(s==1) return 5;
SJA_BCANAdr=REG_OCR
;
*SJA_BCANAdr=0x1a;
SJA_BCANAdr=REG_IER;
*SJA_BCANAdr=0x03;
s=BCAN_SET_CONTROL(0x08);
if (s==1) return 6;
EA=1;
return 0;
}
}
bit BCAN_SET_OUTCLK(unsigned char Clock_Out)
{
SJA_BCANAdr=REG_CDR;
*SJA_BCANAdr=Clock_Out;
if(*SJA_BCANAdr !=
Clock_Out)
return 1;
else
return 0;
}
bit BCAN_SET_OBJECT(unsigned
char BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3)
{
SJA_BCANAdr=REG_TxBuffer1;
*SJA_BCANAdr=BCAN_ACR0; //写入参数
SJA_BCANAdr=REG_TxBuffer2;
*SJA_BCANAdr=BCAN_ACR1;
SJA_BCANAdr=REG_TxBuffer3;
*SJA_BCANAdr=BCAN_ACR2;
SJA_BCANAdr=REG_TxBuffer4;
*SJA_BCANAdr=BCAN_ACR3;
//校验写入值
if(*SJA_BCANAdr !=
BCAN_ACR3) return 1;
SJA_BCANAdr=REG_TxBuffer5;
*SJA_BCANAdr=BCAN_AMR0;
//写入参数
SJA_BCANAdr=REG_TxBuffer6;
*SJA_BCANAdr=BCAN_AMR1;
SJA_BCANAdr=REG_TxBuffer7;
*SJA_BCANAdr=BCAN_AMR2;
SJA_BCANAdr=REG_TxBuffer8;
*SJA_BCANAdr=BCAN_AMR3;
//校验写入值
if(*SJA_BCANAdr != BCAN_AMR3)
return 1;
return 0;
}
bit BCAN_SET_BANDRATE(unsigned int CAN_ByteRate)
{
//将波特率的的预设值装入sja1000的总线定时器
SJA_BCANAdr
=REG_BTR0;
*SJA_BCANAdr
=CAN_ByteRate>>8;
// 取CAN_ByteRate的高8位写入 写入参数
//校验写入值
if(*SJA_BCANAdr
!=(CAN_ByteRate>>8)) return 1;
SJA_BCANAdr=REG_BTR1;
*SJA_BCANAdr=CAN_ByteRate;
//校验写入值
if(*SJA_BCANAdr !=CAN_ByteRate)
return 1;