📄 can-memainbeifen1.c
字号:
#include "DSP28_Device.h"
void delay(int n);
interrupt void CAN0INTA_ISR();
//interrupt void CAN0INTARECEIVER_ISR();
//#define CAN_INT 1
//Global variable for this example
Uint32 ErrorCount=0;
unsigned int MessageReceiveCount=0;
Uint32 MessageTransferCount=1;
Uint32 inter=0,error=0;
extern Uint32 TestMbox1;
extern Uint32 TestMbox2;
extern Uint32 TestMbox3;
Uint32 a1[16];
Uint32 a2[16];
Uint32 a3[16];
unsigned int a[300],b[20];
void main(void)
{
//Uint16 j;
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
//InitGpio();
EALLOW;
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6=1;
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7=1;
EDIS;
/*初始化SCIA寄存器*/
InitECan();
MessageReceiveCount = 0;
ErrorCount = 0;
/*设置中断服务程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.ECAN0INTA = &CAN0INTA_ISR;
//PieVectTable.ECAN1INTA = &ECAN1INTA_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT9;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
//ECanaRegs.CANME.all = 0;//所有的邮箱不使能
// ECanaRegs.CANMC.bit.CDR=1;
// ECanaMboxes.MBOX15.MDRL.all = MessageReceiveCount*2;
ECanaMboxes.MBOX15.MDRL.bit.LOW_WORD=MessageReceiveCount*3;
// ECanaRegs.CANMC.bit.CDR=0;
// ECanaRegs.CANME.all = 0x80008000;//使能邮箱15和31
ECanaRegs.CANTRS.all=0;
//ECanaRegs.CANTRS.all = 0x8000;//发送在0~15信箱中的数据
ECanaRegs.CANTRS.bit.TRS15=1;
delay(1000);
while(ECanaRegs.CANTA.bit.TA15!= 1){;}//判断邮箱中的数据是否发送成功
ECanaRegs.CANTA.bit.TA15= 1;//清除发送响应寄存器中的标志
while(ECanaRegs.CANTA.bit.TA15!= 0){;}//等待发送响应标志被清除
MessageTransferCount++;
delay(100);
//ECanaRegs.CANRMP.bit.RMP16= 1;//清除消息未决寄存器,此条语句应该放在这里,放在中断里发现不行
// while(ECanaRegs.CANRML.bit.RML16==1) {error++;ECanaRegs.CANRML.bit.RML16=1;}//查看接受消息丢失寄存器,是否接受邮箱丢失数据,丢失一数据,error的值加1
MessageReceiveCount++;
if( MessageReceiveCount>=10)
MessageReceiveCount=0;
}
}
void delay(int n)
{
int m,k;
for(k=0;k<n;k++)
{ for(m=0;m<100;m++){;} }
}
interrupt void CAN0INTA_ISR()
{
//while(ECanaRegs.CANRMP.bit.RMP16!= 1){};//判断邮箱中的数据是否接收成功
a[inter]=ECanaMboxes.MBOX31.MDRL.all;
b[inter]=ECanaMboxes.MBOX31.MDRH.all;
inter++;
if(inter==100)
inter=0;
ECanaRegs.CANRMP.all= 0x80000000;//清除消息未决寄存器
//ECanaRegs.CANGIF0.all = 0xFFFFFFFF;//此条语句可有可无,试验证明cpu可以自动清除,不需要管理,可以读取该寄存器来读取一些标志,如0~4位表明
//置位全局邮箱中断标志的邮箱号
// ECanaRegs.CANTA.all = 0xffff;
ECanaRegs.CANRMP.all= 0xffff;
PieCtrl.PIEACK.bit.ACK9=1;
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -