打印

DSP28335 eCAN跟usbcan通讯问题

[复制链接]
2118|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Ryze|  楼主 | 2017-7-22 17:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件:DSP28335的eCAN-B与vp230连接,USBcan采用的是周立功的usbcan-i与上位机连接。

出现的问题是上位机上的监控软件没法接受到DSP的eCAN模块发过来的数据。


下面是代码:
void main(void)
{


   struct ECAN_REGS ECanbShadow;

   InitSysCtrl();//开启系统时钟和外设时钟

   InitECanGpio();//这里用到的是ecan-b的GPIO12和GPIO13
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;



   InitPieVectTable();



    MessageReceivedCount = 0;

    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.MBOX0.MSGID.all = 0x01C40000;//发送 标准帧
    ECanbMboxes.MBOX1.MSGID.all = 0x18040000;//接受


    ECanbRegs.CANMD.all=0x00000002;//1->RX 0->tx



    ECanbRegs.CANME.all = 0x00000003;



    ECanbMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
    ECanbMboxes.MBOX1.MSGCTRL.bit.DLC = 8;


    ECanbMboxes.MBOX0.MSGCTRL.bit.RTR = 0;
    ECanbMboxes.MBOX1.MSGCTRL.bit.RTR = 0;



    ECanbMboxes.MBOX0.MDL.all = 0x9555AAA0;
    ECanbMboxes.MBOX0.MDH.all = 0x89ABCDEF;



    EALLOW;
    ECanbRegs.CANMIM.all = 0xFFFFFFFF;
    ECanbRegs.CANMIL.all = 0;


    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.CCR = 1;
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
    EDIS;



    // Wait for CCE bit to be set..
    do
    {
      ECanbShadow.CANES.all = ECanbRegs.CANES.all;
    } while(ECanbShadow.CANES.bit.CCE != 1 );

    // Configure the eCAN timing
    EALLOW;
    ECanbShadow.CANBTC.all = ECanbRegs.CANBTC.all;


    ECanbShadow.CANBTC.bit.BRPREG = 9;    // (BRPREG + 1) = 1
    ECanbShadow.CANBTC.bit.TSEG2REG = 1 ; // to the CAN module
    ECanbShadow.CANBTC.bit.TSEG1REG = 6;  // Bit time = 2us,则为500kbps
    ECanbShadow.CANBTC.bit.SAM = 1;
    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 );

    // Configure the eCAN for self test mode
    // Enable the enhanced features of the eCAN.
    EALLOW;
    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
    ECanbShadow.CANMC.bit.ABO = 1;
    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;


    // Begin transmitting
    for(;;)                                
    {

       ECanbRegs.CANTRS.all = 0x00000001;  // Set TRS for all transmit mailboxes,MX0开始发送
       while(ECanbRegs.CANTA.all != 0x00000001 ) {}  // Wait for all TAn bits to be set..发送完成后对应的位被置1
       ECanbRegs.CANTA.all = 0x0000FFFF;   // Clear all TAn
       MessageReceivedCount++;

       //Read from Receive mailboxes and begin checking for data */

    }
}


我的想法是邮箱0设为发送邮箱,邮箱1设为接受。系统频率为100Mhz,can波特率为500k.程序运行后一直等待在while(ECanbRegs.CANTA.all != 0x00000001 ) {}这一步,也就是说没有发送完成等待置位

相关帖子

沙发
Varus| | 2017-7-22 17:18 | 只看该作者
正常发送时,程序死在这个while循环,很可能是硬件造成的

使用特权

评论回复
板凳
Snow7| | 2017-7-22 17:35 | 只看该作者
如果程序曾正常工作过,当没有节点响应接收时,就会死在这个while里

使用特权

评论回复
地板
android2| | 2017-7-22 17:47 | 只看该作者
可能是CAN高低接反,收发器使用错误,CAN线上无终端电阻导致CAN电平错误等

使用特权

评论回复
5
拉克丝| | 2017-7-22 17:59 | 只看该作者
一般程序要避免死在这个while里,一定要能退出这个while。

使用特权

评论回复
6
309030| | 2017-7-22 18:19 | 只看该作者
这自发自收,还是参考下TI的例子吧,百度里也有

使用特权

评论回复
7
lefeng| | 2017-7-22 18:32 | 只看该作者
ECanbShadow.CANBTC.bit.BRPREG = 9;    // (BRPREG + 1) = 1
    ECanbShadow.CANBTC.bit.TSEG2REG = 1 ; // to the CAN module
    ECanbShadow.CANBTC.bit.TSEG1REG = 6;  // Bit time = 2us,则为500kbps

500k波特率的话,150M频率,我用的的值是9,2,10;100M的话,这几个值好像不对,
TSEG2REG最小也是2,

这种配置最好还是用官方的好,毕竟人家做的芯片,最熟不过了

其他的对照例程检查下

使用特权

评论回复
8
quickman| | 2017-7-24 22:15 | 只看该作者
置位准备发送,将发送请求位置位,使能邮箱发送功能

使用特权

评论回复
9
jstgotodo| | 2017-7-24 22:15 | 只看该作者
检查硬件电路连接是否正常

使用特权

评论回复
10
iamaiqiyi| | 2017-7-24 22:16 | 只看该作者
不是直接将管脚相连

使用特权

评论回复
11
dzfansman| | 2017-7-24 22:16 | 只看该作者
CAN例程提供了自测模式下的通信

使用特权

评论回复
12
sanxingnote7| | 2017-7-24 22:17 | 只看该作者
波特率的问题?

使用特权

评论回复
13
backlugin| | 2017-7-24 22:17 | 只看该作者
周立功的USBcan?

使用特权

评论回复
14
sdCAD| | 2017-7-24 22:18 | 只看该作者
好像28335的例程里面对于波特率的说明

使用特权

评论回复
15
fengm| | 2017-7-24 22:18 | 只看该作者
16
sanfuzi| | 2017-7-24 22:19 | 只看该作者
没有能够发送成功吗

使用特权

评论回复
17
quickman| | 2017-7-24 22:19 | 只看该作者
这个数据配置有问题吗?

使用特权

评论回复
18
jstgotodo| | 2017-7-24 22:19 | 只看该作者
CANH和CANL正确吗?

使用特权

评论回复
19
iamaiqiyi| | 2017-7-24 22:19 | 只看该作者
CAN通信需要外扩模块的

使用特权

评论回复
20
dzfansman| | 2017-7-24 22:19 | 只看该作者
如果自测能够跑通,后面的程序可以继续执行。

使用特权

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

本版积分规则

121

主题

714

帖子

1

粉丝