打印

关于两板28335——CAN通讯的问题

[复制链接]
1860|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
595332542|  楼主 | 2014-6-4 11:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现有两板28335A(主控板)、B(采集、算法板),需要进行CAN通讯数据传输。

要求:
1、开始,数据初始化要求A→B传输;
2、数据初始化完毕,要求B采集数据→A传输。

问题:
现在偶尔出现两板不能联调的情况,这时两板程序均停留在:
while(ECanbRegs.CANTA.all !=0x00000001)

个人觉得是因为两板发送、接收的程序时序设置不合理。

大家有什么宝贵意见,关于两板均要求收发在进行设置有什么特别要注意的吗?

相关帖子

沙发
caowei0516| | 2014-6-4 16:14 | 只看该作者
请问你那有CAN的接收程序吗?

使用特权

评论回复
板凳
zhangmangui| | 2014-6-7 01:21 | 只看该作者
地板
zhangmangui| | 2014-6-7 01:22 | 只看该作者
caowei0516 发表于 2014-6-4 16:14
请问你那有CAN的接收程序吗?

DSP28335资料分享

使用特权

评论回复
5
caowei0516| | 2014-6-10 10:34 | 只看该作者
zhangmangui 发表于 2014-6-7 01:22
DSP28335资料分享

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

  interrupt void ECAN0INTB_ISR(void);
  Uint32 Rec_l0;
  Uint32 Rec_h0;

void main(void)
{
   struct ECAN_REGS ECanbShadow;

   InitSysCtrl();

   InitECanGpio();

   DINT;

   InitPieCtrl();

   IER = 0x0000;
   IFR = 0x0000;

    EALLOW;  
    PieVectTable.ECAN0INTB = &ECAN0INTB_ISR;       // TIMER0断向重定位
    EDIS;
   
    EALLOW;
    ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all;
    ECanbShadow.CANTIOC.bit.TXFUNC = 1;
    ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;

    ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all;
    ECanbShadow.CANRIOC.bit.RXFUNC = 1;
    ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all;
    EDIS;
     
    ECanbRegs.CANME.all = 0;

    ECanbMboxes.MBOX16.MSGID.all = 0x9555AAA0;
  
    ECanbRegs.CANMD.all = 0xFFFF0000;
   
    ECanbRegs.CANME.all = 0xFFFFFFFF;

    ECanbMboxes.MBOX16.MSGCTRL.bit.DLC = 8;

    ECanbMboxes.MBOX16.MSGCTRL.bit.RTR = 0;

    EALLOW;
    ECanbRegs.CANMIM.all = 0xFFFFFFFF;
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.CCR = 1;            
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;
   
    do
    {
      ECanbShadow.CANES.all = ECanbRegs.CANES.all;
    } while(ECanbShadow.CANES.bit.CCE != 1 );  
   
    EALLOW;
    ECanbShadow.CANBTC.all = ECanbRegs.CANBTC.all;

    ECanbShadow.CANBTC.bit.BRPREG = 9;    // (BRPREG + 1) = 10 feeds a 15 MHz CAN clock
    ECanbShadow.CANBTC.bit.TSEG2REG = 5 ; // to the CAN module. (150 / 10 = 15)
    ECanbShadow.CANBTC.bit.TSEG1REG = 7;  // Bit time = 15
    ECanbRegs.CANBTC.all = ECanbShadow.CANBTC.all;
   
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.CCR = 0;            
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;

    do
    {
      ECanbShadow.CANES.all = ECanbRegs.CANES.all;
    } while(ECanbShadow.CANES.bit.CCE != 0 );

    EALLOW;
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.STM = 0;    // Configure CAN for self-test mode  
    ECanbShadow.CANMC.bit.SCB = 1;    // eCAN mode (reqd to access 32 mailboxes)
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;
   
    EALLOW;
    ECanaRegs.CANMIM.all = 0xFFFFFFFF;     //邮箱中断屏蔽位
    ECanaRegs.CANMIL.all = 0;            //邮箱中断将产生在ECAN0INT
    ECanaRegs.CANGIF0.all = 0xFFFFFFFF;  //全局中断标志寄存器
    ECanaRegs.CANGIM.bit.I0EN = 1;   //ECAN0INT中断请求线被使能
    EDIS;

    PieCtrlRegs.PIEIER9.bit.INTx7 = 1;   //使能PIE中断
    IER |= M_INT9;                       //使能CPU中断
    EINT;
    ERTM;   

    for(;;)
    {

    }
}
  


// Begin receiving

interrupt void ECAN0INTB_ISR(void)  // eCAN-B
{
   while(ECanbRegs.CANRMP.all != 0x00010000 ) {}  // Wait for all TAn bits to be set..
       ECanbRegs.CANRMP.all = 0x00010000;   // Clear all TAn   
       Rec_l0 =  ECanbMboxes.MBOX16.MDL.all;
       Rec_h0 =  ECanbMboxes.MBOX16.MDH.all;
       PieCtrlRegs.PIEACK.bit.ACK9 = 1;
       ECanbRegs.CANOPC.all = 0;
       EINT;

}   

能帮我看看这个接收为什么进入不了中断吗?

使用特权

评论回复
6
zhangmangui| | 2014-6-10 13:45 | 只看该作者
caowei0516 发表于 2014-6-10 10:34
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h ...

下来抽时间看

使用特权

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

本版积分规则

30

主题

77

帖子

3

粉丝