📄 can.c
字号:
#include <stdlib.h>
#include <string.h>
#define SJA1000add (*(volatile unsigned char *) 0x8000000) //CAN地址端口
#define SJA1000dat0 (*(volatile unsigned char *) 0x8000001) //第一片CAN数据端口
#define SJA1000dat1 (*(volatile unsigned char *) 0x8000002) //第二片CAN数据端口(指拥有两路的CAN卡)
#define SJA1000rst (*(volatile unsigned char *) 0x8000008) //目前没有实现该端口,对该地址操作无意义
#define SJA_REG_BaseADD 0 //0x10000000
#define REG_MODE (SJA_REG_BaseADD + 0x00) //模式寄存器
#define REG_CMR (SJA_REG_BaseADD + 0x01) //命令
#define REG_SR (SJA_REG_BaseADD + 0x02) //状态寄存器
#define REG_IR (SJA_REG_BaseADD + 0x03) //中断寄存器
#define REG_IR_ABLE (SJA_REG_BaseADD + 0x04) //中断使能 //05保留
#define REG_BTR0 (SJA_REG_BaseADD + 0x06) //总线时序0
#define REG_BTR1 (SJA_REG_BaseADD + 0x07) //总线时序1
#define REG_OCR (SJA_REG_BaseADD + 0x08) //输出控制
#define REG_TEST (SJA_REG_BaseADD + 0x09) //检测寄存器
#define REG_ALC (SJA_REG_BaseADD + 0x0b) //0a保留 仲裁丢失捕捉
#define REG_ECC (SJA_REG_BaseADD + 0x0c) //错误代码捕捉
#define REG_EMLR (SJA_REG_BaseADD + 0x0d) //错误报警限额
#define REG_RXERR (SJA_REG_BaseADD + 0x0e) //接收错误计数器
#define REG_TXERR (SJA_REG_BaseADD + 0x0f) //发送错误计数器
#define REG_ACR0 (SJA_REG_BaseADD + 0x10) //复位模式下,验收代码0 ~ 3
#define REG_ACR1 (SJA_REG_BaseADD + 0x11)
#define REG_ACR2 (SJA_REG_BaseADD + 0x12)
#define REG_ACR3 (SJA_REG_BaseADD + 0x13)
#define REG_AMR0 (SJA_REG_BaseADD + 0x14) //复位模式下,验收屏蔽0 ~ 3
#define REG_AMR1 (SJA_REG_BaseADD + 0x15)
#define REG_AMR2 (SJA_REG_BaseADD + 0x16)
#define REG_AMR3 (SJA_REG_BaseADD + 0x17)
#define REG_RxBuffer0 (SJA_REG_BaseADD + 0x10) //操作模式下,接收标识0 ~ 4
#define REG_RxBuffer1 (SJA_REG_BaseADD + 0x11)
#define REG_RxBuffer2 (SJA_REG_BaseADD + 0x12)
#define REG_RxBuffer3 (SJA_REG_BaseADD + 0x13)
#define REG_RxBuffer4 (SJA_REG_BaseADD + 0x14)
#define REG_TxBuffer0 (SJA_REG_BaseADD + 0x10) //操作模式下,发送标识0 ~ 4
#define REG_TxBuffer1 (SJA_REG_BaseADD + 0x11)
#define REG_TxBuffer2 (SJA_REG_BaseADD + 0x12)
#define REG_TxBuffer3 (SJA_REG_BaseADD + 0x13)
#define REG_TxBuffer4 (SJA_REG_BaseADD + 0x14)
#define REG_DataBuffer1 (SJA_REG_BaseADD + 0x15) //操作模式下,数据缓冲1 ~ 8
#define REG_DataBuffer2 (SJA_REG_BaseADD + 0x16)
#define REG_DataBuffer3 (SJA_REG_BaseADD + 0x17)
#define REG_DataBuffer4 (SJA_REG_BaseADD + 0x18)
#define REG_DataBuffer5 (SJA_REG_BaseADD + 0x19)
#define REG_DataBuffer6 (SJA_REG_BaseADD + 0x1a)
#define REG_DataBuffer7 (SJA_REG_BaseADD + 0x1b)
#define REG_DataBuffer8 (SJA_REG_BaseADD + 0x1c)
#define REG_RBSA (SJA_REG_BaseADD + 0x1e) //RX缓冲区起始地址
#define REG_CDR (SJA_REG_BaseADD + 0x1f) //时钟分频器
#define REG_Receive_Counter (SJA_REG_BaseADD + 0x1d) //RX抱文计数器
char delay_f;
char SJA_Sendf;
unsigned char Rx_Buffer[20];
//------------------------------
extern void Delay(int time);
void SJA_Init(void);
void SJA_Send(void);
void SJA_Receive(void);
void CANtest (void);
void SJA1000write(unsigned char add,unsigned char data);
void SJA1000write1(unsigned char add,unsigned char data);
unsigned char SJA1000read(unsigned char add);
unsigned char SJA1000read1(unsigned char add);
//-----------------------------------
void SJA1000write(unsigned char add,unsigned char data)
{
SJA1000add=add;
Delay(1);
SJA1000dat0=data;
}
/*void SJA1000write1(unsigned char add,unsigned char data)
{
SJA1000add=add;
SJA1000dat1=data;
}
*/
unsigned char SJA1000read(unsigned char add)
{ unsigned char i;
SJA1000add=add;
Delay(1);
i=SJA1000dat0;
Delay(1);
return i;
}
/*unsigned char SJA1000read1(unsigned char add)
{ unsigned char i;
SJA1000add=add;
i=SJA1000dat1;
return i;
}
*/
/*------------------------------------------------
The main C function. Program execution starts
here after stack initialization.
------------------------------------------------*/
void CANtest (void)
{unsigned char i;
/* TMOD=0x21;
//t0 initialize
TH0 =0xee; //5ms
TL0 =0x00;
TR0 =1;
ET0 =1;
delay=500;
EX0=1;
IT0=0;
EA=1; //open interrupt*/
SJA_Init();
while (1) {
SJA_Send();
// Uart_Printf(\n"senndOK!"\n);
i=SJA1000read(REG_IR);
if(i&0x01)
{
SJA_Receive();
}
Delay(100);
}
}
//-------------------------------------------------
void SJA_Init(void)
{
//unsigned char i,j;
SJA1000rst=1;
Delay(1000);
SJA1000rst=0;
Delay(1000);
SJA1000rst=1;
Delay(1000);
SJA1000write(REG_MODE,0x09);
//REG_MODE=0x09; //00001001;单验收,复位模式
SJA1000write(REG_CDR,0xc8);
//REG_CDR=0xc8; //选择PeliCAN模式,关闭时钟输出
SJA1000write(REG_IR_ABLE,0xff);
//REG_IR_ABLE=0xff; //00001101,接收中断允许
SJA1000write(REG_AMR0,0xff);
//REG_AMR0 = 0xff; //验收屏蔽
SJA1000write(REG_AMR1,0xff);
//REG_AMR1 = 0xff;
SJA1000write(REG_AMR2,0xff);
//REG_AMR2 = 0xff;
SJA1000write(REG_AMR3,0xff);
//REG_AMR3 = 0xff;
SJA1000write(REG_ACR0,0xff);
//REG_ACR0 = 0xff; //验收代码
SJA1000write(REG_ACR1,0xff);
//REG_ACR1 = 0xff;
SJA1000write(REG_ACR2,0xff);
//REG_ACR2 = 0xff;
SJA1000write(REG_ACR3,0xff);
//REG_ACR3 = 0xff;
SJA1000write(REG_BTR0,0x1f);
//REG_BTR0 = 0x1f;
SJA1000write(REG_BTR1,0xff);
//REG_BTR1 = 0xff; //2.5k 4M
SJA1000write(REG_OCR,0x1a);
//REG_OCR =0x1a; //
SJA1000write(REG_RBSA,0);
//REG_RBSA =0;
SJA1000write(REG_RXERR,0);
//REG_RXERR=0;
SJA1000write(REG_TXERR,0);
//REG_TXERR=0;
SJA1000write(REG_ECC,0);
//REG_ECC =0;
SJA1000write(REG_MODE,0x08);
//REG_MODE=0x08; //00001001;单验收
SJA1000write(REG_CMR,0x10);
//REG_CMR =0x10;
}
//--------------------------------
void SJA_Send(void)
{
unsigned char i;
do
{
i=SJA1000read(REG_SR);
i=i&0x10;
}
while(i==0x10);
do
{
i=SJA1000read(REG_SR);
i=i&0x08;
}
while(i==0);
do
{
i=SJA1000read(REG_SR);
i=i&0x04;
}
while(i==0);
SJA1000write(REG_TxBuffer0,0x88);
// REG_TxBuffer0=0x88;
//REG_TxBuffer1=0xff;
SJA1000write(REG_TxBuffer1,0xff);
SJA1000write(REG_TxBuffer2,0xff);
// REG_TxBuffer2=0xff;
SJA1000write(REG_TxBuffer3,0xff);
// REG_TxBuffer3=0xff;
SJA1000write(REG_TxBuffer4,0xf8);
// REG_TxBuffer4=0xf8;
SJA1000write(REG_DataBuffer1,Rx_Buffer[5]);
// REG_DataBuffer1=Rx_Buffer[5];
SJA1000write(REG_DataBuffer2,Rx_Buffer[6]);
// REG_DataBuffer2=Rx_Buffer[6];
SJA1000write(REG_DataBuffer3,Rx_Buffer[7]);
//REG_DataBuffer3=Rx_Buffer[7];
SJA1000write(REG_DataBuffer4,Rx_Buffer[8]);
//REG_DataBuffer4=Rx_Buffer[8];
SJA1000write(REG_DataBuffer5,Rx_Buffer[9]);
//REG_DataBuffer5=Rx_Buffer[9];
SJA1000write(REG_DataBuffer6,Rx_Buffer[10]);
//REG_DataBuffer6=Rx_Buffer[10];
SJA1000write(REG_DataBuffer7,Rx_Buffer[11]);
//REG_DataBuffer7=Rx_Buffer[11];
SJA1000write(REG_DataBuffer8,Rx_Buffer[12]);
//REG_DataBuffer8=Rx_Buffer[12];
SJA1000write(REG_CMR,0x01);
//REG_CMR =0x01;
}
//--------------------------------
void SJA_Receive(void)
{
unsigned char i,j;
i=SJA1000read(REG_SR);
//i=REG_SR;
i&=0xc3;
if(i==0) goto Rend;
else
{
if(i&0x80)
{
i=SJA1000read(REG_IR);
SJA1000write(REG_MODE,0x08);
//REG_MODE=0x08;
goto Rend;
}
else
{
j=SJA1000read(REG_IR);
if(j&0x08)
{
SJA1000write(REG_CMR,0x0c);
//REG_CMR=0x0c;
goto Rend;
}
else
{
if(j&0x01)
{
i=SJA1000read(REG_RxBuffer0);
if(i&0x40)
{
SJA1000write(REG_CMR,0x02);
//REG_CMR=0x02;
//
goto Recout;
}
else
{
j=SJA1000read(REG_RxBuffer0);
Rx_Buffer[0]=j;
j&=0x0f;
j+=4;
Rx_Buffer[1]=SJA1000read(REG_RxBuffer1);//REG_RxBuffer1;
Rx_Buffer[2]=SJA1000read(REG_RxBuffer2);//REG_RxBuffer2;
Rx_Buffer[3]=SJA1000read(REG_RxBuffer3);//REG_RxBuffer3;
Rx_Buffer[4]=SJA1000read(REG_RxBuffer4);//REG_RxBuffer3;
Rx_Buffer[5]=SJA1000read(REG_DataBuffer1);//REG_DataBuffer1;
Rx_Buffer[6]=SJA1000read(REG_DataBuffer2);//REG_DataBuffer2;
Rx_Buffer[7]=SJA1000read(REG_DataBuffer3);//REG_DataBuffer3;
Rx_Buffer[8]=SJA1000read(REG_DataBuffer4);//REG_DataBuffer4;
Rx_Buffer[9]=SJA1000read(REG_DataBuffer5);//REG_DataBuffer5;
Rx_Buffer[10]=SJA1000read(REG_DataBuffer6);//REG_DataBuffer6;
Rx_Buffer[11]=SJA1000read(REG_DataBuffer7);//REG_DataBuffer7;
Rx_Buffer[12]=SJA1000read(REG_DataBuffer8);//REG_DataBuffer8;
SJA1000write(REG_CMR,0x04);
//REG_CMR=0x04;
// for(i=0;i<j;i++)
// {
// Rx_Buffer[i+1]=j;
// }
}
}
else
{
goto Recout;
}
}
}
}
Recout:
i=SJA1000read(REG_ALC);
i=SJA1000read(REG_ECC);
Rend: Delay(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -