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

📄 can_bus.c

📁 在TMS320的C2000系列DSP上实现CAN总线的模块
💻 C
字号:
/*********************************************************************
* Filename: Can_bus.c                                                *
*                                                                    *
* Author: Jianping Xu,2003/06/3                                      *
*                                                                    *
* Last Modified: 2003/06/3                                           * 
*                                                                    *
* Description: can communication module with other singlechip.		 *						                 *
**********************************************************************/

#include    "artisman.h" 
#include    "extern.h"
void can_init(void)
{               
	WORD cTemp;
	*MCRB |= (BIT7+BIT6);		/*设置IOPC6、IOPC7为CANTX、CANRX*/
	*PCDATDIR |= BIT14;		/*OUTPUT MODE*/ 
	*PCDATDIR &=~BIT15;     /*INPUT MODE*/
	
	*CAN_IFR=0XFFFF;		/*清所有CAN中断标志位*/
	*LAM1_H=0X7FFF;			/*设置邮箱2、3的屏蔽ID寄存器*/
	*LAM1_L=0XFFFF;
/*========================================================================
/*以下配置位定时器BCR1和BCR2
/*======================================================================*/
	*MCR=CCR;	 			/*CCR=1,改变配置请求*/
	while((*GSR&CCE)!=CCE); 	/*当CCE=1时方可配置BCR2,BCR1寄存器*/
	switch(bCANBAUD[bCANBaudRate])
	{
#ifdef	X1226S8I
		case 100:
			*BCR2=0X0018;			/*波特率预分频寄存器,波特率设置为100K*/ 
			*BCR1=0X0061;	/*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
			break;       
		case 250:			
			*BCR2=0X0009;				/*波特率预分频寄存器,波特率设置为250K*/
			*BCR1=0X0061;			/*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
			break;
		case 500:
			*BCR2=0X0004;				/*波特率预分频寄存器,波特率设置为500K*/
			*BCR1=0X0061;			/*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
			break;  
//		case 1000:
//			*BCR2=0X0001;				/*波特率预分频寄存器,波特率设置为1000K*/
//			*BCR1=0X007a;			/*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
//			break;  
#else
		case 100:
			*BCR2=0X0013;			/*波特率预分频寄存器,波特率设置为100K*/ 
			*BCR1=0X0061;	/*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/			
			break;       
		case 250:			
			*BCR2=0X0007;			/*波特率预分频寄存器,波特率设置为100K*/ 
			*BCR1=0X0061;	/*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
			break;
		case 500:
			*BCR2=0X0003;			/*波特率预分频寄存器,波特率设置为100K*/ 
			*BCR1=0X0061;	/*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
			break;  
//		case 1000:
//			*BCR2=0X0001;				/*波特率预分频寄存器,波特率设置为1000K*/
//			*BCR1=0X0061;			/*Bit Time=10,SBG=1,SJW=01,SAM=0,TSEG1=0100,TSEG2=011*/
//			break;  
#endif			
	}     
	*MCR &=~CCR;				/*CCR=0,改变配置结束请求*/
	while((*GSR&CCE)==CCE);			/*当CCE=0时,BCR2,BCR1寄存器配置成功*/
/*========================================================================
/*以下初始化接收邮箱
/*======================================================================*/
	*MDER =MD2; 	    	/*不使能邮箱,邮箱2设为接收邮箱,邮箱3设为发送邮箱*/
	*MCR =CDR;				/*CDR=1,数据区改变请求,选择邮箱2*/
	*MSGID2H=0X59A4;		/*设置邮箱2的控制字及ID,IDE=0,AME=1,AAM=0
							/*接收标识符为0669H(11001101001B),标准方式为MSGID2H[12~2]*/
	*MSGID2L=0XFFFF;	
	*MSGCTRL2=DLC_4;    	/*调制控制域,数据长度DCL=4,RTR=0数据帧*/
	*MBX2A=0;				/*邮箱2信息初始化*/
	*MBX2B=0;
	*MCR=DBO+ABO;			/*CDR=0,DBO=1,ABO=1,STM=0*/
	*MDER|=ME2+ME3;				/*MBX3发送,MBX2接收,使能接收邮箱*/
	*CAN_IMR=BIT10;		/*中断MBX3不使能,MBX2使能,高中断优先级*/
	*CAN_IFR=0XFFFF;		/*清全部中断标志*/  
	*IMR |= BIT0;			/*允许INT1中断 */
}    
/*============================================================
邮箱3发射子程序    
入口参数:所传数据字WORD dat1及WORD dat2
功能:向小键盘传输数据   
/*============================================================*/
void can_tx(WORD dat1,WORD dat2)
{  	
	WORD i=0,j=0;
	*MDER &=~ME3; 	    	/*不使能邮箱,邮箱2设为接收邮箱,邮箱3设为发送邮箱*/	
	*MCR =CDR;				/*CDR=1,数据区改变请求,选择邮箱3*/	
	*MSGID3H=0X1564;		/*设0置邮箱3的标识符为0559H(10101011001B)*/
	*MSGID3L=0XFFFF;	
	*MSGCTRL3=DLC_4;		/*RTR=0,DLC=8*/
	*MBX3A=dat1;	    	/*邮箱3信息初始化*/	
	*MBX3B=dat2;	
	*MCR=DBO+ABO;			/*CDR=0,DBO=1,ABO=1*/
	*MDER |=ME3;			/*使能发射邮箱*/
	do
	{
		j++;
		*TCR=TRS3;				/*MBX3请求发送*/
		while((*TCR&TA3)!=TA3)
		{
			i++;
			MSDelay(2);
			if(i>1000)
				break;
		}
 	}while((j<3)&&((*TCR&TA3)!=TA3));
	*TCR=TA3;				/*清TA3和MIF3标志位*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -