一个项目要用到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(” SETCINTM “);
asm(” CLRCSXM“);
asm(” CLRCCNF“);
asm(” CLRCOVM“);
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 interruptc_int2()
{
if(PIVR!=0x27)
{asm(” CLRC INTM “);
return;
}
T1CNT=0;
numled++;
EVAIFRA=0x80;
asm(” CLRCINTM “);
}
void interruptc_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”
RSVECTB_c_int0
INT1B_c_int1
INT2B_c_int2
INT3BPHANTOM
INT4BPHANTOM
INT5BPHANTOM
INT6BPHANTOM
关于邮箱2 的高优先级中止c_int2,一开端并没有在此界说,因而无法进入相应的中止,将原先的PHANTOM改为_c_int1就行了,即为其树立中止进口地址。_c_int与C言语的c_int是相同的。
PIVR是外设中止向量存放器,用于存储最近一次被应对的外设中止的地址向量,其详细值可在中止源优先级和中止向量表中查的,关于每一个外设都有一个仅有的中止向量进口地址与之对应。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/233705.html