⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.c

📁 TIDSP2407的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 + -