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

📄 can_dtk.c

📁 用DSP开发的关于CDN总线通信的程序
💻 C
字号:
#include "SEED-DSK2407.h"
#include "CAN.h"
#include "comm.h"

#define  FRAMLONGTH 2

unsigned int can_receive_flag; 
unsigned int receive_deal_flag;
unsigned int mail_data[4];
unsigned int spi_data=0;  
unsigned int recieve_over = 0;
unsigned int recieve_count = 0;
unsigned int recieve_check = 0;

unsigned int recieve[0x208] = {0};  

void SpiInit(void);
void CanInit(void);
void sysreset(void);
void ledturnon(void);
void ledturnoff(void);

void main()
{
	DINT; 
	can_receive_flag = 0; 
	receive_deal_flag = 0;
	SystemInit();
	SpiInit();
	CanInit();
	/*WHEN THE CAN PROGRAM RUN ,TURN ON THE LED2*/
    *MCRC     &= 0xBFFF;
    *PFDATDIR |=0x4040;
      
	*IFR = 0x3f;
	*IMR = 0x11;
	EINT;

	for(;;)
	{
		   /* if(can_receive_flag == 1)
		    {
		            can_receive_flag = 0; 
		            
		    }
		    *CANTCR = 0x20;
		    while(can_receive_flag == 0)
		    {
		    	  	if((*CANTCR & 0x2000) == 0x2000)
		    	  	{
		    	  	      break;
		    	  	}
		   	}
		    *CANTCR = 0x2000;*/		    
	}
}


void SystemInit(void)
{
	WSGR = 0;	
	*WDCR = 0x68;
	*SCSR1 = 0x003e;
}
                                         
void SpiInit(void)
{
	*MCRB = 0x3c;
	
	*SPICCR = 0x4f;
	*SPICTL = 0x03;
	*SPIBRR = 0x31;
	*SPIPRI = 0x10;	
	*SPICCR = 0xcf; 
}

void CanInit(void)
{
	/* 设置CANTX和CANRX为CAN功能口 */
	*MCRB = *MCRB | 0xc0;
	
	/* 邮箱2为接收方式、邮箱3为发送方式 */
	*CANMDER = 0x40;
	/* 设置ID屏蔽位 */
	*CANLAM1H = 0x7fff;
	*CANLAM1L = 0xffff;
	/* 设置配置请求,系统为自闭环模式 */
	*CANMCR = 0x1040;
	/* 判断CCR的配置是否为1,可以对BCR1和BCR2寄存器修改 */
	while((*CANGSR & 0x10) == 0);
	/* CAN波特率为1M */
	*CANBCR2 = 0x27;
	/*  */
	*CANBCR1 = 0x13;
	/* 关闭CCR,配置请求 */
	*CANMCR = *CANMCR & 0xefff;
	/* 判断CCR的配置是否为0,可以对BCR1和BCR2寄存器修改 */
	while((*CANGSR & 0x10) == 0x10);
	/* 邮箱2为接收方式、邮箱3为发送方式 */
	*CANMDER = 0x40;
	/* cdr = 1,数据区改变请求 */
	*CANMCR = 0x143;
	/* 设置邮箱2的控制字和ID */
	*CANMSGID2H = 0x4447;
	*CANMSGID2L = 0;
	/*  */
	*CANMSGCTRL2 = 0x08;
	/* 清邮箱2 */
	*CANMBX2A = 0;
	*CANMBX2B = 0;
	*CANMBX2C = 0;
	*CANMBX2D = 0;
	/* 设置邮箱3的控制字和ID */
	*CANMSGID3H = 0x2447;
	*CANMSGID3L = 0;
	/*  */
	*CANMSGCTRL3 = 0x08;
	/* 清邮箱2 */
	*CANMBX3A = 0x3210;
	*CANMBX3B = 0x7654;
	*CANMBX3C = 0xba98;
	*CANMBX3D = 0xfedc;
	/*  */
	*CANMCR = 0x4c0;
	/* me3和me2使能 */
	*CANMDER = 0x4c;
	/* 清CAN中断标志 */
	*CANIFR = 0xFFFF;
	/**/
	*CANIMR = 0xf7ff;
}

interrupt void PHANTOM(void)
{

} 

/*SPI INTERRUPT*/
interrupt void c_int1(void)
{   
    unsigned int i;
	if((*PIVR & 0x05) == 0x05)
	{
		recieve[recieve_count] = *SPIRXBUF; 
		recieve_count++;
		if(recieve_count==FRAMLONGTH)
		{   
		    switch(recieve[0])
	    	{ 
	    		case CANSENDDATA:
	    		     ledturnon();
	    	    	 *CANMBX3A = recieve[1];
	    	    	 *CANTCR = 0x20; 
	    	     	break;
	    		case SYSRESET:
	    	     	ledturnoff();
	    	    	sysreset();     
	    	     	break;     
            	default:
                 	break;
	    		
	    	}	
		    recieve_over = 1;
		    recieve_count = 0;   
		}		
	}
	*IFR &=0x0001;
	EINT; 	
}

interrupt void c_int5(void)
{
	if((*PIVR & 0x40) == 0x40)
	{
		can_receive_flag = 1;
		*CANRCR = 0x40;
		*CANIFR = 0xffff;
		*CANMDER = 0;
		*CANMCR = 0x140;
		 
		*CANTCR = 0x2000;
		mail_data[0] = *CANMBX2A;
		*SPITXBUF =  mail_data[0];
		
		*CANMCR = 0x4c0;
		*CANMDER = 0x4c;
	}
/*	*IFR = 0x02;*/
	EINT;
}
   
void sysreset(void)
{
	WSGR = 0;	
	*WDCR = 0x08;
	for(;;){};
	
	/*asm(" B 768H ");  */
}   

void ledturnon()
{
	LED = 0x0F;	
}

void ledturnoff()
{
	LED = 0x00;	
}			   

⌨️ 快捷键说明

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