DSP

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

2019-07-13 10:37发布

最近研究了下F28335的CAN通信模块与上位机的通信过程,主要是为了使用上位机实现对DSP的一些控制,今天算是实现了第一步。
首先是用到的模块,一块F28335开发板和USB-CAN分析仪一个
如图所示,将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位将会置位这里即表示程序数据接收成功。这是发送的数据,以及寄存器接收到的结果,证明成功。