门关键词: 电位器价格 5300送话器 夏新a670耳机 烟雾报警器价格 金属化电容器 罗技无线鼠标报价 并联电容器的原理
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
电子元器件搜索:
维库电子市场网是知名的电子元器件交易网站,为电子生产企业提供IC库存和技术资料查询服务。
基于DSP2407 CAN控制器的程序设计举例
新闻出处:嵌入式技术网 发布时间: 2007-11-15

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()                           // 假中断程序

{     

}              


关闭】 【打印
 
相关专题
 
友情链接:
© 2007 电子元件网 网站地图