📄 main.c
字号:
#include <stdio.h>
#include "serial.h"
#include <at89x52.h>
#include <string.h>
#include "SJA1000.h"
#include <ABSACC.H>
extern unsigned char TxBuf[LenTxBuf];
extern unsigned char RxBuf[LenRxBuf];
extern unsigned char receiveflag;
sfr AUXR = 0x8E; //STC89C54RD+
unsigned char canbuf[16];
unsigned char bCanRcvFlag;
void delay()
{
int i,j;
for(i = 0; i++; i<10000)
{
for(j = 0; j++; j<10000)
{
}
}
}
void InitialCan()
{
WriteDataToSJA1000(REG_CAN_MOD,0x01); //进入复位,对can进行初始化
WriteDataToSJA1000(REG_CAN_CDR,0x88); //时钟分频寄存器
WriteDataToSJA1000(REG_CAN_IER ,0x8B); //中断允许寄存器
WriteDataToSJA1000(REG_CAN_AMR0,0xff); //验收屏蔽寄存器0~3
WriteDataToSJA1000(REG_CAN_AMR1,0xff);
WriteDataToSJA1000(REG_CAN_AMR2,0xff);
WriteDataToSJA1000(REG_CAN_AMR3,0xff);
WriteDataToSJA1000(REG_CAN_ACR0,0x00); //验收码寄存器0~3
WriteDataToSJA1000(REG_CAN_ACR1,0x01);
WriteDataToSJA1000(REG_CAN_ACR2,0x00);
WriteDataToSJA1000(REG_CAN_ACR3,0x00);
WriteDataToSJA1000(REG_CAN_BTR0,0x49); //总线定时器0
WriteDataToSJA1000(REG_CAN_BTR1,0xC9); //总线定时器1 //50kbps 采样3次 16MHZ
WriteDataToSJA1000(REG_CAN_OCR,0xAA); //输出控制寄存器
WriteDataToSJA1000(REG_CAN_RBSA,0x00); //接收缓冲器起始地址寄存器
WriteDataToSJA1000(REG_CAN_RXERR,0x00); //接收错误计数器
WriteDataToSJA1000(REG_CAN_TXERR,0x00); //发送错误寄存器
WriteDataToSJA1000(REG_CAN_MOD,0x08); //模式寄存器---单滤波方式
//P1_0 = 0;
}
int main()
{
unsigned char rlen,i,j;
unsigned char rbuf[14];
P1_1 =0;
P1_0 = 1;
InitSerialBuffer();
InitSerial();
// bCanRcvFlag = 0;
EA=1; //cpu中断允许标志
EX0=1; //外部中断0中断允许位
IT0=1; //跳变方式
ES=1; //串口中断允许位
AUXR=0x03; //禁止外扩
InitialCan(); //初始化SJA1000
// PELICAN_HW_INIT( 0xAA,0x88,0x04,0x8B); 调试结束后,再检查看看原有的驱动程序为什么不能正常工作
delay();
delay();
while(receiveflag)
{
P1_0 = 0;
receiveflag=0;
rlen=ReceivedBytes();
for(i=0;i<rlen;i++)
{
getbyte(&rbuf[i]);
}
// EA=0; //cpu禁止中断
TI=0; //TI=1时申请中断,cpu相应中断后,发送下一帧数据。任何方式下,该位都必须由软件清0
//canbuf[9]={0x88,0x50,0x00,0x20,0x00,0x01,0x0a,S,H}; //帧信息+4个识别码+帧号(0x01)
//+固定字节(表示后续字节长度)+两个固定起始字符(SH)
canbuf[0] = 0x88 ; //帧信息
canbuf[1] = 0x50 ;
canbuf[2] = 0x00 ;
canbuf[3] = 0x20 ;
canbuf[4] = 0x00 ;
canbuf[5] = 0x01 ; //帧号(0x01
for(i = 0; i < 7; i++)
for(j = 6; j < 13; j++)
{
canbuf[j] = rbuf[i];
}
canbuf[13] = 0x88 ; //帧信息
canbuf[14] = 0x50 ;
canbuf[15] = 0x00 ;
canbuf[16] = 0x20 ;
canbuf[17] = 0x00 ;
canbuf[18] = 0x02 ; //帧号0x01
for(i = 7; i < rlen; i++)
for(j = 19; j < (12+rlen); j++)
{
canbuf[j] = rbuf[i];
}
SJASendData(canbuf,0x01);
// EA=1; //cpu开中断
TI=1; //TI=1时申请中断,cpu相应中断后,发送下一帧数据。任何方式下,该位都必须由软件清0
// TX帧信息:0x88--发送缓冲器首址, FF=1--扩展帧 RTR=0--数据帧
// ID0 0x50
// ID1 0x00
// ID2 0x20
// ID3 0x00
}
/* while(1)
{
if(bCanRcvFlag)
{
P1_0 = 0;
bCanRcvFlag=0;
SJARcvData(canbuf,&rcanlen);
EA=0; //cpu禁止中断
TI=0; //TI=1时申请中断,cpu相应中断后,发送下一帧数据。任何方式下,该位都必须由软件清0
for(i=0;i<rcanlen;i++)
{
SBUF=canbuf[i];
while(!TI);
TI=0;
}
EA=1;
WriteDataToSJA1000(REG_CAN_CMR,0x04); //0x04:释放;接收缓冲器FXFIFO中载有信息的内存空间被释放
}
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -