问题:CAN通信能够发送,但是无法进行接收中断函数
排查:硬件没有问题,canrx引脚通过示波器能够看到对应的波形,发送正常则硬件数据流没有问题,接收无法进入中断,有可能是接收中断没有配置正确。
方案1,选择官方例程测试,依据没有进入接收中断。
方案2,在网上搜集很多例程依旧没有进入接收中断。
最后,通过官方例程教程发现是ID号被屏蔽。0xc20000,才能进入中断。
且在配置ID号之前,要关闭中断。
‘ ECanbShadow.CANME.all = ECanbRegs.CANME.all;
ECanbShadow.CANME.all = 0; // Required before writing the MSGIDs
ECanbRegs.CANME.all = ECanbShadow.CANME.all;
在配置参数
/*接收邮箱的ID号*/
ECanbMboxes.MBOX16.MSGID.all = 0xe012a8e9;
/************************************************************************/
问题2:不同硬件平台,有可能硬件接口不一样,或者时钟频率不一样都需要注意修改。
//配置GPIO引脚工作在eCAN功能
#if 0
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1; // Enable pull-up for GPIO16 (CANTXB)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 1; // Enable pull-up for GPIO17 (CANRXB)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch qual for GPIO17 (CANRXB)
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 2; // Configure GPIO16 for CANTXB operation
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 2; // Configure GPIO17 for CANRXB operation
#endif
#if 1
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 1; // Enable pull-up for GPIO20 (CANTXB)
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 1; // Enable pull-up for GPIO21 (CANRXB)
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3; // Asynch qual for GPIO21 (CANRXB)
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 3; // Configure GPIO20 for CANTXB operation
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 3;
#endif
外部时钟30Mhz,选择,DSP28_DIVSEL 2; DSP28_PLLCR 10
外部时钟25Mhz选择 DSP28_DIVSEL 3;#define DSP28_PLLCR 6
/*-----------------------------------------------------------------------------
Specify the PLL control register (PLLCR) and divide select (DIVSEL) value.
-----------------------------------------------------------------------------*/
// #define DSP28_DIVSEL 0 // Enable /4 for SYSCLKOUT
//#define DSP28_DIVSEL 1 // Disable /4 for SYSCKOUT
// #define DSP28_DIVSEL 2 // Enable /2 for SYSCLKOUT
#define DSP28_DIVSEL 3 // Enable /1 for SYSCLKOUT
// #define DSP28_PLLCR 10
//#define DSP28_PLLCR 9
// #define DSP28_PLLCR 8
//#define DSP28_PLLCR 7
#define DSP28_PLLCR 6
//#define DSP28_PLLCR 5
//#define DSP28_PLLCR 4
//#define DSP28_PLLCR 3
// #define DSP28_PLLCR 2
// #define DSP28_PLLCR 1
//#define DSP28_PLLCR 0 // PLL is bypassed in this mode
//---------------