📄 can_test.c
字号:
#include "DSP28_Device.h"
void mailbox_check(int32 T1,int32 T2,int32 T3);
void mailbox_read(int16 i);
void delay();
interrupt void CAN0INTA_ISR();
//interrupt void CAN0INTARECEIVER_ISR();
//#define CAN_INT 1
//Global variable for this example
Uint32 ErrorCount=0;
Uint32 MessageReceiveCount=1;
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];
Uint32 a[100],b[100];
void main(void)
{
Uint16 j;
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化SCIA寄存器*/
InitECan();
MessageReceiveCount = 0;
ErrorCount = 0;
#if CAN_INT
/*设置中断服务程序入口地址*/
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;
#endif
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
ECanaMboxes.MBOX0.MDRL.all = MessageReceiveCount;
delay();
ECanaRegs.CANTRS.all = 0x0000FFFF;//发送在0~15信箱中的数据
while(ECanaRegs.CANTA.all != 0xffff);//判断邮箱中的数据是否发送成功
ECanaRegs.CANTA.all = 0x0000FFFF;//清除发送响应寄存器中的标志
MessageTransferCount++;
while(ECanaRegs.CANRMP.all!= 0xffff0000){};//判断邮箱中的数据是否接收成功
ECanaRegs.CANRMP.all= 0xFFFF0000;//清除消息未决寄存器,此条语句应该放在这里,放在中断里发现不行
while(ECanaRegs.CANRML.bit.RML16==1) {error++;ECanaRegs.CANRML.bit.RML16=1;}//查看接受消息丢失寄存器,是否接受邮箱丢失数据,丢失一数据,error的值加1
MessageReceiveCount++;
#if !CAN_INT
for(j = 16; j < 32; j++)
{
mailbox_read(j);//读取邮箱0~15中的数据和id
// mailbox_check(TestMbox1,TestMbox2,TestMbox3);
}
#endif
}
}
void mailbox_read(int16 MBXnbr)
{
volatile struct MBOX *Mailbox;
volatile struct MBOX *Mailbox1;
Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
Mailbox1= &ECanaMboxes.MBOX0 + MBXnbr-16;
a1[MBXnbr-16]=Mailbox1->MDRL.all;
a2[MBXnbr-16]=Mailbox->MDRL.all;
a3[MBXnbr-16]=Mailbox->MDRL.all;
delay();
TestMbox1 = Mailbox->MDRL.all; // = 0x9555AAAn (n is the MBX number)
TestMbox2 = Mailbox->MDRH.all; // = 0x89ABCDEF (a constant)
TestMbox3 = Mailbox->MID.all;// = 0x9555AAAn (n is the MBX number)
} // MSGID of a rcv MBX is transmitted as the MDL data.
void mailbox_check(int32 T1, int32 T2, int32 T3)
{
if((T1 != T3) || ( T2 != 0x89ABCDEF))
{
ErrorCount++;
}
}
void delay()
{
int m;
for(m=0;m<100;m++){}
}
interrupt void CAN0INTA_ISR()
{
a[inter]=ECanaMboxes.MBOX16.MDRL.all;
b[inter]=ECanaMboxes.MBOX18.MDRL.all;
inter++;
if(inter==100)
inter=0;
//ECanaRegs.CANRMP.all= 0x10000;//清除消息未决寄存器
ECanaRegs.CANGIF0.all = 0xFFFFFFFF;//此条语句可有可无,试验证明cpu可以自动清除,不需要管理,可以读取该寄存器来读取一些标志,如0~4位表明
//置位全局邮箱中断标志的邮箱号
PieCtrl.PIEACK.bit.ACK9=1;
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -