打印
[DSP编程]

CAN通讯28069的片子无法进入接收通讯,求助+++++++

[复制链接]
912|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#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能够发送出来消息,但是通过邮箱接收到的与发送出来的不一致。

请高手帮忙看看,小弟感激不尽!!!




使用特权

评论回复

相关帖子

沙发
YANGYANG777|  楼主 | 2019-8-3 13:28 | 只看该作者
自己顶

使用特权

评论回复
板凳
YANGYANG777|  楼主 | 2019-8-6 17:19 | 只看该作者
有没有大佬帮忙看看,解决了我愿意出50元红包

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝