DSP CAN总线无法进如中断的解决办法

发布者:极地征服者最新更新时间:2015-08-17 来源: eefocus关键字:DSP  CAN总线  中断 手机看文章 扫描二维码
随时随地手机看文章
一个项目要用到TMS320LF2407 DSP,之前没用过,花了一天时间了解了一下基本操作,就开始调试CAN控制器。
使用CAN自测模式,设置邮箱3发送、邮箱2接收,并使能邮箱2的接收中断、高优先级,main.c如下:
 
#include "global.c"
void SystemInit();
void Timer1Init();
void KickDog(); 
void CANMBX_ISR();
void CAN_INIT();
unsigned int numled=0;
unsigned int CAN_FLAG;        // 定义标志寄存


main()

    unsigned int i=0;
    unsigned int RCA0=0,RCB0=0,RCC0=0,RCD0=0,RCA1=0,RCB1=0,RCC1=0,RCD1=0;
   SystemInit();             //系统初始化
  
   MCRC=MCRC & 0xFF00;         //IOE0-7设为IO口模式
   PEDATDIR=0xFF00;           //所有LED=0,   
   asm(" CLRC INTM ");        // 中断使能
   CAN_FLAG=0X00;            // 清CAN用户标志,CAN_FLAG=01表示接收到数据
   CAN_INIT();                // CAN初始化程序
   while(1)
   {
     CANTCR=0X20;                    // MBX3请求发送
     while(CANTCR&0X2000==0)        // 等待发送应答
        continue;
     CANTCR=0X2000;                // 清 TA3 和MIF3标志位
     while(CAN_FLAG==0)
     //while(CANRCR&0x0040!=0x0040)
        continue;                         // 等待接收数据
     CANRCR=0x0040;    //清接收悬挂位     
     CAN_FLAG=0;
     i++;                    // 清接收到标志
     CANMDER=0X0000;                   // 邮箱不使能
     CANMCR=0X0140;                   //  CDR=1,数据改变请求

     CANBX3A=CANBX3A+1;            // 邮箱2中数据加1用来更新邮箱3中的数据
     CANBX3B=CANBX3B+1;
     CANBX3C=CANBX3C+1;
     CANBX3D=CANBX3D+1;
     CANMCR=0X04C0;                    //  DBO=1,CDR=0,ABO=1,STM=1
     CANMDER=0X04C;                   //  ME2=ME3=1,MBX2接收, MBX3发送
      
     RCA1=CANBX2A;
     RCB1=CANBX2B;
     RCC1=CANBX2C;
     RCD1=CANBX2D;

  
   }
}
void SystemInit()

 
    asm(" SETC    INTM ");   
    asm(" CLRC  SXM  ");   
    asm(" CLRC  CNF  ");   
    asm(" CLRC  OVM  ");   
    SCSR1=0x02FC;            
    WDCR=0x006F;           
    KickDog();                 
    IFR=0xFFFF;               
    IMR=0x0003;                     
   


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=MCRB|0X0C0;                  // 设置IOPC6、IOPC7 为 CANRX,CANTX
    CANIFR=0XFFFF;                    // 清所有CAN中断标志
    CANLAM0H=0X7FFF;                // 设置邮箱2、3的屏蔽ID寄存器
    CANLAM0L=0XFFFF;                    // 0则ID必须匹配
    CANMCR=0X1040;                        //  CCR=1 改变配置请求
    while(CANGSR&0X0010==0)continue;        // 当CCE=1 时即可配置 BCR2,BCR1 寄存器
    CANBCR2=0x01;                   
    CANBCR1=0x0033;               
    CANMCR=CANMCR&0XEFFF;                //  CCR=0 改变配置结束请求
    while(CANGSR&0X0010!=0)continue;         // 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
    CANMDER=0X040;                      // 不使能邮箱,邮箱2设为接收方式
    CANMCR=0X0143;                        //  CDR=1,数据区改变请求
    CANID2H=0X2447;                    // 设置邮箱2的控制字及ID
                                    //  IDE=0, AME=0, AAM=0
                                    // 标准方式为MSGID2H[12-2]
    CANID2L=0XFFFF;
    CANCTRL2=0X08;                     // 设置控制域
                                    // 数据长度DCL = 8,RTR=0 数据帧
    CANBX2A=0X0000;                    // 邮箱2信息初始化
    CANBX2B=0X0000;
    CANBX2C=0X0000;
    CANBX2D=0X0000;
    CANID3H=0X2447;                    // 设置邮箱3的标识符
    CANID3L=0XFFFF;
    CANCTRL3=0X08;                    //  RTR=0,DCL=8
    CANBX3A=0X10;                    // 邮箱3信息初始化
    CANBX3B=0X10;
    CANBX3C=0X10;
    CANBX3D=0X10;
    CANMCR=0X04C0;                        //  DBO=1,ABO=1,STM=1设置为自测试模式
    CANMDER=0X4C;                        //  ME3=1,MBX3 发送, ME2=1 接收
    CANIMR=0X0400;                    // 中断MBX3 不使能 ,MBX2使能, 高中断优先级
    CANIFR=0XFFFF;                    // 清全部中断标志
}

 
void interrupt    c_int2()              
{

    if(PIVR!=0x27)
        {      asm(" CLRC INTM ");
            return;
        }
    T1CNT=0;
    numled++;
   
    EVAIFRA=0x80;
    asm(" CLRC    INTM ");  
   

void interrupt  c_int1()                         // 中断入口程序
{
    switch(PIVR)
    {
        case 0x40:
            CANRCR=0X040;                    // 复位 RMP2 和 MIF2
              CAN_FLAG=1;                        // 置用户接收标志

            break;
 
      

void KickDog()               
{
    WDKEY=0x5555;
    WDKEY=0xAAAA;
}
但是调试发现,邮箱能正常发送和接受,就是进不去中断,查了一上午才解决问题。对于DSP的外设中断,INT1到INT6,在Define.asm中有相应的中断向量表与之对应,如下:
;建立中断向量表          
            .sect     ".vectors"           
RSVECT      B        _c_int0
INT1         B        _c_int1
INT2         B       _c_int2
INT3        B       PHANTOM
INT4        B        PHANTOM
INT5        B        PHANTOM
INT6        B       PHANTOM
 对于邮箱2 的高优先级中断c_int2,一开始并没有在此定义,因此无法进入相应的中断,将原先的PHANTOM改为_c_int1就行了,即为其建立中断入口地址。_c_int与C语言的c_int是一样的。
PIVR是外设中断向量寄存器,用于存储最近一次被应答的外设中断的地址向量,其具体值可在中断源优先级和中断向量表中查的,对于每一个外设都有一个唯一的中断向量入口地址与之对应。
关键字:DSP  CAN总线  中断 引用地址:DSP CAN总线无法进如中断的解决办法

上一篇:模拟I2C总线多主通信的通用软件包
下一篇:计算机总线讲解

推荐阅读最新更新时间:2024-05-02 23:53

STM32CubeMX学习教程之二:GPIO输入之外部中断
本篇主要讲述GPIO外部中断输入检测,实际物理输入方式是按键,但是实际上更适合外部设备信号的输入检测,物理按键输入因为有抖动,还需要硬件或者软件去抖才比较可靠。这个例子不考虑防抖的情况。 软件版本: STM32CubeMX V4.25.0 System Workbench V2.4 硬件:OneNet 麒麟座V2.3 在STM32CubeMX中新建项目,选择正确的MCU型号 设置RCC和SYS,然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M) 根据板子的具体连接设置4个GPIO_OUTPUT (连接到LED)和4个GPIO_EXIT*(外部中断模式,
[单片机]
STM32CubeMX学习教程之二:GPIO输入之外部<font color='red'>中断</font>
基于ARM处理器LPC2142的高速数据采集卡设计
0 引言 在瞬态信号测量和图像处理等一些高速、高精度的测量中,往往都需要进行高速数据采集。现在通用的高速数据采集卡(一般多是PCI卡或ISA卡)存在有安装麻烦、价格昂贵、受计算机插槽数量/地址/中断资源的限制、可扩展性差,而且在一些电磁干扰性强的测试现场无法专门对其进行电磁屏蔽,因而会导致采集的数据失真等缺点。为此,本文给出了采用PHILIPS公司的一款LPC2142芯片(基于ARM7内核,内置了宽范围的USB2.0 Device全速串行通信接口)设计的数据采集卡的设计方案,从而有效解决了传统高速数据采集卡的上述缺陷。 1 基于ARM的数据采集卡系统结构 该系统主要由双通道模/数转换器AD9238、ARM微控制器LPC214
[工业控制]
DSP编程技巧---在main函数运行之前,你需要知道的
  在一个 C/C++ 程序能正常运行之前,相关的 C/C++ 运行时(run-time)环境首先要正确建立。在CCS软件编程的情况下, C/C++ 的实时运行库RTS的源程序库rts.src中包含了名为boot.c或者boot.asm的启动程序(在一些TI的例子里,则使用了CodeStartBranch.asm来完成启动工作,它会自动调用库文件中的boot.asm),用于在系统启动后调用c_int00函数,并通过其中的操作来完成运行时环境的建立。通常情况下,c_int00函数位于rts2800.lib库函数中的boot.obj(即TI官方编译boot.c或者boot.asm生成的目标文件)下,这也就是为什么我们在C2
[嵌入式]
<font color='red'>DSP</font>编程技巧---在main函数运行之前,你需要知道的
#C51中断计数功能(简单频率测量)
前言 T0/T1中断计数功能使用,及简单频率测量 提示:以下是本篇文章正文内容,下面案例可供参考 一、场景 方案1:单位时间计数,如1s计数,即为频率。有误差,频率约高误差逐步减小,适用于精度要求不高的测量 方案2:测周法:外部中断下降沿触发,第1个负跳变时打开定时器开始计数,第2个负跳变时关闭计数,TH0 && TL0取出,即为周期。倒数即为频率。 二、编程实现 设计思路 T1计数,T0定时。 T0中断服务函数中定时1s,关闭T1计数,并计算TH1/TL1 代码设计 void Timer1Init(void) //@11.0592MHz { TMOD &= 0x0F; //设置计数模式 GATE C/T^ M
[单片机]
#C51<font color='red'>中断</font>计数功能(简单频率测量)
基于DSP捕获单元的柴油发电机组的转速测量系统
1 引言     应用于高层建筑、银行、机场和油田等场合的柴油发电机组,必须采用相应方法控制其供电电压和频率,以确保在机组运行中具有良好的电气性能,满足应用要求。其频率控制一般是通过转速控制实现,目前应用较多的为模拟式转速调节器。由于模拟式调节器不易实现复杂控制规律、结构复杂。故采用数字式控制器。数字式控制器具有算法灵活.可实现复杂控制规律、抗干扰能力强等特点,是实现柴油发电机组转速的高精度调节的理想选择。因此,这里提出了一种以TMS320F2812 DSP为核心的转速数字控制器的测速功能系统设计.该设计方案是进一步实现转速数字控制的基础。 2 转速测量原理     在测量和控制柴油发电机组转速时,需用转速传感器检测机组转
[测试测量]
基于RISC-V的DSP芯片会是国产芯片四大件的突破口吗
2020年8月国务院印发的《新时期促进集成电路产业和软件产业高质量发展的若干政策》提出,中国芯片自给率要在2025年达到70%。被称为国产芯片“四大件”的CPU、GPU、FPGA、DSP无论对于国产芯片自给率的提升还是解决高端芯片“卡脖子”问题都意义深远。 雷锋网推出《国产芯片四大件》系列文章,分别解读国产CPU、GPU、FPGA、DSP的现状,透过投资者视角发现国产芯片机遇。 2010年诞生的最“年轻”指令集RISC-V已经吸引了众多巨头支持者,比如国外的谷歌、高通、西部数据,国内的阿里、华为、紫光展锐。 近几年,开源的RISC-V指令集芯片在IoT市场已经取得了不错的成绩,给这一市场占有优势的ARM带来不小压力。
[嵌入式]
基于RISC-V的<font color='red'>DSP</font>芯片会是国产芯片四大件的突破口吗
一种ARM+DSP协作架构的FPGA验证实现
介绍了以 ARM + DSP 体系结构为基础的FPGA实现。在其上验证应用算法,实现了由ARM负责对整个程序的控制,由DSP负责对整个程序的计算,最大程度地同时发挥了ARM和DSP的各自优势。   ARM通用CPU及其开发平台,是近年来较为流行的开发平台之一,而由ARM+DSP的双核体系结构,更有其独特的功能特点:由ARM完成整个体系的控制和流程操作,由DSP完成具体的算法和计算处理。这样,不但可以充分地发挥ARM方便的控制优势,同时又能最大限度地发挥DSP的计算功能。这在业界已逐渐成为一种趋势。   本文的FPGA的Demo验证,是在基于一款DSP内核处理器的研发基础上,对其功能进行验证的一个小目标识别算法的实现。考虑到软件环
[新品]
用51单片机中断控制LED灯亮灭
#include reg51.h //头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void delay()//延时函数 { unsigned char a,b; for(a=0;a 200;a++) for(b=0;b 200;b++); } void Int0()//使用中断所做的处理函数 { IT0=1;//外部中断0下降沿触发 EX0=1;//打开外部中断0 EA=1;//打开总中断 } void main()//主函数 { Int0();//调用函数 while(1); } void ledxs() interrupt
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved