📄 can.c
字号:
#include <main.h>
#include "ex.h"
/*----------------------------------------------------------------------------*/
#define cantimeout 65000 //U16
#define cantimeout_enable 1//1->允许超时出错
/*----------------------------------------------------------------------------*/
/* CAN 2.0a 数据结构定义 */
//typedef struct
//{
// U16 ID;
// U16 LEN;
// U16 BUF[4];//4*16 = 8*8,高位在前
//} CAN_BUF;
/*----------------------------------------------------------------------------*/
/*
+------------------------------------------------------------------------------+
函 数 名 : can_init
功能描述 : CAN的初始化
函数原形 : void can_init(U16 can_id,U16 can_speed)
参数说明 : can_id:CAN BUS ID号 ; can_speed:CAN BUS 波特率(500,250,125k)
支持资源 : CAN BUS 2.0A
作 者 : 桂林
最后更改日期: 2002-11-20
+------------------------------------------------------------------------------+
*/
void can_init(U16 can_id,U16 can_speed)
{
//---------------------------------------------------------
// CAN BUS bit time
MCR = 0x3000;//CCR=1
while((GSR & 0x0010) == 0 );// Wait for CCE=1
//BCR1 = 0x0523;BCR2 = 3;//1M
BCR1 = 0x064c;//SBG=1;SJW=2;SAM=0;TSEG1=9;TSEG2=4;
switch(can_speed)
{
case 125:BCR2 = 19;break;//0.125M
case 250:BCR2 = 9;break; //0.250M
case 1000:BCR1 = 0x0523;BCR2 = 3;break;//1M
default:BCR2 = 4;break; //0.500M
};//end switch
MCR=0x2000;//MCR &= ~0x1000;//CCR=0
while((GSR & 0x0010)!=0);// Wait for CCE=0
//---------------------------------------------------------
// mailbox0 -> prepare mailbox #0 for frames to be received
MDER = 0;//禁止所有油箱
MCR = 0x2100;//CDR=1
MSGID0H = ((can_id<<2)&0x1ffc)|0x4000;
MSGID0L = 0;
LAM0_H = 0;
LAM0_L = 0;
//MSGCTRL0= 8;
MCR = 0x2000;//MCR &= ~0x0100;//CDR=0,disable access to data fields
//---------------------------------------------------------
//MCR = 0x0040;//self test mode
MDER = 0x0021;// enable mailbox#0,5
CAN_IMR = 0x2100;// enable mailbox#0,5 interrupt
}
/*
+------------------------------------------------------------------------------+
函 数 名 : can_tx5
功能描述 : CAN发送
函数原形 : U16 can_tx5(CAN_BUF *p)
参数说明 :
支持资源 : CAN BUS 2.0A
作 者 : 桂林
最后更改日期: 2002-11-20
+------------------------------------------------------------------------------+
*/
U16 can_tx5(CAN_BUF *p)
{
U16 tempi=0;
//---------------------------------------------------
MDER &= ~0x0020;
MCR = 0x2100;//CDR=1,enable access to data fields
//prepare mailbox #5 for transmission
MSGID5H = (p->ID<<2)&0x1ffc;
MSGID5L = 0;
MSGCTRL5 = p->LEN;//数据桢,8字节数据
MBX5A = p->BUF[1];
MBX5B = p->BUF[0];
MBX5C = p->BUF[3];
MBX5D = p->BUF[2];
MCR = 0x2000;//MCR &= 0xFEFF;//CDR=0,disable access to data fields
MDER |= 0x0020;
//---------------------------------------------------
TCR = 0x0080;//TRS5=1
do
{
if(((tempi++)>cantimeout)&&cantimeout_enable)
{TCR = 0x0008;return(1);}//error
}
//while((TCR & 0x8000)==0);//wait for TA5=1
while((CAN_IFR & 0x2000)==0);// wait for MIF5=1
TCR = 0x8000; /* Reset TA and interrupt flag */
return(0);//ok
}
/*
+------------------------------------------------------------------------------+
函 数 名 : can_rx0
功能描述 : CAN接收
函数原形 : U16 can_rx0(CAN_BUF *p)
参数说明 :
支持资源 : CAN BUS 2.0A
作 者 : 桂林
最后更改日期: 2002-11-20
+------------------------------------------------------------------------------+
*/
U16 can_rx0(CAN_BUF *p)
{
U16 tempj=0;
do
{
if(((tempj++)>cantimeout)&&cantimeout_enable)
return(1);//error
}
//while((RCR & 0x0010)==0);
while((CAN_IFR & 0x0100)==0);
MDER &= ~0x0001;
MCR = 0x2100;//CDR=1,enable access to data fields
RCR = 0x0010;
p->ID = (MSGID0H&0x1fff)>>2;
p->LEN = MSGCTRL0&0x000f;
p->BUF[1] = MBX0A;
p->BUF[0] = MBX0B;
p->BUF[3] = MBX0C;
p->BUF[2] = MBX0D;
MCR = 0x2000;//MCR &= 0xFEFF;//CDR=0,disable access to data fields
MDER |= 0x0001;
return(0);//OK
}
/*
+------------------------------------------------------------------------------+
函 数 名 : can_self_test0
功能描述 : CAN自测试
函数原形 : U16 can_self_test(void)
参数说明 :
支持资源 : CAN BUS 2.0A
作 者 : 桂林
最后更改日期: 2002-12-02
+------------------------------------------------------------------------------+
*/
U16 can_self_test(U16 x)
{
// //---------------------------------------------------------
// // CAN BUS bit time
// MCR = 0x1000;//CCR=1
// while((GSR & 0x0010) == 0 );// Wait for CCE=1
// //BCR1 = 0x0557;BCR2 = 0;
// BCR1 = 0x064c;BCR2 = 4;
// MCR=0;//CCR=0
// while((GSR & 0x0010)!=0);// Wait for CCE=0
// //---------------------------------------------------------
// mailbox 5 => mailbox 0
MDER = 0;//禁止所有油箱
MCR = 0x0100;//CDR=1
MSGID0H = 0x5f0c;//0xdfff;
//MSGID0L = 0;//0xffff;
//MSGCTRL0=8;
LAM0_H = 0;//过滤ID号
LAM0_L = 0;
MSGID5H = 0x5f0c;//0xdfff;
//MSGID5L = 0;//0xffff;
MSGCTRL5 = 8;//数据桢,8字节数据,Bhl_Ahl_Dhl_Chl
MBX5A = (x+2)<<8 | (x+3);
MBX5B = (x+0)<<8 | (x+1);
MBX5C = (x+6)<<8 | (x+7);
MBX5D = (x+4)<<8 | (x+5);
MCR = 0;
MCR = 0x0040;//self test mode
MDER = 0x0021;// enable mailbox#0,5
// can_tx
TCR = 0x0080;//TRS5=1
while((TCR & 0x8000)==0);//wait for TA5=1
//while((CAN_IFR & 0x2000)==0);
TCR = 0x8000;
// can_rx
//while((CAN_IFR & 0x0100)==0);
while((RCR & 0x0010)==0);
RCR = 0x0010;
return(0);//ok
}
/*
+------------------------------------------------------------------------------+
函 数 名 : CAN_ISR()
功能描述 : CAN中断函数
函数原形 : interrupt void CAN_ISR(void)
参数说明 :
支持资源 :
作 者 : 桂林
最后更改日期: 2002-12-09
+------------------------------------------------------------------------------+
*/
interrupt void CAN_ISR(void)
{
if(CAN_IFR&0x2000)//cantx
{ };
if(CAN_IFR&0x0100)//canrx
{
// if(can_rx0(&GVAR.canrxbuf)==0){GVAR.canrxok=1;};//canrxok
};
if(CAN_IFR&0x007f){CAN_IFR=0x007f;}//can error
EnableINT;
}
/*
+------------------------------------------------------------------------------+
函 数 名 : can_tx
功能描述 : CAN发送
函数原形 : U16 can_tx(CAN_BUF *p)
参数说明 :
支持资源 : CAN BUS 2.0A
作 者 : 桂林
最后更改日期: 2002-12-09
+------------------------------------------------------------------------------+
*/
U16 can_tx(CAN_BUF *p)
{
U16 tempi=0;
while(1)
{
if(can_tx5(p)==0) return(0);//ok
if((tempi++)>2) return(1);//error
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -