TMS320F28335 CAN通信 可以发送,无法接收问题解决

其实可以发送说明CAN已经调通,无法接收是因为被过滤了
主要涉及下面两个寄存器
这里写图片描述
这里写图片描述
启用mask功能
ECanaMboxes.MBOX0.MSGID.bit.AME = 1;
mask的所有位都不关心
ECanaLAMRegs.LAM0.all = 0xFFFFFFFF;
这样就能接收到0号邮箱的所有报文啦。

示例代码

void CAN_Init(void)
{
// eCAN control registers require read/write access using 32-bits.  Thus we
// will create a set of shadow registers for this example.  These shadow
// registers will be used to make sure the access is 32-bits and not 16.
   struct ECAN_REGS ECanaShadow;    //就是为了临时保存数据而定义的

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the F2806x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the F2806x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example

// For this example, configure CAN pins using GPIO regs here
// This function is found in F2806x_ECan.c
   InitECanGpio();  //其实就是配置30和31号引脚

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the F2806x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in F2806x_DefaultIsr.c.
// This function is found in F2806x_PieVect.c.
   InitPieVectTable();
   EALLOW;
   PieVectTable.ECAN0INTA = &CAN0ISR;
   PieVectTable.TINT0 = &cpu_timer0_isr; //timer0在pie范围内,timer1、timer2在范围外
   EDIS;

// Step 4. Initialize the Device Peripheral. This function can be
//         found in F2806x_CpuTimers.c
   InitCpuTimers();   // For this example, only initialize the Cpu Timers
// Configure CPU-Timer 0 to interrupt every 500 milliseconds:
// 80MHz CPU Freq, 50 millisecond Period (in uSeconds)
   ConfigCpuTimer(&CpuTimer0, 90, 50);  //这里28067的时钟90MHz,周期50微秒
// To ensure precise timing, use write-only instructions to write to the entire register. Therefore, if any
// of the configuration bits are changed in ConfigCpuTimer and InitCpuTimers (in F2806x_CpuTimers.h), the
// below settings must also be updated.
   CpuTimer0Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0

// Step 4. Initialize all the Device Peripherals:
// This function is found in F2806x_InitPeripherals.c
// InitPeripherals(); // Not required for this example

// Step 5. User specific code, enable interrupts:

    InitECana(); // Initialize eCAN-A module

    EALLOW;

    // 3. 接收邮箱设置
        ECanaRegs.CANMD.all = 0xFFFFFC00;
        // Enable all Mailboxes */
        // Since this write is to the entire register (instead of a bit
        // field) a shadow register is not required.
        //收发成功都会触发邮箱中断
        ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX4.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX7.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX8.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX9.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX10.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX11.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX12.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX13.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX14.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX15.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX16.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX17.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX18.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX19.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX20.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX21.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX22.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX23.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX24.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX25.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX26.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX27.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX28.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX29.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX30.MSGCTRL.bit.DLC = 8;
        ECanaMboxes.MBOX31.MSGCTRL.bit.DLC = 8;
    // 4. 过滤配置,一定要配置滤波才能不分ID随意接收!!!
        ECanaRegs.CANME.all = 0x0;

        ECanaMboxes.MBOX10.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX11.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX12.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX13.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX14.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX15.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX16.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX17.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX18.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX19.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX20.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX21.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX22.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX23.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX24.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX25.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX26.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX27.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX28.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX29.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX30.MSGID.bit.AME = 1;
        ECanaMboxes.MBOX31.MSGID.bit.AME = 1;

        ECanaLAMRegs.LAM10.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM11.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM12.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM13.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM14.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM15.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM16.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM17.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM18.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM19.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM20.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM21.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM22.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM23.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM24.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM25.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM26.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM27.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM28.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM29.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM30.all = 0xFFFFFFFF;
        ECanaLAMRegs.LAM31.all = 0xFFFFFFFF;

    // 5. 中断配置
        ECanaShadow.CANMIM.all = ECanaRegs.CANMIM.all;
        ECanaShadow.CANMIM.all = 0xFFFFFC00;
        ECanaRegs.CANMIM.all = ECanaShadow.CANMIM.all;

        ECanaShadow.CANMIL.all = ECanaRegs.CANMIL.all;
        ECanaShadow.CANMIL.all = 0x000003FF;//邮箱中断产生在线路0上
        ECanaRegs.CANMIL.all = ECanaShadow.CANMIL.all;

        ECanaRegs.CANRMP.all = 0xFFFFFC00;

        ECanaShadow.CANGIM.all = ECanaRegs.CANGIM.all;
        //ECanaShadow.CANGIM.bit.I1EN = 0;
        ECanaShadow.CANGIM.bit.I0EN = 1;//启用针对ECAN0INT线路的所有中断
        ECanaRegs.CANGIM.all = ECanaShadow.CANGIM.all;

        ECanaRegs.CANME.all = 0xFFFFFFFF;
    EDIS;



    //有CANMIL位决定使用9.5还是9.6号中断
    PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
    IER |= M_INT9;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    // Enable TINT0 in the PIE: Group 1 interrupt 7
    // Enable CPU INT1 which is connected to CPU-Timer 0:
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    IER |= M_INT1;

    // Enable global Interrupts and higher priority real-time debug events:
       EINT;   // Enable Global interrupt INTM
       ERTM;   // Enable Global realtime interrupt DBGM
}

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是TMS320F28335的CAN通信例程: ```c #include "F2837xD_device.h" #include "F2837xD_CpuTimers.h" #include "F2837xD_Examples.h" #include "F2837xD_Gpio.h" #include "F2837xD_Ipc_drivers.h" #include "F2837xD_Ipc.h" #include "F2837xD_PieCtrl.h" #include "F2837xD_PieVect.h" #include "F2837xD_SysCtrl.h" #include "F2837xD_can.h" //定义CAN消息对象 struct ECAN_REGS ECanaShadow; void InitECana(void){ //使能ECAN模块 EALLOW; CpuSysRegs.PCLKCR10.bit.ECAN_A = 1; EDIS; //配置GPIO管脚为CAN引脚 EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0; GpioCtrlRegs.GPAQSEL2.bit.GPIO30 = 3; GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1; GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0; GpioCtrlRegs.GPAQSEL2.bit.GPIO31 = 3; GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1; EDIS; //复位ECAN模块 ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.RESET = 1; ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; while (ECanaRegs.CANES.bit.CCE != 1) {} ECanaShadow.CANES.all = ECanaRegs.CANES.all; ECanaShadow.CANES.bit.CAN_ESP = 1; ECanaRegs.CANES.all = ECanaShadow.CANES.all; while (ECanaRegs.CANES.bit.CAN_ESP != 1) {} //配置ECAN模块 ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.SCB = 1; ECanaShadow.CANMC.bit.DBO = 1; ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; ECanaShadow.CANBTC.all = 0; ECanaShadow.CANBTC.bit.TSEG1REG = 11; ECanaShadow.CANBTC.bit.TSEG2REG = 2; ECanaShadow.CANBTC.bit.BRPREG = 4; ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all; ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.CCR = 1; ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; while(ECanaRegs.CANES.bit.CCE != 0) {} //配置ECAN接收器 ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.CCR = 1; ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; while(ECanaRegs.CANES.bit.CCE != 0) {} ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; ECanaShadow.CANMD.bit.RMD = 0; ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.CCR = 0; ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; while(ECanaRegs.CANES.bit.CCE != 0) {} } void ConfigECanaMessage(uint32_t MsgID, uint32_t MsgMask, uint32_t MsgFlags){ ECanaRegs.CANME.all = 0; ECanaShadow.CANME.all = ECanaRegs.CANME.all; ECanaShadow.CANME.bit.ME0 = 1; ECanaRegs.CANME.all = ECanaShadow.CANME.all; ECanaShadow.CANMAM.all = 0x1FFFFFFF; ECanaRegs.CANMAM.all = ECanaShadow.CANMAM.all; ECanaRegs.CANMIM.all = 0; ECanaShadow.CANMIM.all = ECanaRegs.CANMIM.all; ECanaShadow.CANMIM.bit.MIM0 = 1; ECanaRegs.CANMIM.all = ECanaShadow.CANMIM.all; ECanaShadow.CANMSGCTRL.all = 0; ECanaRegs.CANMSGCTRL.all = ECanaShadow.CANMSGCTRL.all; ECanaShadow.CANMSGID.all = MsgID; ECanaRegs.CANMSGID.all = ECanaShadow.CANMSGID.all; ECanaShadow.CANMSGID.bit.AAM = 1; ECanaShadow.CANMSGID.bit.AME = 0; ECanaRegs.CANMSGID.all = ECanaShadow.CANMSGID.all; ECanaShadow.CANMSGID.all = MsgMask; ECanaRegs.CANMSK.all = ECanaShadow.CANMSGID.all; ECanaShadow.CANMSGCTRL.all = MsgFlags; ECanaRegs.CANMSGCTRL.all = ECanaShadow.CANMSGCTRL.all; } void SendECanaMessage(void){ ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.CCR = 1; ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; while(ECanaRegs.CANES.bit.CCE != 0) {} ECanaRegs.CANTRS.all = 0x0001; EALLOW; PieVectTable.ECAN0INTA = &ECana_isr; EDIS; PieCtrlRegs.PIEIER9.bit.INTx5 = 1; IER |= M_INT9; ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.CCR = 0; ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; while(ECanaRegs.CANES.bit.CCE != 0) {} } interrupt void ECana_isr(void){ uint32_t ulStatus; ulStatus = ECanaRegs.CANGIF0.all; ECanaRegs.CANGIF0.all = ulStatus; PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; } ``` 以上是一个简单的CAN通信例程,其中包括了CAN模块的初始化、CAN消息对象的配置和发送CAN消息等。请注意,这只是一个示例代码,具体实现还需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值