huhang 发表于 2013-5-13 09:54:49

DSP28035 can 通信不能成功发送数据

最近在调试DSP28035can通信,采用查询方式发送,发送标志始终显示未发送成功,但TX管脚示波器上又有发送数据波形,但显示的波形可以看出发送的数据又是不正确的,有没有遇到过同样问题的朋友?

下面为初始化代码
void InitCan(void)
{

        struct ECAN_REGS ECanaShadow;
          EALLOW;
          ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
          ECanaShadow.CANTIOC.bit.TXFUNC = 1;
          ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
          ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
          ECanaShadow.CANRIOC.bit.RXFUNC = 1;
          ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;

          ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
          ECanaShadow.CANMC.bit.SCB = 1;// User has selected eCAN mode
          ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

          ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
          ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;

          ECanaRegs.CANTA.all = 0xFFFFFFFF;   // Clear all TAn bits
          ECanaRegs.CANRMP.all = 0xFFFFFFFF;// Clear all RMPn bits
          ECanaRegs.CANGIF0.all = 0xFFFFFFFF; // Clear all interrupt flag bits
          ECanaRegs.CANGIF1.all = 0xFFFFFFFF;

          // Configure bit timing parameters for eCANA
          ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
          ECanaShadow.CANMC.bit.CCR = 1 ;            // Set CCR = 1
          ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
          // Wait until the CPU has been granted permission to change the configuration registers
          do
          {
              ECanaShadow.CANES.all = ECanaRegs.CANES.all;
          } while(ECanaShadow.CANES.bit.CCE != 1 );

          ECanaShadow.CANBTC.all = 0;



          ECanaShadow.CANBTC.bit.BRPREG = 1;    //2   1
          ECanaShadow.CANBTC.bit.TSEG2REG = 9;//1   9
          ECanaShadow.CANBTC.bit.TSEG1REG = 6;//6   6

          ECanaShadow.CANBTC.bit.SAM = 1;

          ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;

          ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
          ECanaShadow.CANMC.bit.CCR = 0 ;
          /////////////////////////////////////////////////////
           /* ECanaShadow.CANMC.bit.PDR = 0;
          ECanaShadow.CANMC.bit.DBO = 0;
          ECanaShadow.CANMC.bit.WUBA = 0;
          ECanaShadow.CANMC.bit.CDR = 0;
          ECanaShadow.CANMC.bit.ABO = 0;
          ECanaShadow.CANMC.bit.STM = 0;
          ECanaShadow.CANMC.bit.SRES = 0;
          ECanaShadow.CANMC.bit.MBNR = 0;
          ECanaShadow.CANMC.bit.SUSP = 1;*/
          /////////////////////////////////////////////////////
          ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
          do
          {
              ECanaShadow.CANES.all = ECanaRegs.CANES.all;
          } while(ECanaShadow.CANES.bit.CCE != 0 );
          //Disable all Mailboxes
          ECanaRegs.CANME.all = 0;      // disable
          EDIS;

          EALLOW;
          ECanaMboxes.MBOX0.MSGID.all = 0x00040000;//0x9555AAA0   0x00040000
          ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;//Send MailBox
          ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;//Receive MailBox
          ECanaRegs.CANMD.all =0x00000002;//0:send   1:receive
          ECanaRegs.CANME.all = 0x00000003;
                EDIS;

          ECanaMboxes.MBOX0.MDL.all = 0x12345678;//0x9555AAA0;
          ECanaMboxes.MBOX0.MDH.all = 0x89ABCDEF;
          EALLOW;
                ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
                ECanaShadow.CANMC.bit.STM = 0;    // Configure CAN for self-test mode 1
                ECanaShadow.CANMC.bit.DBO = 1;
                ECanaShadow.CANMC.bit.ABO = 1;    //CAN BUS ON
                ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
          EDIS;


                EALLOW;
                ECanaRegs.CANMIM.all=0x00000002;//使能邮箱1接收中断

                ECanaRegs.CANMIL.all=0;//所有邮箱在中断0(ECANOINT)产生邮箱中断

                ECanaRegs.CANGIF0.all=0xFFFFFFFF;//全局中断标志寄存器CANGIF0所有标志位清零
                ECanaRegs.CANGIF1.all=0xFFFFFFFF;//全局中断标志寄存器CANGIF1所有标志位清零

                ECanaRegs.CANGIM.bit.I0EN=1;//eCAN模块中中断0使能

                EDIS;
}      

发送函数:
void sCanSend(void)
{
       ECanaRegs.CANTRS.all = 0;
       ECanaMboxes.MBOX0.MDL.all = 0x12345678;//0x9555AAA0;
       ECanaMboxes.MBOX0.MDH.all = 0x89ABCDEF;

       ECanaRegs.CANTRS.all = 0x00000001;

        while(ECanaRegs.CANTA.all != 0x00000001 ) {}//程序会一直卡在这里
       ECanaRegs.CANTA.all = 0x00000001;

   }   

huhang 发表于 2013-5-15 23:11:29

问题解决

xujie841128 发表于 2013-5-18 14:38:30

我也遇到同样的问题,发不出数据,但是总线一直有数据,快满载了,你是怎么解决的?{:sad:}

huhang 发表于 2013-5-21 20:46:18

xujie841128 发表于 2013-5-18 14:38 static/image/common/back.gif
我也遇到同样的问题,发不出数据,但是总线一直有数据,快满载了,你是怎么解决的? ...

CAN通信需要两个节点才能一起调试的,一个做为接收一个发送,如果只有一个发送的节点,并且设置的重发模式,会因为对方没有应答,发送方会一直重新发送数据的。如果有一个接收节点成功接收数据就OK了

Lauchael 发表于 2013-6-14 02:39:49

学习了!

51EDA技术 发表于 2013-6-14 07:50:52

huhang 发表于 2013-5-21 20:46 static/image/common/back.gif
CAN通信需要两个节点才能一起调试的,一个做为接收一个发送,如果只有一个发送的节点,并且设置的重发模 ...

+1.                                                   

breakhell 发表于 2013-11-19 16:49:02

我最近也在调试F28035 can,总线上一直没有数据,楼主可以留个邮箱,让我咨询下吗?

huhang 发表于 2013-11-19 20:30:17

breakhell 发表于 2013-11-19 16:49 static/image/common/back.gif
我最近也在调试F28035 can,总线上一直没有数据,楼主可以留个邮箱,让我咨询下吗? ...

284602883@qq.com

xiaowenshao 发表于 2013-11-25 13:17:48

我用的ti的例程,2802,while(ECanaRegs.CANTA.all != 0x00000001 ) {}//程序会一直卡在这里
而且怎么canTX引脚没有波形呢,,再自测试的时候是正常的
请楼主指导一下

xiaowenshao 发表于 2013-11-25 15:57:46

51EDA技术 发表于 2013-6-14 07:50
+1.

如果不是两个节点的话,dspTX引脚应该有波形吧,,收发器的canH和canL直接也应该有波形吧,,我现在将ABO置位,dsp按理会一直发数据,,但是我用示波器在dsp的canTX引脚测不到波形,在收发器的canH和canL直接也测不到波形,反而在dsp的canRX引脚有波形,好奇怪啊,,麻烦大神指点一下{:3_47:}

51EDA技术 发表于 2013-11-25 20:18:07

xiaowenshao 发表于 2013-11-25 15:57
如果不是两个节点的话,dspTX引脚应该有波形吧,,收发器的canH和canL直接也应该有波形吧,,我现在将ABO ...

如果只有一个节点,可以先用自收自发模式,首先确定软件没有问题。如果自收自发可以的话,再切换到正常模式。一般来说自收自发模式可以了,正常模式就没多大问题了。正常模式下调试,就必须至少要2个节点了。

xiaowenshao 发表于 2013-11-25 22:19:17

51EDA技术 发表于 2013-11-25 20:18
如果只有一个节点,可以先用自收自发模式,首先确定软件没有问题。如果自收自发可以的话,再切换到正常模 ...

我现在一个节点,程序一直在发送数据,但是用示波器测量dsp的canTX引脚无波形,测量dsp的canRX引脚却有波形(还比较规律的波形),vp230的canH和canL无波形,,这是什么情况呢;

huhang 发表于 2013-11-25 22:31:00

xiaowenshao 发表于 2013-11-25 22:19
我现在一个节点,程序一直在发送数据,但是用示波器测量dsp的canTX引脚无波形,测量dsp的canRX引脚却有波 ...

一个节点测试TX管脚上的波形,在你设置了重发模式后,示波器是能捕捉到波形,但波形是不对的,测试没有意义,所以想看到正确的发送数据,必须有一个接收节点。至于你说的RX脚上有波形,就不应该了,检查下你的电路吧

xiaowenshao 发表于 2013-11-26 09:26:25

huhang 发表于 2013-11-25 22:31
一个节点测试TX管脚上的波形,在你设置了重发模式后,示波器是能捕捉到波形,但波形是不对的,测试没有意 ...

确实是电路问题,当时查电路只看了原理图,后来发现pcb不一致,坑爹啊

30zero 发表于 2014-1-17 12:24:59

楼主,我最近也在搞28069的can通信收发,可以发你的程序给我参考? 邮箱:592876981@qq.com

huhang 发表于 2014-1-18 10:49:27

30zero 发表于 2014-1-17 12:24
楼主,我最近也在搞28069的can通信收发,可以发你的程序给我参考? 邮箱:

官方的例程就好用的。

30zero 发表于 2014-1-20 13:36:27

huhang 发表于 2014-1-18 10:49
官方的例程就好用的。

不明白接收邮箱,和仲裁域的位置。能发一下你做好的通信程序给我参考吗

30zero 发表于 2014-1-26 10:28:33

楼主,我现在像你描叙的一样,同样的卡在哪里,我也是2个CAN的模块在调。接收的也是没有接收到消息,总线上也是没有波形输出。硬件是iso1050隔离式CAN芯片,电路图是ISO1050的典型接法,这没有错的!2边的自测程序也没有问题的~

xxp123 发表于 2014-10-12 09:19:12

xiaowenshao 发表于 2013-11-25 22:19
我现在一个节点,程序一直在发送数据,但是用示波器测量dsp的canTX引脚无波形,测量dsp的canRX引脚却有波 ...

你好!请问你以下你最后CAN输不出波形是怎么解决的。我现在也在苦恼中。。

xiaowenshao 发表于 2014-10-12 21:39:42

xxp123 发表于 2014-10-12 09:19
你好!请问你以下你最后CAN输不出波形是怎么解决的。我现在也在苦恼中。。 ...

我当时是硬件上的问题

powerk6 发表于 2014-10-29 00:17:16

最近也碰到同样问题,TX无波形,不知什么原因,自测好着

xxp123 发表于 2015-6-28 19:51:53

本帖最后由 xxp123 于 2015-6-28 19:56 编辑

xiaowenshao 发表于 2013-11-25 15:57
如果不是两个节点的话,dspTX引脚应该有波形吧,,收发器的canH和canL直接也应该有波形吧,,我现在将ABO ...

因为我使用的是TI DSPF28035官方例程,例程里面是自循环,当程序改为正常模式时,需要在初始化时加上CANGPIO的初始化,程序才能正常工作。。(官方例程缺少这句,然而后面我使用F28335,官方自循环例程是有CANGPIO初始化的,只能说28035的官方例程不完善)

打酱油要专业 发表于 2016-4-30 19:50:55

51EDA技术 发表于 2013-6-14 07:50
+1.

你好。您会CLA么。交流下。835016072

yinglively2000 发表于 2016-9-20 13:37:54

+1                                 
页: [1]
查看完整版本: DSP28035 can 通信不能成功发送数据