网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C2000 >> 文章正文
  基于DSP2407 CAN控制器的程序设计举例         ★★★ 【字体:
基于DSP2407 CAN控制器的程序设计举例
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-16    

CAN控制器的程序设计举例

程序如下:

1.建立中断向量表(汇编)

         .ref   _nothing,_c_int0,_GRIS5       ;声明在其他程序中定义                                                              ;并在本程序中需要使用的变量或标号

         .sect    ".vectors"                      ;定义主向量段

RSVECT        B   _c_int0                 ;复位向量

INT1          B   _nothing                ;中断向量1

INT2          B   _nothing                ;中断向量2

INT3          B   _nothing                ;中断向量3

INT4          B   _nothing                ;中断向量4

INT5          B   _GRIS5                  ;中断向量5

INT6          B   _nothing                ;中断向量6

RESERVED      B   _nothing 

SW_INT8       B    _nothing

……

SW_INT31      B    _nothing

2C语言程序

#include "f2407_c.h"                           // 引用头部文件

int CAN_FLAG;                             // 定义标志寄存器

void sytem_init();                             // 声明在程序中需要用到的函数

void CANMBX_ISR();

void CAN_INIT();              

void inline disable()                          // 中断屏蔽子程序

{

     asm(" setc INTM");

}

void inline enable()                           // 中断使能子程序

{

     asm(" clrc INTM");

}

(1)   主程序

main()

{

     sytem_init();                         // 系统初始化程序

     CAN_FLAG=0X00;                       // CAN用户标志,CAN_FLAG=01表示接收到数据

     CAN_INIT();                          //  CAN初始化程序

     enable();                                 // 中断使能

     for(;;)

     {

          *TCR=0X20;                      // MBX3请求发送

          while(*TCR&0X2000==0)           // 等待发送应答

continue;

          *TCR=0X2000;                    // TA3 MIF3标志位

          while(CAN_FLAG==0)

continue;                        // 等待接收数据

          CAN_FLAG=0;                     // 清接收到标志

          *MDER=0X0000;                   // 邮箱不使能

          *MCR=0X0140;                    //  CDR=1,数据改变请求

          *MBX3A=*MBX2A+1;            // 邮箱2中数据加1用来更新邮箱3中的数据

          *MBX3B=*MBX2B+1;

          *MBX3C=*MBX2C+1;

          *MBX3D=*MBX2D+1;

          *MCR=0X04C0;                    //  DBO=1CDR=0ABO=1STM=1

          *MDER=0X04C;                    //  ME2=ME3=1MBX2接收, MBX3发送

          }

}

2)系统初始化子程序

void sytem_init()

{

    asm(" setc INTM");

     asm(" setc SXM");

     asm(" clrc OVM");

     asm(" clrc CNF");

     *IMR=0x0010;                         // 开中断优先级5

     *IFR=0xFFFF;                          // 清中断标志位

*SCSR1=0x81FE;                

*WDCR=0xE8;                  

}

3CAN初始化子程序

void CAN_INIT()

{

     *MCRB=*MCRB|0X0C0;                   // 设置IOPC6IOPC7 CANRX,CANTX

     *CAN_IFR=0XFFFF;                     // 清所有CAN中断标志

     *LAM1_H=0X7FFF;                      // 设置邮箱23的屏蔽ID寄存器

     *LAM1_L=0XFFFF;                      // 0ID必须匹配

     *MCR=0X1040;                         //  CCR=1 改变配置请求

     while(*GSR&0X0010==0)continue;       // CCE=1 时即可配置 BCR2BCR1 寄存器

     *BCR2=0X01;                          // 波特率预分频寄存器

     *BCR1=0X033;                         // 波特率设置为1M

     *MCR=*MCR&0XEFFF;                //  CCR=0 改变配置结束请求

     while(*GSR&0X0010!=0)continue;       // 只有当CEE=0时,BCR2BCR1 寄存器配置成功

     *MDER=0X040;                         // 不使能邮箱,邮箱2设为接收方式

     *MCR=0X0143;                         //  CDR=1,数据区改变请求

     *MSGID2H=0X2447;                     // 设置邮箱2的控制字及ID

                                          //  IDE=0 AME=0AAM=0

                                          // 标准方式为MSGID2H[12-2]

     *MSGID2L=0XFFFF;

     *MSGCTRL2=0X08;                      // 设置控制域

                                          // 数据长度DCL = 8RTR=0 数据帧

     *MBX2A=0X0000;                       // 邮箱2信息初始化

     *MBX2B=0X0000;

     *MBX2C=0X0000;

     *MBX2D=0X0000;

     *MSGID3H=0X2447;                     // 设置邮箱3的标识符

     *MSGID3L=0XFFFF;

     *MSGCTRL3=0X08;                      //  RTR=0DCL=8

     *MBX3A=0X2211;                       // 邮箱3信息初始化

     *MBX3B=0X4433;

     *MBX3C=0X6655;

     *MBX3D=0X8877;

     *MCR=0X04C0;                         //  DBO=1ABO=1STM=1设置为自测试模式

     *MDER=0X4C;                          //  ME3=1MBX3 发送, ME2=1 接收

     *CAN_IMR=0XF7FF;                     // 中断MBX3 不使能 ,MBX2使能,低中断优先级

     *CAN_IFR=0XFFFF;                     // 清全部中断标志

}

(4)中断程序       

void interrupt GRIS5()                         // 中断入口程序

{

     switch(*PIVR)

     {

          case 64:

CANMBX_ISR();          // 邮箱2接受到相应信息则进入中断服务子程序

              break;

}  

}       

void CANMBX_ISR()                         // 邮箱2接收中断服务子程序

{

     *RCR=0X040;                          // 复位 RMP2 MIF2

     CAN_FLAG=1;                          // 置用户接收标志

}

void interrupt nothing()                           // 假中断程序

{     

}              

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

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    基于DSP2407产生带死区的6个…
    DSP2407平台下用C语言实现的…
    利用DSP2407控制马达代码
    DSP2407控制320*240大液晶显…
    基于DSP240x的串行EEPROM的接…
    基于DSP240x的串行EEPROM的接…
    TMS320LF2407与图形液晶显示…
    一个基于DSP2407串行通信接口…
    基于DSP240x PWM波形产生举例
    DSP2407头文件和命令文件示例…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号