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

📄 can.c

📁 TMS320LF2407的can程序
💻 C
字号:
#include "f2407_c.h"                 //引用头部文件   
int RECEIVE2[4]={0,0,0,0};                     //定义标志寄存器
int *p = &RECEIVE2[0];
//int RECEIVE2 = 0;

void system_init();                  //声明在程序中需要用到是函数
void CANMBX_ISR();
void CAN_INIT();

void inline disable()
{
   asm(" setc INTM");
}                    
void inline enable()
{
   asm(" clrc INTM");
}                    

//////////////////////////主程序/////////////////////////////////////////////
main()
{

   system_init();                       //系统初始化子程序   
   CAN_INIT();                          //CAN初始化子程序
   enable();
               
   for(;;)
   {              
     switch(RECEIVE2[0])
     {     
        case 0x0AB:
        {
            MBX3A = 0x2211;                    
            MBX3B = 0x4433;
            MBX3C = 0x6655;
            MBX3D = 0x8877;
            TCR = 0x0020;                      //MBX3请求发送
            while(TCR & 0x2000 == 0);          //等待发送成功后进入下一步    
            TCR=0x2000;                        //清TA3和MIF3标志位  
            RECEIVE2[0] = 0;
            break;
        }        
        default:
            break;
     }
        
   }
  
} 

//////////////////////系统初始化子程序///////////////////////////////////////
void system_init()
{
    asm(" setc	SXM");					// 抑制符号位扩展
	asm(" clrc	OVM");					// 累加器中结果正常溢出
	asm(" clrc	CNF");					// B0被配置为数据存储空间
	asm(" setc	INTM");					// 禁止所有中断 
	   
	SCSR1 = 0x8312;					    // CLKIN=20M,CLKOUT=2CLKIN=40M
	WDCR = 0x0E8;				        // 不使能看门狗		      						    
	IMR = 0x0010;					    // 开中断优先级5           
	IFR = 0x0FFFF;					    // 清除全部中断标志,"写1清0"
}   

//////////////////////CAN初始化子程序////////////////////////////////////////
void CAN_INIT()
{ 
   MCRB=MCRB | 0x0C0;                    //设置IOPC6、IOPC7为CANRX,CANTX
   CAN_IFR = 0x0FFFF;                    //清所有中断标志
   LAM1_H = 0x7FFF;                      //设置邮箱2、3的屏蔽ID寄存器
   LAM1_L = 0x0FFFF;                     //0则ID必须匹配  
   
  ////////////////////配置位定时器///////////////////////////////////////////
   MCR = 0x1000;                         //CCR=1改变配置请求,正常收发模式
   while(GSR & 0x0010 == 0) continue;    //CCE=1时,配置BCR2、BCR1寄存器  
   BCR2 = 0x03;                          //波特率预分频寄存器
   BCR1 = 0x057;                         //波特率设置为500Kbps
   MCR = MCR&0x0EFFF;                    //配置结束,配置请求位CCR=0  
   while(GSR & 0x0010 != 0) continue;    //当CCE=0时,BCR2、BCR1寄存器配置成功
  /////////////////////////////////////////////////////////////////////////// 
   
  ////////////////////初始化油箱///////////////////////////////////////////////////////// 
   MDER = 0x040;                         //不使能所有邮箱,邮箱2为接收方式,油箱3为发送方式
   MCR = 0x0100;                         //CDR=1,数据区改变请求
   
   MSGID2H = 0x0447;                     //设置邮箱2为标准标识符,标准方式为MSGID2H[12~2]                                                                           
   MSGID2L = 0x0FFFF;                    //与标准信息帧无关
   MSGCTRL2 = 0x08;                      //设置油箱2的控制域,数据帧,数据长度8字节                               
   MBX2A = 0x0000;                       //邮箱2信息初始化
   MBX2B = 0x0000;
   MBX2C = 0x0000;
   MBX2D = 0x0000; 
     
   MSGID3H = 0x0447;                     //设置邮箱3为标准标识符,标准方式为MSGID2H[12~2]
   MSGID3L = 0x0FFFF;                    //与标准信息帧无关
   MSGCTRL3 = 0x08;                      //设置油箱3的控制域,数据帧,数据长度8字节  
   MBX3A = 0x0000;                       //邮箱3信息初始化
   MBX3B = 0x0000;
   MBX3C = 0x0000;
   MBX3D = 0x0000;    
   
   MCR = 0x0480;                         //CDR=0进入正常工作模式
   MDER = 0x04C;                         //使能邮箱2和3,邮箱2为接收方式,3为发送方式
   
   CAN_IMR = 0x0C4FF;                    //MBX2中断使能,MBX3不使能,低中断优先级   
   CAN_IFR = 0x0FFFF;                    //清中断标志
}                  
 
//////////////////////中断服务程序///////////////////////////////////////////////////////////
void interrupt CANMBINT5()      //邮箱2接收到相应信息则进入中断服务程序
{
  switch(PIVR)
  {
    case 0x040: CANMBX_ISR();
    break;
  }
 
  IFR = 0X10;                  //清IFR相应中断标志
  enable();
  return;
} 
        
void CANMBX_ISR()               //邮箱2接收中断服务子程序
{
  RCR = 0x040;                  //RMP2和MIF2位清0
  *p = MBX2A;
  *(p+1) = MBX2B;
  *(p+2) = MBX2C;
  *(p+3) = MBX2D;
  //RECEIVE2 = MBX2A;
}

////////////////////// 直接返回主程序//////////////////////////////////////////////
void interrupt nothing() 
{
 	return;
}

⌨️ 快捷键说明

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