📄 dsp程序格式参考.txt
字号:
//DSP的CAN模块初始化函数
//此函数只支持标准ID(11bits),不支持扩展ID
//该函数将RB0与RB3用来接收,将RB4,RB5用来发送,RB1,2未用
//波特率设置为125k
//参数1:接收邮箱RB0的SID屏蔽器
//参数2:接收邮箱RB0的SID
//参数3:接收邮箱RB3的SID屏蔽器
//参数4:接收邮箱RB3的SID
//!!注意!!DSPCAN的mask与mcp2515的mask逻辑上是反的
UINT DSPCan_Init(UINT SIDmask0,UINT SIDRb0,UINT SIDmask1,UINT SIDRb3)
{
UINT mytimer=0;
UINT tmout=3000;
UINT temp;
(*MCRB)|=0x00c0; //设置IOPC6、IOPC7为CANRX,CANTX
(*CANIFR)|=0x007f; //清所有CAN中断标志
(*CANTCR)|=0xff00;
(*CANRCR)|=0xf0f0;
temp=(SIDmask0<<2);
temp|=0x0003;
(*CANLAM0H)=temp; //设置接收邮箱0(1)的屏蔽ID寄存器
(*CANLAM0L)=0xffff;
temp=(SIDmask1<<2);
temp|=0x0003;
(*CANLAM1H)=temp; //设置接收邮箱2(3)的屏蔽ID寄存器
(*CANLAM1L)=0xffff;
mytimer=tmout;
*CANMCR=0x1000; //CCR=1改变配置请求
while(((*CANGSR)&0x0010)==0)//只有当CCE=1时可配置BCR2、BCR1寄存器
{
mytimer--;
if(mytimer==0)
return 1; //超时
}
//波特率125kb/s
*CANBCR2=0x000f; //波特率预分频寄存器 (RBP+1)=15+1=16
*CANBCR1=0x0073; //波特率设置为125K=40M/16/20 bittime=(14+1)+(3+1)+1=20
(*CANMCR)&=0xefff; //CCR=0改变配置结束请求
mytimer=tmout;
while(((*CANGSR)&0x0010)==1)//只有当CCE=0时BCR2、BCR1寄存器配置成功
{
mytimer--;
if(mytimer==0)
return 1; //超时
}
/*接收邮箱0初始化*/
*CANMDER=0x0000; //不使能邮箱
*CANMCR=0x0100; //CDR=1,数据区改变请求
temp=(SIDRb0<<2)&0x1ffc;
temp|=0x4000; //设置邮箱0的控制字及ID
*CANMSGID0H=temp; //IDE=0(标准帧),AME=1(使能接收mask),AAM=0(不自动回复远程帧)
*CANMSGID0L=0xffff;
/* *CANMSGCTRL0=0x00; //设置控制域,数据长度DCL=0 非远程帧
*CANMBX0A = 0x0000;
*CANMBX0B = 0x0000;
*CANMBX0C = 0x0000;
*CANMBX0D = 0x0000;*/
/*接收邮箱3初始化*/
*CANMDER=0x0000; //不使能邮箱
*CANMCR=0x0100; //CDR=1,数据区改变请求
temp=(SIDRb3<<2)&0x1ffc;
temp|=0x4000; //设置邮箱3的控制字及ID
*CANMSGID3H=temp; //IDE=0(标准帧),AME=1(使能接收mask),AAM=0(不自动回复远程帧)
*CANMSGID3L=0xffff;
/* *CANMSGCTRL3 = 0x00; //设置控制域,数据长度DCL=4 非远程帧
*CANMBX3A = 0x0000;
*CANMBX3B = 0x0000;
*CANMBX3C = 0x0000;
*CANMBX3D = 0x0000;*/
/*发送邮箱4初始化*/
*CANMDER=0x0000; //不使能邮箱
*CANMCR=0x0100; //CDR=1,数据区改变请求
*CANMSGID4H=0;
*CANMSGID4L=0;
*CANMSGCTRL4=0;
*CANMBX4A=0xff;
*CANMBX4B=0xff;
*CANMBX4C=0xff;
*CANMBX4D=0xff;
/*发送邮箱5初始化*/
*CANMDER=0x0000; //不使能邮箱
*CANMCR=0x0100; //CDR=1,数据区改变请求
*CANMSGID5H=0;
*CANMSGID5L=0;
*CANMSGCTRL5=0;
*CANMBX5A=0xff;
*CANMBX5B=0xff;
*CANMBX5C=0xff;
*CANMBX5D=0xff;
*CANMCR=0x0480; //DBO=1,CDR=0,ABO=1,STM=0正常工作模式
*CANMDER=0x00b9; //ME0=ME3=ME4=ME5=1,邮箱3接收,邮箱2发送
(*CANIFR)|=0x007f; //清所有CAN中断标志
(*CANTCR)|=0xff00;
(*CANRCR)|=0xf0f0;
*CANIMR=0x8984; //邮箱3,0接收中断使能,总线关闭中断使能,低中断优先级
// *CANIMR=0xbfff;
(*IFR)|=0x10; /*清INT5中断标志*/
(*IMR)|=0x10; /*开INT5中断*/
return 0;
}
void init_dsp(int T1_pr)
{
/*************************System Initialization**********************************/
asm(" SETC INTM"); /*屏蔽中断*/
asm(" CLRC CNF"); /*B0被配置为数据存储空间*/
asm(" CLRC OVM"); /*累加器结果正常溢出*/
*WDCR=0x68; /*disable watchdog timer*/
*SCSR1=0x81fe; /*CLKIN=10MHz,CLKOUT=40MHz,使能EVA,EVB,ADC,SCI,SPI,CAN*/
WSGR=0x01c0; /*Data space & Prog Space 0 wait state,IO space 7 wait states*/
/***********************Pins Initialization**************************************/
*MCRB|=0x00dc; /*设置CANTX,CANRX,SPICLK,SPISOMI,SPISIMO*/
*MCRB&=0xfedf; /*设置IOPD0,IOPC5*/
/************************ADC Initialization**************************************/
/************************EVA Initialization**************************************/
*T1PR=T1_pr; /*PWM设置周期设定*/
*T1CNT=0;
*T1CON=0x0800; /*连续增减计数,内部时钟,不分频*/
// *T2PR=7999; /*T2周期寄存器,8000个脉冲一个周期*/
// *T2CNT=0; /*编码器计数器初值*/
// *T2CON=0x9870; /*定向增减,允许编码接口*/
/************************EVB Initialization**************************************/
// *T3PR=15625; /*周期设定,100ms*/
// *T3CNT=0;
// *T3CON=0x0f00; /*连续增减计数,内部时钟,128分频*/
/**********************************开中断****************************************/
*IFR=0x0ff; /*清所有系统中断标志*/
*IMR=0x3; /*开INT2,INT1中断*/
*EVAIFRA=0x0fff; /*清除EVA所有中断标志*/
*EVAIFRB=0x0f;
*EVAIFRC=0x0f;
// *EVAIMRA=0x0001; /*开PDPINTA中断*/
*EVAIMRB=0;
*EVAIMRC=0;
*EVBIFRA=0x0fff; /*清除EVB所有中断标志*/
*EVBIFRB=0x0f;
*EVBIFRC=0x0f;
*EVBIMRA=0x0200; /*开T3下溢中断*/
*EVBIMRB=0;
*EVBIMRC=0;
// (*T1CON)|=0x0040; /*使能T1*/
// (*T3CON)|=0x0040; /*使能T3*/
asm(" CLRC INTM"); /*开中断*/
/*~~~~~~~~~~~~~~~~~~~~~~~~initialization over~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -