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

📄 main.c

📁 tms320lf2407的can通信程序
💻 C
字号:
/*Main.c*/ 
/*CAN发送与接收程序,波特率设置为125kbps,标准帧,ID=0x024*/
#include "global.c" 
void SystemInit();
void Timer1Init(); 
void KickDog();  
void Can_Init();
void Can_Send();
int numled0=200;   
unsigned int t0=0;   
unsigned char SendData[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
unsigned char ReceiveData[8];
main()
{  

   SystemInit();         	//系统初始化
   MCRC=MCRC & 0xFF00; 	    //IOPE0-7设为IO口模式
   PEDATDIR=0xFF00;   	    //所有LED=0, 
   
   Can_Init();              //CAN模块初始化
   Timer1Init();          	//定时器初始化
   asm(" CLRC INTM ");
   while(1);
   
}

void SystemInit() 
{  
 
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
	SCSR1=0x83FE;         	/* 系统时钟CLKOUT=20*2=40M */
 					   		/* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
	WDCR=0x006F;			/* 禁止看门狗,看门狗时钟64分频 */ 
	KickDog();    			/* 初始化看门狗 */  
    IFR=0xFFFF;				/* 清除中断标志 */
    IMR=0x0003;				/* 打开中断1,2*/      
    
}  

void Timer1Init()           
{ 
    EVAIMRA=0x0080;			//定时器1周期中断使能 
    EVAIFRA=0xFFFF;			//清除中断标志 
    GPTCONA=0x0000;
	T1PR=2500;				//定时器1初值,定时0.4us*2500=1ms 			
	T1CNT=0;
	T1CON=0x144E;           //增模式, TPS系数40M/16=2.5M,T1使能
				
} 
  
void Can_Init()
{ 
	MCRB|=0x00C0;           /*IOPC6,IOPC7配置为特殊功能*/
	CANIFR=0xFFFF;			/* 清除全部CAN中断标志 */
	CANLAM0H=0x9FFF;		/* 使用LAM0 */
	CANLAM0L=0xFFFF;		/* 接收任何信息 */

	CANMCR=0x1000;			/* 配置寄存器改变请求 */

	while((CANGSR & 0x0010)!=0x0010);  /* CCE=1? */  
	
	CANBCR2=0x0013;	        /* 设置数据传输率:125Kbps,40M */
//	CANBCR2=0x0007;			/* 设置数据传输率:125Kbps,16M */
//	CANBCR2=0x000F;			/* 设置数据传输率:125Kbps ,32M*/
	CANBCR1=0x0061;
    
    CANMCR=0x0000;			/* CPU正常工作请求 */          
    
    while((CANGSR & 0x0010)!=0x0000);	/* CCE=0? */        
	
	CANMDER=0x0000;			/* 禁止缓冲 */
	CANMCR=0x0100;			/* 数据场改变请求 */   
	
	CANID0H=0x40A0;          /*标准帧,设置ID=024-0x40a0,用于邮箱0接收信息*/
	CANMCR=0x0480;	     	/* 正常工作请求0x0480,自测试0x04c0 */
	CANMDER=0x0001;			/* 和MessageBox0使能 */
	
	CANIMR=0x0100;			/* 禁止发送中断,高级使能,打开MessageBox0接收中断 */  
	CANIFR=0xFFFF;			/* 清除全部CAN中断标志 */

} 

void Can_Send()
{	
	
	CANMCR=0x0100;			/* 数据场改变请求 */
	
	CANID4H=0x00A0;         /*ID=024,标准帧,只有满足这个ID的CAN控制器才能接收本信息*/
	CANCTRL4=0x0008;		/* 数据帧,发送8个字节 */
	CANBX4A=(SendData[1]<<8) | SendData[0];
	CANBX4B=(SendData[3]<<8) | SendData[2];
	CANBX4C=(SendData[5]<<8) | SendData[4];
	CANBX4D=(SendData[7]<<8) | SendData[6]; 

	CANMCR=0x04c0;			/* CPU正常工作请求0x0480 ,自测试为0x04C0*/ 
	CANMDER=CANMDER | 0x0010;/* MessageBox4使能 */
	 
	asm(" SETC INTM ");
	CANTCR=0x0040;			/* MessageBox4, 发送请求 */
    while((CANTCR & 0x4000)!=0x4000);  
    asm(" CLRC INTM ");
    CANIFR=0xFFFF; 
    CANTCR=0x4000;  
}


void c_int1()
{
    if(PIVR!=0x40)         //高优先级的CAN接收中断
		{  	asm(" CLRC INTM ");
			return;
		}
    ReceiveData[0]=CANBX0A & 0x00FF; 
    ReceiveData[1]=CANBX0A>>8;
    ReceiveData[2]=CANBX0B & 0x00FF; 
    ReceiveData[3]=CANBX0B>>8;
    ReceiveData[4]=CANBX0C & 0x00FF; 
    ReceiveData[5]=CANBX0C>>8;
    ReceiveData[6]=CANBX0D & 0x00FF; 
    ReceiveData[7]=CANBX0D>>8;  
    
    CANRCR=0x1010;
    CANIFR=0xFFFF;         //请将光标移到此处设置断点,并用debug->Animate监测数据
    IFR=0xFFFF;
    asm(" CLRC INTM ");
    
}

void c_int2()               /*定时器1中断服务程序*/
{

    if(PIVR!=0x27)
		{  	asm(" CLRC INTM ");
			return;
		}
	T1CNT=0; 
	t0++;
	numled0--;
	if(numled0==0)
	{
		numled0=200;
		if((PEDATDIR & 0x0002)==0x0002) 
			PEDATDIR=PEDATDIR & 0xFFFD;    	//IOPE1=0;LED灭  
		else
			PEDATDIR=PEDATDIR |0x0002;     	//IOPE1=1;LED亮 
	}

	if((t0%100)==0)     //定时循环SCI发送
	{
        Can_Send();
	}
	EVAIFRA=0x80; 
	asm(" CLRC	INTM ");   
	
}  

void KickDog()				/*踢除看门狗 */
{
	WDKEY=0x5555;
	WDKEY=0xAAAA;
}

⌨️ 快捷键说明

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