#include "DSP28x_Project.h"
__interrupt void Receive_ISR(void);
void main(void)
{
InitSysCtrl(); //初始化系统控制
DINT; //禁用CPU中断
//开中断,配置中断函数 ;
IER = 0x0000; //禁用CPU中断并清零
IFR = 0x0000;
InitPieCtrl(); //初始化PIE控制
InitPieVectTable(); //初始化PIE向量表
InitECanGpio();
InitECan(); //初始化eCAN模块
EALLOW;
PieVectTable.ECAN0INTA = &Receive_ISR; //中断被重新映射到ISR函数中
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx5 = 1; //使能PIE模块中的外设中断ECAN0INT
IER |= M_INT9; //使能CPU中断
EINT; // 启用全局中断
ERTM; // 启用全局实时中断
for(;;);
}
void InitECanGpio(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0; //上拉使能
GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO30 = 3; //异步,该选项仅适用于配置为外设的引脚
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1; //配置GPIO引脚作为输出
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1;
EDIS;
}
void InitECan(void)
{
struct ECAN_REGS ECanaShadow;
EALLOW;
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all; //配置CANTX引脚为CAN发送功能
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all; //配置CANRX引脚为CAN接收功能
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
EDIS;
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM = 0; //0表示模块工作在正常模式(1表示工作在自测模式)
ECanaShadow.CANMC.bit.SCB = 1; //1表示工作在eCAN模式;0表示工作在标准CAN模式(SCC),此时只能使用0-15号邮箱
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000; //初始化消息控制寄存器的所有位为零
ECanaRegs.CANTA.all = 0xFFFFFFFF; //置位所有的发送响应寄存器
ECanaRegs.CANRMP.all = 0xFFFFFFFF; //置位所有的接收消息挂起寄存器
ECanaRegs.CANGIF0.all = 0xFFFFFFFF; //清除所有的中断标志位
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; //置位CCR位后,使用户能够配置位时序配置寄存器
ECanaShadow.CANMC.bit.CCR = 1;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}
while(ECanaShadow.CANES.bit.CCE!=1); //写1表示CPU已经对配置寄存器进行写操作
EALLOW;
ECanaShadow.CANBTC.bit.BRPREG =1; //波特率计算公式:SYSCLK/[2*(3+TSEG1REG+TSEG2REG)(1+BRPREG)]
ECanaShadow.CANBTC.bit.TSEG2REG =4; //CAN通信的波特率为1MHz
ECanaShadow.CANBTC.bit.TSEG1REG =13;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0; //CPU请求正常操作(当CANBTC被设置为允许的值,即波特率合适的时候才能执行这项操作)
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; //屏蔽所有的邮箱,在写MSGID之前要完成该操作
ECanaMboxes.MBOX16.MSGID.all = 0x80C20000; //设置接收邮箱的ID,扩展帧
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
//ECanaShadow.CANMD.bit.MD16 = 0; //邮箱16为RX
ECanaShadow.CANMD.bit.MD16 = 1; //邮箱16置1为RX
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
ECanaMboxes.MBOX16.MSGCTRL.bit.DLC = 8; //设置数据长度为8字节
// ECanaMboxes.MBOX16.MSGCTRL.bit.TPL = 0; //设置发送优先级
ECanaMboxes.MBOX16.MSGCTRL.bit.RTR = 0; //没有远方应答帧被请求
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME16 = 1; //使能邮箱16
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
EALLOW;
ECanaRegs.CANMIM.all = 0xFFFFFFFF;
ECanaRegs.CANMIL.all = 0; //邮箱中断将产生在EAN0INT
ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
ECanaShadow.CANGIM.all = ECanaRegs.CANGIM.all;
ECanaShadow.CANGIM.bit.I0EN = 1; //ECAN0INT中断请求线被使能
ECanaRegs.CANGIM.all = ECanaShadow.CANGIM.all;
EDIS;
}
Uint32 Rec_1;
Uint32 Rec_2;
__interrupt void Receive_ISR(void)
{
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
while(ECanaRegs.CANRMP.all != 0x00010000); //等待清除16号邮箱的的标志位
ECanaRegs.CANRMP.all = 0x00010000; //复位RMP标志,同时也复位中断标志
Rec_1 = ECanaMboxes.MBOX16.MDL.all; //收到的数据在接收邮箱Mbox16
Rec_2 = ECanaMboxes.MBOX16.MDH.all;
PieCtrlRegs.PIEACK.bit.ACK9 =1;
EINT;
}
现在有两个问题:1.函数不能进入中断 2.通过CANTest能够发送出来消息,但是通过邮箱接收到的与发送出来的不一致。
请高手帮忙看看,小弟感激不尽!!!
|