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

📄 can.c

📁 CAN通信实验 熟悉TMS320LF2407的CAN通信模块 在自测模式编程实现CAN通信
💻 C
字号:
#include "2407c.h"   
volatile ioport unsigned int port8008;    
#define IOWR port8008     
int uWork;
void watchdog(void);
void delay_nus(long int n);
void delay_ns(long int n);
void Max_CS(int ab,int val);
void Max_CLK(int ab,int val);
void Max_DIN(int ab,int val);
void Max_SEND(unsigned int val);
void dly_nus(long int n) ;
void LED_init(void);
void CANMBX_ISR(); 
void interrupt GRIS5(void);
void CAN_INIT();
int CAN_FLAG;
void main(void)
{
	*WDCR=0X6F;
	*WDKEY=0x5555;
	*WDKEY=0xaaaa;		/* 关闭看门狗 */
	*SCSR1=0x83fe;    	/* DSP运行频率30m */    
	uWork=(*MCRC);
	uWork&=0x0ff03;
	(*MCRC)=uWork;  
	asm(" setc INTM");
	asm(" setc SXM");
	asm(" clrc OVM");
	asm(" clrc CNF");
	*IMR=0X0010;
	*IFR=0XFFFF;
	CAN_FLAG=0X00;   /*清用户标志,CAN_FLAG=0X01表示接收到数据*/
  	CAN_INIT();
  	asm(" clrc INTM");
  	LED_init() ;
  	for(;;)
  	{
  		*CANTCR=0X20; //MBX3请求发送
  		while(*CANTCR&0X2000==0)  //等待发送应答
  		continue;
  		*CANTCR=0X2000;//清TA3和MIF3标志位
  		while(CAN_FLAG==0)
  		continue;
  		CAN_FLAG=0; //清接收标志
  		*CANMDER=0X0000; //邮箱不使能
  		*CANMCR=0X0140; //CDR=1,数据改变请求  
  		Max_SEND(0x100+(*CANMBX2A&0X00FF)); 
		delay_nus(50000);
		*CANMBX3A=*CANMBX2A+1; //邮箱2中底数据加1用来更新邮箱3中底数据
  	    *CANMBX3B=*CANMBX2B+1;
  	    *CANMBX3C=*CANMBX2C+1;
  	    *CANMBX3D=*CANMBX2D+1;    
  	    *CANMCR=0X04C0;  //DBO=1,CDR=0,ABO=1,STM=1
  	    *CANMDER=0X04C;  //ME2=ME3=1,MBX2接收,MBX3发送
  	 }
}    
void CAN_INIT(void)
{
	*MCRB=*MCRB|0X0C0; //设置IOPC6,IOPC7为CANRX,CANTX
	*CANIFR=0XFFFF;  //清所有CAN中断标志
	*CANLAM1H=0X7FFF;   //设置邮箱2、3的屏蔽ID寄存器
	*CANLAM1L=0XFFFF; 
	*CANMCR=0X1040;     //CCR=1改变配置请求
	while (*CANGSR&0X0010==0)
	continue;
	*CANBCR2=0X01;  //波特率预分频寄存器
	*CANBCR1=0X033; //波特率设置为1M
	*CANMCR=*CANMCR&0XEFFF; //CCR=0,改变配置结束请求
	while(*CANGSR&0X0010!=0)
	continue; //只有CEE=0时,BCR2和BCR1配置成功
	*CANMDER=0X040;  //CDR=1 数据区改变请求
	*CANMCR=0X0143;  //设置邮箱2的控制字及ID
	*CANMSGID2H=0X2447;
	*CANMSGID2L=0XFFFF;
	*CANMSGCTRL2=0X08;
	*CANMBX2A=0X0000;
	*CANMBX2B=0X0000;
	*CANMBX2C=0X0000;
	*CANMBX2D=0X0000; 
	*CANMSGID3H=0X2447;
	*CANMSGID3L=0XFFFF;
	*CANMSGCTRL3=0X08;
	*CANMBX3A=0X2211;
	*CANMBX3B=0X2211;
	*CANMBX3C=0X2211;
	*CANMBX3D=0X2211;  
	*CANMCR=0X04C0;
	*CANMDER=0X04C; 
	*CANIMR=0XF7FF;
	*CANIFR=0XFFFF;     
	}
void interrupt GRIS5(void)
{
	switch(*PIVR)
	{
		case 64:
			CANMBX_ISR();
			break;
	}
}
void CANMBX_ISR(void)
{
	*CANRCR=0X040;
	CAN_FLAG=1;
}	
void watchdog(void)
{
				 return;
}


void delay_nus(long int n)
{
	long int j;
	for (j=1;j<=n;j++)
	{
	    	{
	    	watchdog();
             }
	}
} 
void delay_ns(long int n)
{
	long int j;
	for (j=1;j<=n;j++)
	{
	    	{
				watchdog();
			}
	}
} 


void Max_CS(int ab,int val)
{    
    
    watchdog();
    uWork=(*PEDATDIR);
   		if (val!=0)
  		{ 
  		    uWork|=0X1010;
   			(*PEDATDIR)=uWork;	
            delay_ns(50);
  		}
  		if(val==0)
  		{ 
  	     uWork|=0X1000;	
  	     uWork&=0XFFEF;	
   		 (*PEDATDIR)=uWork;	
         delay_ns(50);
  		}
}

void Max_CLK(int ab,int val)
{    
    watchdog();    
    uWork=(*PEDATDIR);
  		if (val!=0)
  		{
   			uWork|=0X0808;
   			(*PEDATDIR)=uWork;	
            delay_ns(50);
  		}
  		if(val==0)
  		{
   			uWork|=0X0800;	
  	        uWork&=0XFFF7;	
   		    (*PEDATDIR)=uWork;	
            delay_ns(50);
  		}  	
} 


void Max_DIN(int ab,int val)
{    
    watchdog();    
    uWork=(*PEDATDIR);
   		if (val!=0)
  		{
   			uWork|=0X0404;
   		    (*PEDATDIR)=uWork;	
            delay_ns(50);
  		}
  		if(val==0)
  		{
   			uWork|=0X0400;	
  	        uWork&=0XFFFB;	
   		    (*PEDATDIR)=uWork;	
            delay_ns(50);
  		}
}


void Max_SEND(unsigned int val)
{
 int i;    
 unsigned int tmp;
  
 Max_CS(0,1);
 Max_CLK(0,0);
 Max_CS(0,1);
 Max_CS(0,0);
  
 for (i=0;i<16;i++)
 {
     Max_CLK(0,0);
     tmp= 0x8000>>i; 
     Max_DIN(0,val&tmp);
     Max_CLK(0,0);
	 Max_CLK(0,1);
 }  
 
 Max_CS(0,1);
}  

void dly_nus(long int n)
{
	int i;
	long int j;
	for (j=1;j<=n;j++)
	{
		for (i=0;i<3;i++) 	 
		{
		watchdog();
		}
	}
}
void LED_init(void)
{   
		int j;
  		Max_SEND(0x0F00);
 	 	Max_SEND(0x0C01);
  		Max_SEND(0x0A04);
  		Max_SEND(0x0B07);
  		Max_SEND(0x09FF); 
  		Max_SEND(0x0F01); 
	 	delay_nus(10000); 
  		Max_SEND(0x0F00); 
		for (j=1;j<9;j++)
		{
  			Max_SEND(j*0x100+0x000F);
  		}

}      

void LED_test (void)
{
	int i,j;     
	LED_init();
    while (1)
    {
			for (i=0;i<10;i++)
			{
				for (j=1;j<9;j++)
				{
				
			  		Max_SEND(j*0x100+i+0x0080); 
			  		delay_nus(50000);
		  			Max_SEND(j*0x100+0x000F);
		  		}
	        }
     }
}   

⌨️ 快捷键说明

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