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

📄 dsp程序格式参考.txt

📁 实现CAN总线通讯的自测试功能
💻 TXT
字号:
//DSP的CAN模块初始化函数
//此函数只支持标准ID(11bits),不支持扩展ID
//该函数将RB0与RB3用来接收,将RB4,RB5用来发送,RB1,2未用
//波特率设置为125k
//参数1:接收邮箱RB0的SID屏蔽器
//参数2:接收邮箱RB0的SID
//参数3:接收邮箱RB3的SID屏蔽器
//参数4:接收邮箱RB3的SID
//!!注意!!DSPCAN的mask与mcp2515的mask逻辑上是反的
UINT DSPCan_Init(UINT SIDmask0,UINT SIDRb0,UINT SIDmask1,UINT SIDRb3)
{
	UINT mytimer=0;
	UINT tmout=3000;
	UINT temp;
	
	(*MCRB)|=0x00c0;		//设置IOPC6、IOPC7为CANRX,CANTX 
    (*CANIFR)|=0x007f;		//清所有CAN中断标志
    (*CANTCR)|=0xff00;
    (*CANRCR)|=0xf0f0;
  
    temp=(SIDmask0<<2);
    temp|=0x0003;
    (*CANLAM0H)=temp;		//设置接收邮箱0(1)的屏蔽ID寄存器
	(*CANLAM0L)=0xffff;
	temp=(SIDmask1<<2);
    temp|=0x0003;
    (*CANLAM1H)=temp;		//设置接收邮箱2(3)的屏蔽ID寄存器
	(*CANLAM1L)=0xffff;
	    	
	mytimer=tmout;
	*CANMCR=0x1000;			//CCR=1改变配置请求
	while(((*CANGSR)&0x0010)==0)//只有当CCE=1时可配置BCR2、BCR1寄存器
	{
		mytimer--;
		if(mytimer==0)
			return 1;	//超时

	} 
	//波特率125kb/s
	*CANBCR2=0x000f;		//波特率预分频寄存器 (RBP+1)=15+1=16
	*CANBCR1=0x0073;		//波特率设置为125K=40M/16/20    bittime=(14+1)+(3+1)+1=20	
	(*CANMCR)&=0xefff;		//CCR=0改变配置结束请求
	mytimer=tmout;
	while(((*CANGSR)&0x0010)==1)//只有当CCE=0时BCR2、BCR1寄存器配置成功
	{
		mytimer--;
		if(mytimer==0)
			return 1;	//超时
	}
	
	/*接收邮箱0初始化*/
    *CANMDER=0x0000;		//不使能邮箱
	*CANMCR=0x0100;			//CDR=1,数据区改变请求 
	temp=(SIDRb0<<2)&0x1ffc;
	temp|=0x4000;			//设置邮箱0的控制字及ID
	*CANMSGID0H=temp;		//IDE=0(标准帧),AME=1(使能接收mask),AAM=0(不自动回复远程帧)
	*CANMSGID0L=0xffff;
/*	*CANMSGCTRL0=0x00;		//设置控制域,数据长度DCL=0 非远程帧
	*CANMBX0A = 0x0000;
	*CANMBX0B = 0x0000;   
	*CANMBX0C = 0x0000;
	*CANMBX0D = 0x0000;*/
	
	/*接收邮箱3初始化*/
    *CANMDER=0x0000;		//不使能邮箱
	*CANMCR=0x0100;			//CDR=1,数据区改变请求
	temp=(SIDRb3<<2)&0x1ffc;
	temp|=0x4000;			//设置邮箱3的控制字及ID
	*CANMSGID3H=temp;		//IDE=0(标准帧),AME=1(使能接收mask),AAM=0(不自动回复远程帧)
	*CANMSGID3L=0xffff;
/*	*CANMSGCTRL3 = 0x00;       		//设置控制域,数据长度DCL=4 非远程帧
	*CANMBX3A = 0x0000;   
	*CANMBX3B = 0x0000;   
	*CANMBX3C = 0x0000;
	*CANMBX3D = 0x0000;*/
			
	/*发送邮箱4初始化*/ 
	*CANMDER=0x0000;		//不使能邮箱
	*CANMCR=0x0100;			//CDR=1,数据区改变请求 
	*CANMSGID4H=0;       
	*CANMSGID4L=0;
	*CANMSGCTRL4=0;
	*CANMBX4A=0xff;
	*CANMBX4B=0xff;
	*CANMBX4C=0xff;
	*CANMBX4D=0xff;

	/*发送邮箱5初始化*/
	*CANMDER=0x0000;		//不使能邮箱
	*CANMCR=0x0100;			//CDR=1,数据区改变请求 
	*CANMSGID5H=0;       
	*CANMSGID5L=0;
	*CANMSGCTRL5=0;
	*CANMBX5A=0xff;
	*CANMBX5B=0xff;
	*CANMBX5C=0xff;
	*CANMBX5D=0xff;
	
    *CANMCR=0x0480;			//DBO=1,CDR=0,ABO=1,STM=0正常工作模式
	*CANMDER=0x00b9;		//ME0=ME3=ME4=ME5=1,邮箱3接收,邮箱2发送
    (*CANIFR)|=0x007f;		//清所有CAN中断标志
    (*CANTCR)|=0xff00;
    (*CANRCR)|=0xf0f0;
	*CANIMR=0x8984;			//邮箱3,0接收中断使能,总线关闭中断使能,低中断优先级
//	*CANIMR=0xbfff;
	(*IFR)|=0x10;			/*清INT5中断标志*/
	(*IMR)|=0x10;			/*开INT5中断*/
	
    return 0;
}

void init_dsp(int T1_pr)
{
/*************************System Initialization**********************************/
    asm(" SETC INTM");		/*屏蔽中断*/
    asm(" CLRC   CNF");	  	/*B0被配置为数据存储空间*/
	asm(" CLRC   OVM");	  	/*累加器结果正常溢出*/
	*WDCR=0x68;             /*disable watchdog timer*/
	*SCSR1=0x81fe;    		/*CLKIN=10MHz,CLKOUT=40MHz,使能EVA,EVB,ADC,SCI,SPI,CAN*/
	WSGR=0x01c0;			/*Data space & Prog Space 0 wait state,IO space 7 wait states*/
	
/***********************Pins Initialization**************************************/
	*MCRB|=0x00dc;			/*设置CANTX,CANRX,SPICLK,SPISOMI,SPISIMO*/
	*MCRB&=0xfedf;			/*设置IOPD0,IOPC5*/
	
/************************ADC Initialization**************************************/
   
/************************EVA Initialization**************************************/
	*T1PR=T1_pr;      		/*PWM设置周期设定*/
	*T1CNT=0;
    *T1CON=0x0800;      	/*连续增减计数,内部时钟,不分频*/
//	*T2PR=7999;				/*T2周期寄存器,8000个脉冲一个周期*/ 
//	*T2CNT=0;				/*编码器计数器初值*/
//	*T2CON=0x9870;			/*定向增减,允许编码接口*/

/************************EVB Initialization**************************************/
//	*T3PR=15625;      		/*周期设定,100ms*/
//	*T3CNT=0;
//	*T3CON=0x0f00;      	/*连续增减计数,内部时钟,128分频*/

	
/**********************************开中断****************************************/	
	*IFR=0x0ff;				/*清所有系统中断标志*/
	*IMR=0x3;				/*开INT2,INT1中断*/
	*EVAIFRA=0x0fff;        /*清除EVA所有中断标志*/
	*EVAIFRB=0x0f;
	*EVAIFRC=0x0f;
//	*EVAIMRA=0x0001;    	/*开PDPINTA中断*/
	*EVAIMRB=0;
	*EVAIMRC=0;
	
	*EVBIFRA=0x0fff;        /*清除EVB所有中断标志*/
	*EVBIFRB=0x0f;
	*EVBIFRC=0x0f;
	*EVBIMRA=0x0200;    	/*开T3下溢中断*/
	*EVBIMRB=0;
	*EVBIMRC=0;

//	(*T1CON)|=0x0040;       /*使能T1*/
//	(*T3CON)|=0x0040;       /*使能T3*/
	asm(" CLRC INTM");		/*开中断*/
	
/*~~~~~~~~~~~~~~~~~~~~~~~~initialization over~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
}

⌨️ 快捷键说明

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