打印

TMS320F2812的eCAN程序调试问题

[复制链接]
2581|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linhai2009|  楼主 | 2009-11-5 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前正在调试2812的eCAN,查阅和参考了很多资料,还是不知道为什么无法实现数据的发送和接收.下面以CAN发送为例,给出详细的程序,请有经验的同仁们给指点一二~~~ECAN邮箱自发自收没有问题; 但示波器测量CAN发送的输出脚没有预设的数据,电平始终为1V.

#include "DSP28_Device.h"
#define TXCOUNT  1000    //设定CAN发送次数
int TXcounter ;                   //发送次数
unsigned long int  i;
struct        ECAN_REGS ECanaShadow;   //影子寄存器
void InitSysCtrl(void);
void IOinit(void);  
void InitECan(void);              //CAN初始化
main()
{   
       InitSysCtrl();              //初始化DSP
        DINT;                       //关闭总中断
     IER = 0x0000;                     //关闭外设中断
     IFR = 0x0000;               //清中断标志
     TXcounter=0;
       IOinit();                   //配置GPIO         
       InitECan();                 //初始化CAN模块
     //-----------------------------配置CAN邮箱----------------------------   
                //配置发送邮箱MBOX0的信息标识符寄存器(MSGID,11位标识符)
                ECanaMboxes.MBOX0.MSGID.all = 0x5C600000;   //0号邮箱标识符
           //配置邮箱0为发送
         ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;        
         ECanaShadow.CANMD.bit.MD0 = 0;      //邮箱0为发送
         ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
                //配置发送邮箱0的数据长度为8个字节
            ECanaMboxes.MBOX0.MCF.bit.DLC = 8;
                //将待发送的数据写入发送邮箱MBOX0 的RAM//     
                 ECanaMboxes.MBOX0.MDRL.all = 0x9555AAA0;
         ECanaMboxes.MBOX0.MDRH.all = 0x89ABCDEF;
         //使能邮箱0
         ECanaShadow.CANME.all = ECanaRegs.CANME.all;        
         ECanaShadow.CANME.bit.ME0 = 1;      
         ECanaRegs.CANME.all = ECanaShadow.CANME.all;         

         while(1)
          {   
               /* CAN 发送程序: 邮箱MBOX0发送8字节的数据   */
                 for (i=0;i<TXCOUNT;i++)
                   {
                  ECanaShadow.CANTRS.all = 0;         
                  ECanaShadow.CANTRS.bit.TRS0 = 1;      //CPU对CANTRS[0]置位开始邮箱0的发送      
                ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
         
                  while(ECanaRegs.CANTA.bit.TA0 == 0){} //等待TA0置位.置位表示发送成功
              ECanaShadow.CANTA.all=0;
                     ECanaShadow.CANTA.bit.TA0=1;          //清除TA0
                     ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
                    TXcounter++;                          //发送次数
          }
                 TXcounter=0;
                 i=0;
           }        
}

相关帖子

沙发
linhai2009|  楼主 | 2009-11-5 13:48 | 只看该作者
void InitSysCtrl()        //初始化DSP系统设置
{                          
    EALLOW;                        
    SysCtrlRegs.WDCR= 0x00E8;               //0x00E8 禁止看门狗,预定标系数Prescaler=1
     SysCtrlRegs.PLLCR.all = 0x000A;         //PLL控制器寄存器,SYSCLKOUT=CLKIN=150MHZ
    for(i= 0; i< 5000; i++){}                 //等待PLL稳定
   //HISPCP/LOSPCP预定标寄存器
   SysCtrlRegs.HISPCP.all= 0x0001;      //高速外设时钟设置寄存器,HSPCLK=SYSCLKOUT/2=75MHz
    SysCtrlRegs.LOSPCP.all= 0x0002;       //慢速外设时钟设置寄存器,LSPCLK=SYSCLKOUT/4=37.5MHz        
    //外设时钟使能,不用的外设时钟应关闭   
   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
    SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
    SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
    SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;
    SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
    SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
    SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;
    SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
    EDIS;   
}

void IOinit()
{
    EALLOW;
    GpioMuxRegs.GPAMUX.all=0x0000;              //全部配置为一般IO口  
   GpioMuxRegs.GPADIR.all=0xC300;              //配置GPIOA8,A9,A14,A15为输出
   GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1;  //配置GPIOF6为CANTX
    GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1;  //配置GPIOF7为CANRX
    GpioMuxRegs.GPFMUX.all=0x0030;            //设置F4和F5为SCIA外设通信端口
   EDIS;
    GpioDataRegs.GPADAT.all=0x0;               //配置GPIOA0-A6为0
}

void InitECan(void)
{
      EALLOW;
      ECanaRegs.CANTIOC.bit.TXFUNC = 1;  //配置eCAN的TX、RX分别为发送、接收脚
    ECanaRegs.CANRIOC.bit.RXFUNC = 1;   

      ECanaRegs.CANMC.bit.STM=0;    //配置CAN为正常模式
    ECanaRegs.CANMC.bit.SCB=1;    //=1:HECC模式,0-31邮箱可用;=0:SCC模式,0-15邮箱可用
    ECanaRegs.CANMC.bit.DBO=1;    //首先接受或发送数据的低位字节
        
    //RTR位在复位后状态不定,因此在程序进行初始化的时候必须对该位赋值
    ECanaMboxes.MBOX0.MCF.bit.RTR = 0;           //无远程帧请求
    ECanaMboxes.MBOX16.MCF.bit.RTR = 0;

    //信息控制寄存器指定了要发送的字节数和发送优先级
   //CAN初始化时应将其所有位初始化为0
    ECanaMboxes.MBOX0.MCF.all = 0x00000000;         
    ECanaMboxes.MBOX1.MCF.all = 0x00000000;
    ECanaMboxes.MBOX2.MCF.all = 0x00000000;
    ECanaMboxes.MBOX3.MCF.all = 0x00000000;
    ECanaMboxes.MBOX4.MCF.all = 0x00000000;
    ECanaMboxes.MBOX5.MCF.all = 0x00000000;
    ECanaMboxes.MBOX6.MCF.all = 0x00000000;
    ECanaMboxes.MBOX7.MCF.all = 0x00000000;
    ECanaMboxes.MBOX8.MCF.all = 0x00000000;
    ECanaMboxes.MBOX9.MCF.all = 0x00000000;
    ECanaMboxes.MBOX10.MCF.all = 0x00000000;
    ECanaMboxes.MBOX11.MCF.all = 0x00000000;
    ECanaMboxes.MBOX12.MCF.all = 0x00000000;
    ECanaMboxes.MBOX13.MCF.all = 0x00000000;
    ECanaMboxes.MBOX14.MCF.all = 0x00000000;
    ECanaMboxes.MBOX15.MCF.all = 0x00000000;
    ECanaMboxes.MBOX16.MCF.all = 0x00000000;
    ECanaMboxes.MBOX17.MCF.all = 0x00000000;
    ECanaMboxes.MBOX18.MCF.all = 0x00000000;
    ECanaMboxes.MBOX19.MCF.all = 0x00000000;
    ECanaMboxes.MBOX20.MCF.all = 0x00000000;
    ECanaMboxes.MBOX21.MCF.all = 0x00000000;
    ECanaMboxes.MBOX22.MCF.all = 0x00000000;
    ECanaMboxes.MBOX23.MCF.all = 0x00000000;
    ECanaMboxes.MBOX24.MCF.all = 0x00000000;
    ECanaMboxes.MBOX25.MCF.all = 0x00000000;
    ECanaMboxes.MBOX26.MCF.all = 0x00000000;
    ECanaMboxes.MBOX27.MCF.all = 0x00000000;
    ECanaMboxes.MBOX28.MCF.all = 0x00000000;
    ECanaMboxes.MBOX29.MCF.all = 0x00000000;
    ECanaMboxes.MBOX30.MCF.all = 0x00000000;
    ECanaMboxes.MBOX31.MCF.all = 0x00000000;

    ECanaRegs.CANTA.all       =0xFFFFFFFF;            //发送应答寄存器写1清零
   ECanaRegs.CANRMP.all      =0xFFFFFFFF;            //接收消息挂起寄存器写1清零        
     ECanaRegs.CANGIF0.all     =0xFFFFFFFF;      //清除所有中断标志位
    ECanaRegs.CANGIF1.all     =0xFFFFFFFF;
    //------------------------------------
     ECanaRegs.CANGIM.all      =0x00000001;      //中断0(ECAN0INT)使能
    ECanaRegs.CANMIM.all      =0x00010000;      //16号邮箱中断使能
    ECanaRegs.CANMIL.all      =0x00000000;      //在ECAN0INT(中断0)产生邮箱中断
   //------------------------------------
    //配置位定时参数  
    ECanaRegs.CANMC.bit.CCR   =1;               //CCR=1,改变配置请求
    while(ECanaRegs.CANES.bit.CCE!=1){};   //等待CCE置位,CPU必须等待CCE=1后才能对CANBTC寄存器进行操作  
                                             
     ECanaRegs.CANBTC.bit.SAM=0;                //can模块采样3个值并进行多数表决
     ECanaRegs.CANBTC.bit.BRP  =19;             //CAN总线波特率设为500Kbps
        ECanaRegs.CANBTC.bit.TSEG2=2;
        ECanaRegs.CANBTC.bit.TSEG1=10;

        ECanaRegs.CANMC.bit.CCR   =0;              //配置CCR=0,CPU请求正常模式
     while(ECanaRegs.CANES.bit.CCE!=0){};       //等待CCE清零,若被清零则表明CAN模块已经配置完毕
     ECanaRegs.CANME.all=0;                        //屏蔽所有邮箱,在对MSGIDs写操作之前               
     EDIS;
}

使用特权

评论回复
板凳
linhai2009|  楼主 | 2009-11-5 13:48 | 只看该作者
补充一下:
1、F11单步调试时候,光标一直停留在这一行,表明数据肯定没有发送出去...
"while(ECanaRegs.CANTA.bit.TA0 == 0){} //等待TA0置位.置位表示发送成"
2、ECAN驱动采用周立功模块CTM8231,希望是和USBCAN-1 通信的,连接了120欧的终端电阻。
3、和USBCAN通信时候(DSP比如接收USBCAN数据),有单滤波和双滤波的区分,那么在2812里面在哪里体现出来的呢?验收码和屏蔽码的问题比较明白,只是滤波的设置很糊涂。。。

以上几点问题吧,欢迎大家给点意见。

使用特权

评论回复
地板
thf2008| | 2009-11-6 10:42 | 只看该作者
:dizzy:程序好长

使用特权

评论回复
5
thf2008| | 2009-11-6 10:43 | 只看该作者
是不是你的周立功CAN的通讯速率不对呀,你检查一下看看对不对

使用特权

评论回复
6
linhai2009|  楼主 | 2009-11-6 11:04 | 只看该作者
今天上午仔细检查发现了一个低级且致命的错误:  在void IOinit()函数中这三句话矛盾了
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1;  //配置GPIOF6为CANTX
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1;  //配置GPIOF7为CANRX
GpioMuxRegs.GPFMUX.all=0x0030;            //设置F4和F5为SCIA外设通信端口

前面两句IO复用为CAN,后面一句又将CAN改成IO了...真是太粗心了.将后一句改成
GpioMuxRegs.GPFMUX.bit.SCITXDA.GPIOF4=1;
GpioMuxRegs.GPFMUX.bit.SCIRXDA.GPIOF5=1;
测量DSP的CAN输出,有波形.
就CAN通信而言不用这两句的.只是不小心在设置SCI时候误操作了!


面临的新问题还是和USBCAN无法通信.
(1)波特率:
DSP是500Kbps,对应的USBCAN的寄存器设置:  BTR0:00; BTR1:1C 应该没问题的.
(2)目前我认为主要的问题在于USBCAN里面接受时有单/双滤波的设置,可在2812里面我还没有找到相应的寄存器...
有用过2812和USBCAN通信的人的话请指点一下哈
继续努力......

使用特权

评论回复
7
贾君鹏子| | 2009-11-7 19:04 | 只看该作者
这么多……看的头晕

使用特权

评论回复
8
thf2008| | 2009-11-7 22:37 | 只看该作者
恩,找到了就好

使用特权

评论回复
9
qqljhang| | 2010-11-18 12:39 | 只看该作者
呵呵,楼主在CAN方面很强,虽然遇到了问题但是最后得到了解决,我就惨了,用的TMS470,CAN问题老是解决不了 。。。  三个星期了   。。。

使用特权

评论回复
10
foreverly| | 2010-12-8 21:13 | 只看该作者
学习了。

使用特权

评论回复
11
mountainest| | 2014-12-6 14:55 | 只看该作者
linhai2009 发表于 2009-11-6 11:04
今天上午仔细检查发现了一个低级且致命的错误:  在void IOinit()函数中这三句话矛盾了
GpioMuxRegs.GPFMUX. ...

你的ecan TA置位调试成功了吗?
是因为IO口配置的问题吗?我的IO口配置没有问题啊

使用特权

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

本版积分规则

191

主题

1930

帖子

2

粉丝