📄 stepbystep.c
字号:
can_temp=*SJA1000_ADDRESS; //通过读取清除
SJA1000_ADDRESS=SJA1000_ECC; //指向错误捕捉寄存器
can_temp=*SJA1000_ADDRESS; //通过读取清除
}
}
}
}
SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,检查中断类型
can_temp=*SJA1000_ADDRESS;
can_temp=*SJA1000_ADDRESS;
ET1=1;
LED2=1;
}
void extern1 () interrupt 1 using 0
{
;
}
void TTO () interrupt 2 using 0
{
TL0=0;
TH0=0;
receive_count++;
TR0=1;
return;
}
void URT_INTERR() interrupt 4 using 0
{
LED1=0;;
if(RI)
{
EX0=0;
RI=0;
TR0=1;
r_buf[i]=SBUF;
i++;
if(i>=r_buf[0])
{
REN=0;
i=0;
EX0=1;
}
}
if(TI)
{
EX0=0;
TI=0;
// P2=0x61;
}
LED1=1;
}
void T1_Int() interrupt 3 using 0
{
TR1=0;
TH1=0xc0;
TL1=0xff;
SBUF=t_buf[l];
l++;
TR1=1;
}
void SetBaund()
{
EA=0;
TR2=0;
PCON=0x50;
T2CON=0x30;
RCAP2H=0xFF;
RCAP2L=0xE8;
SCON=0x50;
EA=1;
ACC=SBUF;
ACC=SBUF;
TR2=1;
return;
}
void MCU_SENT_TO_CAN()
{
unsigned char i;
CAN_TXD_BUF[0]=0x08;
for(i=1;i<11;i++)
{
CAN_TXD_BUF[i]=r_buf[i+1];
}
SJA1000_SEND();
}
void URT_SENT()
{
for(i=0;i<14;i++)
{
t_buf[i]=r_buf[i];
}
l=0;
i=0;
TH1=0xa0;
TL1=0x00;
ET1=1;
REN=0;
EX0=0;
ET1=1;
ES=1;
TR1=1;
while(l<t_buf[0])
;
for(l=0;l<16;l++)
{
t_buf[l]=0;
}
l=0;
TR1=0;
ET1=0;
REN=1;
EX0=1;
}
/*
void URT_SENDIN() //URT SENDING...
{
P2=0x66;
TI=0;
}*/
void checklink()
{
if(r_buf[1]=='L')
{
link=1;
}
else
{
link=0;
}
return;
}
unsigned char wait_data()
{
i=0;
while(!RI)
{
TR0=1;
}
while(REN)
{
if(receive_count>0x80) //超时等待2S;
{
for(i=0;i<14;i++)
{
r_buf[i]=0;
}
i=0;
TR0=0;
receive_count=0;
return 0;
}
}
TR0=0;
receive_count=0;
return 1;
}
void INIT_SJA1000_CYC()
{
SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
*SJA1000_ADDRESS=SJA1000_RESET_MODEL; //进入复位模式
while(!(*SJA1000_ADDRESS&SJA1000_RESET_MODEL)); //等待进入复位模式
/* SJA1000_ADDRESS=SJA1000_CLOCKDIR; //指向时钟分频寄存器
*SJA1000_ADDRESS=SJA1000_CDR_COMMAND; //使用Peli CAN模式,CLOCK使用2分频输出
SJA1000_ADDRESS=SJA1000_ENINTERR; //指向中断使能寄存器
*SJA1000_ADDRESS=SJA1000_IER_COMMAND; //开放接收,数据溢出,错误报警中断
SJA1000_ADDRESS=SJA1000_OUTCONTR; //指向输出控制寄存器
*SJA1000_ADDRESS=SJA1000_OUT_COMMAND; //正常输出模式
SJA1000_ADDRESS=SJA1000_BUSTIME0; //指向总线定时0寄存器
*SJA1000_ADDRESS=BTR0_NUM; //重写波特率
SJA1000_ADDRESS=SJA1000_BUSTIME1; //指向总线定时1寄存器
*SJA1000_ADDRESS=BTR1_NUM; //重写波特率
SJA1000_ADDRESS=SJA1000_RBSA; //指向RX缓冲区起始地址寄存器
*SJA1000_ADDRESS=SJA1000_FIFO_ADD; //接收缓冲区FIFO起始为内部RAM的0地址
SJA1000_ADDRESS=SJA1000_AMRRX0; //指向验收屏蔽寄存器,所有位均参加验收
*SJA1000_ADDRESS=AMR_CODE0;
SJA1000_ADDRESS=SJA1000_AMRRX1;
*SJA1000_ADDRESS=AMR_CODE1;
SJA1000_ADDRESS=SJA1000_AMRRX2;
*SJA1000_ADDRESS=AMR_CODE2;
SJA1000_ADDRESS=SJA1000_AMRRX3;
*SJA1000_ADDRESS=AMR_CODE3;
SJA1000_ADDRESS=SJA1000_ACRRX0; //指向验收代码寄存器,送ID码
*SJA1000_ADDRESS=ACR_ID0;
SJA1000_ADDRESS=SJA1000_ACRRX1;
*SJA1000_ADDRESS=ACR_ID1;
SJA1000_ADDRESS=SJA1000_ACRRX2;
*SJA1000_ADDRESS=ACR_ID2;
SJA1000_ADDRESS=SJA1000_ACRRX3;
*SJA1000_ADDRESS=ACR_ID3; */
SJA1000_ADDRESS=SJA1000_TX_ERR; //指向发送错误寄存器
*SJA1000_ADDRESS=SJA1000_CLEAR_TX_ERR; //清除错误
SJA1000_ADDRESS=SJA1000_RX_ERR; //指向发送错误寄存器
*SJA1000_ADDRESS=SJA1000_CLEAR_TX_ERR; //清除发送错误
SJA1000_ADDRESS=SJA1000_ALC; //指向仲裁丢失捕捉寄存器
temp=*SJA1000_ADDRESS; //通过读取清除
SJA1000_ADDRESS=SJA1000_ECC; //指向错误代码捕捉寄存器
temp=*SJA1000_ADDRESS; //通过读取清除
SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
*SJA1000_ADDRESS=SJA1000_WORK_MODEL; //设置双滤波接收,进入工作模式
while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL); //等待进入工作模式
}
/*
void checkbound()
{
if(r_buf[1]=='B' && r_buf[2]=='a' && r_buf[3]=='u' && r_buf[4]=='d')
{
baund=1;
}
else
{
baund=0;
}
P2=0x6c;
return;
} */
/*void SJA1000_RECEIVE_IN_INTERR()
{
unsigned char data can_temp,j,k,Length;
bit FF,RTR;
receive_err=0;
ET1=0;
SJA1000_ADDRESS=SJA1000_STATE; //指向状态寄存器
can_temp=*SJA1000_ADDRESS; //读状态
P2=can_temp;
if(can_temp&SJA1000_BUS_ERR) //0xc3 //检查总线状态是否有错
{
if(can_temp&SJA1000_BUS_CLOSE) //0x80 //检查是否是总线关闭状态
{
SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,清除总线错误中断
can_temp=*SJA1000_ADDRESS;
P2=can_temp;
for(k=0;k<255;k++)
for(j=0;j<255;j++)
;
;
k=0;
j=0;
SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
*SJA1000_ADDRESS=SJA1000_WORK_MODEL; //设置双滤波接收,进入工作模式
while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL); //等待进入工作模式
}
else
{
SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,检查中断类型
can_temp=*SJA1000_ADDRESS;
if(can_temp&SJA1000_DATA_OVER_INTERR) //0x08 //检查是否是数据溢出中断
{
SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
*SJA1000_ADDRESS=SJA1000_CLEAR_DATA_OVER; //清除数据溢出
}
else
{
if(can_temp&SJA1000_RI_INTERR) //检查是否是接收中断
{
SJA1000_ADDRESS=SJA1000_RXBUF; //指向接收数据寄存器首址
CAN_RXD_BUF[0]=*SJA1000_ADDRESS; //读RX帧信息
FF=CAN_RXD_BUF[0]&0x80;
RTR=CAN_RXD_BUF[0]&0x40;
Length=CAN_RXD_BUF[0]&0x0F;
if(Length>0x08)
Length=0x08;
SJA1000_ADDRESS++;
CAN_RXD_BUF[1]=*SJA1000_ADDRESS;
SJA1000_ADDRESS++;
CAN_RXD_BUF[2]=*SJA1000_ADDRESS;
if(FF)
{
SJA1000_ADDRESS++;
CAN_RXD_BUF[3]=*SJA1000_ADDRESS;
SJA1000_ADDRESS++;
CAN_RXD_BUF[4]=*SJA1000_ADDRESS;
}
for(i=0;i<Length;i++)
{
if(FF)
{
SJA1000_ADDRESS++;
CAN_RXD_BUF[i+5]=*SJA1000_ADDRESS;
}
else
{
SJA1000_ADDRESS++;
CAN_RXD_BUF[i+3]=*SJA1000_ADDRESS;
}
}
if(FF)
{
can_length=Length+5;
}
else
{
can_length=Length+3;
}
SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
*SJA1000_ADDRESS=SJA1000_RELEASE_FIFO; //释放接收缓冲器
receive_succeed=1;
if(RTR)
receive_succeed=1; //置接收成功标志
for(i=0;i<14;i++)
{
P2=CAN_RXD_BUF[i];
for(j=0;j<255;j++)
for(k=0;k<255;k++)
for(l=0;l<8;l++)
;
}
}
else
{
receive_succeed=0;
SJA1000_ADDRESS=SJA1000_COMMAND; //指向命令寄存器
*SJA1000_ADDRESS=SJA1000_RELEASE_FIFO; //释放接收缓冲区
SJA1000_ADDRESS=SJA1000_ALC; //指向仲裁丢失寄存器
can_temp=*SJA1000_ADDRESS; //通过读取清除
SJA1000_ADDRESS=SJA1000_ECC; //指向错误捕捉寄存器
can_temp=*SJA1000_ADDRESS; //通过读取清除
}
}
}
}
SJA1000_ADDRESS=SJA1000_INTERR; //读中断寄存器,检查中断类型
can_temp=*SJA1000_ADDRESS;
can_temp=*SJA1000_ADDRESS;
ET1=1;
return;
} */
/*
void changebound()
{
TJA1050_CLOSE;
SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
*SJA1000_ADDRESS=SJA1000_RESET_MODEL; //进入复位模式
while(!(*SJA1000_ADDRESS&SJA1000_RESET_MODEL)); //等待进入复位模式
SJA1000_ADDRESS=SJA1000_BUSTIME0; //指向总线定时0寄存器
*SJA1000_ADDRESS=BTR0_NUM; //选择100Kbps
SJA1000_ADDRESS=SJA1000_BUSTIME1; //指向总线定时1寄存器
*SJA1000_ADDRESS=BTR1_NUM; //选择100Kbps
SJA1000_ADDRESS=SJA1000_MODEL; //指向模式寄存器
*SJA1000_ADDRESS=SJA1000_WORK_MODEL; //设置双滤波接收,进入工作模式
while(*SJA1000_ADDRESS&SJA1000_RESET_MODEL); //等待进入工作模式
TJA1050_WORK;
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -