网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C2000 >> 文章正文
  TMS320LF2407 CAN总线通信实验         ★★★ 【字体:
TMS320LF2407 CAN总线通信实验
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-17    

//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;
}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号