关于DSP28335的CAN模块与上位机(PC)通信调试心得(1)

最近研究了下F28335的CAN通信模块与上位机的通信过程,主要是为了使用上位机实现对DSP的一些控制,今天算是实现了第一步。

首先是用到的模块,一块F28335开发板和USB-CAN分析仪一个
关于DSP28335的CAN模块与上位机(PC)通信调试心得(1)_第1张图片
如图所示,将CAN-H和CAN-L与开发板上的对应接口连接起来就可以了。然后进行上位机的配置,通过调试助手等很容易可以进行配置,不详述。

接下来是F28335的代码部分,主要涉及CAN模块的配置,以及数据的收发。

DSP给上位机发送数据:
目标:持续发送同一组数据给上位机:
ECanaMboxes.MBOX25.MSGID.all = 0x95555555; // 使用CANA模块的25号邮箱,扩展帧,配置标识符

  ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
  ECanaShadow.CANMD.bit.MD25 = 0;                             //配置为发送邮箱
  ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;

  ECanaShadow.CANME.all = ECanaRegs.CANME.all;
  ECanaShadow.CANME.bit.ME25 = 1;                            //使能A模块第25个邮箱
  ECanaRegs.CANME.all = ECanaShadow.CANME.all;

  ECanaMboxes.MBOX25.MSGCTRL.bit.DLC = 8;          //8字节有效数据

  ECanaMboxes.MBOX25.MDL.all = 0x55555555;          //定义发送数据


  ECanaMboxes.MBOX25.MDH.all = 0x55555555;

 for(; ;)
   {
       ECanaShadow.CANTRS.all = 0;
       ECanaShadow.CANTRS.bit.TRS25 = 1;                      // TRS置位发送对应邮箱中的消息
       ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

       do
    {
      ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
    } while(ECanaShadow.CANTA.bit.TA25 == 0 );   //如果邮箱中的消息发送成功,该寄存器将会置位

       ECanaShadow.CANTA.all = 0;
       ECanaShadow.CANTA.bit.TA25 = 1;               // Clear TA5
       ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
       delay_loop();
   }
该程序持续发送25号邮箱里的数据,在配置不成功时程序可能会卡在while(ECanaShadow.CANTA.bit.TA25 == 0 ),这个时候要注意波特率的设置。通常该设置在DSP2833x_ECan.c文件中,如下:
  #if (CPU_FRQ_150MHZ)                
ECanbShadow.CANBTC.bit.BRPREG = 19;           //这里改成19应该是500kbps   
ECanbShadow.CANBTC.bit.TSEG2REG = 2;
ECanbShadow.CANBTC.bit.TSEG1REG = 10;
#endif
此时,USB-CAN模块配置中,需要把CAN波特率改为250Kbps。具体原因还没有弄懂,但是这样可以实现通信。

下面是PC发送数据,DSP接收的部分。
配置与上面相似,只需要把邮箱的模式改成接收的即可:
ECanaMboxes.MBOX25.MSGID.all = 0x95555555; // 使用CANA模块的25号邮箱,扩展帧,配置标识符

   ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
   ECanaShadow.CANMD.bit.MD25 = 1;                   //配置为接收邮箱
   ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;

   ECanaShadow.CANME.all = ECanaRegs.CANME.all;
   ECanaShadow.CANME.bit.ME25 = 1;                     //使能A模块第25个邮箱
   ECanaRegs.CANME.all = ECanaShadow.CANME.all;

   ECanaMboxes.MBOX25.MSGCTRL.bit.DLC = 8;          //8字节有效数据

   do
    {
      ECanaShadow.CANRMP.all = ECanaRegs.CANRMPall;
    } while(ECanaShadow.CANRMP.bit.RMP25 == 0 );  //接收,那么该寄存器第N位将会置位
这里即表示程序数据接收成功。
关于DSP28335的CAN模块与上位机(PC)通信调试心得(1)_第2张图片 关于DSP28335的CAN模块与上位机(PC)通信调试心得(1)_第3张图片
这是发送的数据,以及寄存器接收到的结果,证明成功。

你可能感兴趣的:(DSP,c2000系列学习心得)