我现在在做28035的eCAN的通讯,想用中断进行接收数据,但是貌似是怎么也进不去中断,各位大侠对于28035的eCAN的中断有什么需要特别注意的地方给点建议,我的程序如下
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
#include "DSP2803x_Device.h"
void delay_loop1();
void CAN_GpioInit();
void ECAN_Init();
Uint32 Rec_H;
Uint32 Rec_L;
void main()
{
InitSysCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
Rec_H=0;
Rec_L=0;
CAN_GpioInit();
ECAN_Init();
PieCtrlRegs.PIEIER9.bit.INTx5=1; //使能PIE中断
IER|=M_INT9; //使能CPU中断
EINT; //开全局中断
ERTM; //开实时中断
for(;;)
{
}
}
void CAN_GpioInit()
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO30=0;
GpioCtrlRegs.GPAPUD.bit.GPIO31=0;
GpioCtrlRegs.GPAMUX2.bit.GPIO30=1; //设置Gpio30工作在Ecan的模式
GpioCtrlRegs.GPAMUX2.bit.GPIO31=1; //设置Gpio31工作在ECAN的模式
GpioCtrlRegs.GPAMUX2.bit.GPIO29=0;
GpioCtrlRegs.GPADIR.bit.GPIO29=1;
EDIS;
GpioDataRegs.GPADAT.bit.GPIO29=1;
}
void ECAN_Init()
{
struct ECAN_REGS ECanaShadow;
EALLOW;
ECanaShadow.CANTIOC.all=ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC=1; //设置CANTx为ECAN的发送端口
ECanaRegs.CANTIOC.all=ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all=ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC=1; //设置CANRx为ECAN的接收端口
ECanaRegs.CANRIOC.all=ECanaShadow.CANRIOC.all;
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM=0; //0则是工作在正常的模式,1则是自测模式
ECanaShadow.CANMC.bit.SCB=1; //选择工作在ECAN模式下
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
EDIS;
ECanaMboxes.MBOX1.MSGCTRL.all=0x00000000; //初始化邮箱0的控制区域为零,
ECanaRegs.CANTA.all=0xffffffff; //清除所有的发送标志位
ECanaRegs.CANRMP.all=0xffffffff; //清除所有的接收标志位
ECanaRegs.CANGIF0.all = 0xFFFFFFFF; /* Clear all interrupt flag bits */
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
EALLOW;
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR=1; //请求改变配置信息即时钟参数的配置
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all=ECanaRegs.CANES.all; //这里一定要注意必须要有这一句,否则的话不会去判断位CCE是否置位
}
while(ECanaShadow.CANES.bit.CCE!=1); //只有CCE置位以后才能对CANBTC进行设置
EALLOW;
ECanaRegs.CANBTC.all=0x00000000;
ECanaShadow.CANBTC.all=ECanaRegs.CANBTC.all;
ECanaShadow.CANBTC.bit.BRPREG=2;
ECanaShadow.CANBTC.bit.TSEG1REG=6;
ECanaShadow.CANBTC.bit.TSEG2REG=1;
ECanaShadow.CANBTC.bit.SAM=1;
ECanaRegs.CANBTC.all=ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all=ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR=0; //请求Cpu正常工作
ECanaRegs.CANMC.all=ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all=ECanaRegs.CANES.all;
}
while(ECanaShadow.CANES.bit.CCE!=0); //等待CCE被清零
ECanaRegs.CANME.all=0; //屏蔽 所有的邮箱
ECanaMboxes.MBOX1.MSGID.all = 0X9555AAA1; //设置接收邮箱1的ID
ECanaShadow.CANMD.all=ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD1=1; //设置邮箱1作为接收邮箱
ECanaRegs.CANMD.all=ECanaShadow.CANMD.all;
//设置邮箱1的接收的数据的格式
ECanaMboxes.MBOX1.MSGCTRL.bit.DLC=8; //邮箱1接收的数据长度为8个字节
ECanaMboxes.MBOX1.MSGCTRL.bit.RTR=0; //没有远方应答帧被请求
ECanaMboxes.MBOX1.MSGCTRL.bit.TPL=0; //优先级设置为0
//ECanaMboxes.MBOX0.MDL.all=0x01234567;//向邮箱0的RAM区域写数据
//ECanaMboxes.MBOX0.MDH.all=0x76543210;
ECanaShadow.CANME.all=ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME1=1; //使能接收邮箱1
ECanaRegs.CANME.all=ECanaShadow.CANME.all;
EALLOW;
ECanaRegs.CANMIM.all=0xffffffff; //使能全部邮箱中断
ECanaRegs.CANMIL.all=0; //邮箱中断发生在中断线0上
ECanaRegs.CANGIF0.all=0xffffffff;
ECanaRegs.CANGIF1.all=0xffffffff;
ECanaRegs.CANGIM.bit.I0EN=1; //ECANI0EN中断线使能
ECanaRegs.CANGIM.bit.I1EN=1;
ECanaRegs.CANGIM.bit.GIL=0;
EDIS;
}
interrupt void ECAN0INTA_ISR(void)
{
while(ECanaRegs.CANRMP.all!=0x00000002);
ECanaRegs.CANRMP.all=0x00000002; //复位接收请求寄存器
GpioDataRegs.GPADAT.bit.GPIO29=0; //中断进入指示
delay_loop1();
GpioDataRegs.GPADAT.bit.GPIO29=1;
Rec_L=ECanaMboxes.MBOX1.MDL.all; //接收数据
Rec_H=ECanaMboxes.MBOX1.MDH.all;
PieCtrlRegs.PIEACK.bit.ACK9=1; //中断应答
EINT;
}
void delay_loop1()
{
short i,j;
for (i = 0; i < 1000; i++)
for(j=0;j<1000;j++);
}
|