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

📄 tms320lf2407 can总线通信实验.txt

📁 DSP2407CAN的资料
💻 TXT
字号:
//TMS320LF2407 CAN总线通信实验
//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();          //系统初始化
   
   MCRA=MCRA & 0xC0FF;      //IOPB0-6设为IO口模式
   PBDATDIR=0xFFC2;        //所有LED=0 
   PBDATDIR=PBDATDIR |0x003D;  //所有LED=1  
   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((PBDATDIR & 0x0001)==0x0001) 
   PBDATDIR=PBDATDIR & 0xFFFE;     //IOPB0=0;LED灭  
  else
   PBDATDIR=PBDATDIR |0x0101;      //IOPB0=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 + -