📄 can_gps.c
字号:
return 0;
}
/************************************************************************
*函数原型: bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf); *
*参数说明: RcvDataBuf,存放微处理器保存数据缓冲区 *
*返回值: 0;接收成功 *
* 1;接收失败 *
*说明:CAN控制器接收数据,仅限于接收数据 *
************************************************************************/
bit BCAN_DATA_RECEIVE(uchar data *RvcDataBuf)
{
uchar TempCount;
RvcDataBuf++;
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr&0x01)==0) //判断报文是否有效
{
return 1;
}
SJA_BCANAdr = REG_RxBuffer2; //访问地址指向接收缓冲区2
if((*SJA_BCANAdr&0x10)==0) //如果是数据帧
{
TempCount=(*SJA_BCANAdr&0x0f)+2; //计算报文中数据的个数
}
else
{
TempCount=2;
}
SJA_BCANAdr = REG_RxBuffer1; //访问地址指向接收缓冲区1
SystemBuf[0]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer2;
SystemBuf[1]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer3;
SystemBuf[2]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer4;
SystemBuf[3]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer5;
SystemBuf[4]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer6;
SystemBuf[5]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer7;
SystemBuf[6]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer8;
SystemBuf[7]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer9;
SystemBuf[8]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer10;
SystemBuf[9]=*SJA_BCANAdr;
//memcpy(RvcDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文???????????????????
return 0;
}
/************************************************************************
*函数原型: bit BCAN_CMD_PRG(unsigned char cmd) *
*参数说明: cmd:sja1000运行的命令字 *
* 01:发送请求 *
* 02:中止发送 *
* 04:释放接收缓冲区 *
* 08:清除超载状态 *
* 0x10:进入睡眠状态 *
* *
*返回值: *
* 0 ; 表示命令执行成功 *
* 1 ; 表示命令执行失败 *
* *
*说明: 执行sja1000命令 *
************************************************************************/
bit BCAN_CMD_PRG(unsigned char cmd)
{
SJA_BCANAdr=REG_COMMAND; //访问地址指向命令寄存器
*SJA_BCANAdr=cmd; //启动命令字
switch(cmd)
{
case TR_CMD: //发送请求命令
return 0;
break;
case AT_CMD: //中止发送命令
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x20)==0)//判断是否正在发送
{
return 0;
}
else
{
return 1;
}
break;
case RRB_CMD: //释放接收缓冲区
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x01)==1)//判断是否释放成功
{
return 1;
}
else
{
return 0;
}
break;
case COS_CMD: //清除超载状态
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x02)==0)//判断清除超载是否成功
{
return 0;
}
else
{
return 1;
}
break;
case GTS_CMD: //进入睡眠状态命令
return 0;
break;
default:
return 1;
break;
}
}
/************************************************************************
*函数原型: void InitialCAN() *
*参数说明: *
* *
*返回值: *
*说明: 初始化Can总线 *
************************************************************************/
void InitialCAN()
{
SJA_reset=0;
delay(100);
SJA_reset=1;
SJA_BCANAdr=REG_CONTROL; //设置控制寄存器
*SJA_BCANAdr=0x02; //接收中断使能
do{;}while(BCAN_ENTER_RETMODEL()); //进入复位模式
do{;}while(BCAN_CREATE_COMMUNATION()); //建立连接
do{;}while(BCAN_SET_BANDRATE()); //设置BTR0,BTR1,配置波特率
do{;}while(BCAN_SET_OBJECT(0x01,0x00)); //设置验收代码寄存器ACR,验收屏蔽寄存器AMR,
//自身节点ID号为00000000!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
do{;}while(BCAN_SET_OUTCLK(0xda,0x08)); //设置输出控制寄存器OC,时钟分频器CDR
do{;}while(BCAN_QUIT_RETMODEL()); //进入工作模式
}
/************************************************************************
*函数原型: void send_StartorEnd(uchar num,bit SorE,unsigned short CRC)*
*参数说明: num 传送的数据量 *
* SorE 1:开始帧 0:结束帧 *
*返回值: *
*说明: 向总线发送数据起始帧或停止帧 *
************************************************************************/
void send_StartorEnd(uchar num,bit SorE,unsigned short CRC)
{ uchar CRCH,CRCL;
CRCL=CRC;
CRCH=CRC>>8;
if(SorE)
{//1:开始帧
SendBuf[0]=0x00;
SendBuf[1]=0x08;
SendBuf[2]='S'; //Start
SendBuf[3]='T';
SendBuf[4]='A';
SendBuf[5]='R';
SendBuf[6]='T';
SendBuf[7]=num;
SendBuf[8]=CRCH; //校验码高8位
SendBuf[9]=CRCL; //校验码低8位
}
else
{//0:结束帧
SendBuf[0]=0x00;
SendBuf[1]=0x08;
SendBuf[2]='F'; //Final
SendBuf[3]='I';
SendBuf[4]='N';
SendBuf[5]='A';
SendBuf[6]='L';
SendBuf[7]=num;
SendBuf[8]=CRCH; //校验码高8位
SendBuf[9]=CRCL; //校验码低8位
}
BCAN_DATA_WRITE(SendBuf);
BCAN_CMD_PRG(TR_CMD);
}
/************************************************************************
*函数原型: void request_data(uchar *sendbuff,uchar num) *
*参数说明: *
* *
*返回值: *
*说明: 向总线发送数据 *
************************************************************************/
void request_data(uchar *sendbuff,uchar num)
{ uchar i,j;
unsigned short CRC;
green=0; //发送指示
j=num%8;
if(j)j=num/8;
else j=num/8+1;
//开始帧
send_StartorEnd(num,1,CRC);
//数据帧
SendBuf[0]=0x00;
SendBuf[1]=0x08;
while(j)
{
for(i=2;i<10;i++){SendBuf[i]=*sendbuff++;}
BCAN_DATA_WRITE(SendBuf);
BCAN_CMD_PRG(TR_CMD);
delay(10);
j--;
}
//结束帧
send_StartorEnd(num,0,CRC);
}
/*************************************************************/
/********************** keys *********************************/
/*************************************************************/
uchar keys(void)
{
uchar temp;
return temp;
}
/*************************************************************/
/********************** 24c256 *******************************/
/*************************************************************/
//start
void start24(void)
{
SDA24=1;
SCL24=1;
cnop24=0;
cnop24=0;
SDA24=0;
cnop24=0;
cnop24=0;
SCL24=0;
cnop24=0;
}
//stop24
void stop24(void)
{
SDA24=0;
SCL24=1;
cnop24=0;
cnop24=0;
SDA24=1;
cnop24=0;
cnop24=0;
SCL24=0;
cnop24=0;
}
//send answer
void tack24(void)
{
SDA24=0;
SCL24=1;
cnop24=0;
cnop24=0;
SCL24=0;
SDA24=1;
}
//check answer
bit get_ACK24(void)
{
SDA24=1;
SCL24=1;
cnop24=0;
cnop24=0;
ACK24=SDA24;
SCL24=0;
cnop24=0;
return ACK24;
}
void wrbyt24(uchar ch)
{
data uchar i;
ab=ch;
for(i=0;i<8;i++){
SDA24=abit7;
ab<<=1;
SCL24=1;
cnop24=0;
cnop24=0;
SCL24=0;
SDA24=0;
}
}
//receive a byte
uchar rdbyt24(void)
{
data uchar i;
for(i=0;i<8;i++){
SDA24=1;
SCL24=1;
ab<<=1;
abit0=SDA24;
SCL24=0;
}
return ab;
}
void write_abyte24(uint loc,uchar ch,uchar aa)
{
data uchar i;
bit flag;
stop24();
flag=1; i=0;
while(flag){
i++; if(i>250)return;;
start24();
wrbyt24(aa);
flag=get_ACK24();
if(flag)stop24();
}
i=loc>>8;
wrbyt24(i);
get_ACK24();
i=loc;
wrbyt24(i);
get_ACK24();
wrbyt24(ch);
get_ACK24();
stop24();
}
void write_nbyte24(uint loc,uchar *p,uchar aa)
{
data uchar i,*p1;
bit flag;
p1=p;
stop24();
flag=1; i=0;
while(flag){
i++; if(i>250)return;;
start24();
wrbyt24(aa);
flag=get_ACK24();
if(flag)stop24();
}
i=loc>>8; //先送高字节
wrbyt24(i);
get_ACK24();
i=loc;
wrbyt24(i); //再送低字节
get_ACK24();
for(i=0;i<64;i++) //一页写的字节个数 64个
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -