一个项目要用到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;