[DSP编程]

2块28335板子进行CAN通信的一些问题

[复制链接]
4078|18
手机看帖
扫描二维码
随时随地手机跟帖
混子黄|  楼主 | 2018-4-19 14:13 | 显示全部楼层
接受板子的代码

void main()
{

/* Create a shadow register structure for the CAN control registers. This is
needed, since, only 32-bit access is allowed to these registers. 16-bit access
to these registers could potentially corrupt the register contents. This is
especially true while writing to a bit (or group of bits) among bits 16 - 31 */

   struct ECAN_REGS ECanaShadow;

   struct ECAN_REGS ECanbShadow;

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example

   // Just initalize eCAN pins for this example
   // This function is in DSP2833x_ECan.c
   InitECanGpio();

   InitECanbGpio();

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
   InitPieVectTable();

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.

// No interrupts used in this example.

// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example

   // In this case just initalize eCAN-A and eCAN-B
   // This function is in DSP2833x_ECan.c
//  InitECan();

   InitECanb();

// Step 5. User specific code:

/* Write to the MSGID field  */

   ECanbMboxes.MBOX24.MSGID.all = 0x95555555; // Extended Identifier

/* Configure Mailbox under test as a Transmit mailbox */

   ECanbShadow.CANMD.all = ECanbRegs.CANMD.all;
   ECanbShadow.CANMD.bit.MD24 = 1;    ///  1: 接收邮箱  0:发送邮箱
   ECanbRegs.CANMD.all = ECanbShadow.CANMD.all;

/* Enable Mailbox under test */

   ECanbShadow.CANME.all = ECanbRegs.CANME.all;
   ECanbShadow.CANME.bit.ME24 = 1;     ///  1:使能    0:  不使能
   ECanbRegs.CANME.all = ECanbShadow.CANME.all;

/* Write to DLC field in Master Control reg */

   ECanbMboxes.MBOX24.MSGCTRL.bit.DLC = 8;

    ECanbMboxes.MBOX24.MSGCTRL.bit.RTR = 0;

        EALLOW;

        ECanbRegs.CANMIM.all = 0xffffffff;

        ECanbRegs.CANMIL.all = 0;

        ECanbRegs.CANGIF0.all = 0xffffffff;

        ECanbRegs.CANGIM.bit.I0EN = 1;

        EDIS;


        PieCtrlRegs.PIEIER9.bit.INTx7 = 1;

        IER |= M_INT9;

        EINT;

        ERTM;



         for(;;);

}




使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:14 | 显示全部楼层
子函数的代码


void InitECanb(void)                // Initialize eCAN-B module
{
/* Create a shadow register structure for the CAN control registers. This is
needed, since only 32-bit access is allowed to these registers. 16-bit access
to these registers could potentially corrupt the register contents or return
false data. This is especially true while writing to/reading from a bit
(or group of bits) among bits 16 - 31 */

struct ECAN_REGS ECanbShadow;

   EALLOW;                // EALLOW enables access to protected bits

/* Configure eCAN RX and TX pins for CAN operation using eCAN regs*/

    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;

/* Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31) */

        ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
        ECanbShadow.CANMC.bit.SCB = 1;
        ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;

/* Initialize all bits of 'Master Control Field' to zero */
// Some bits of MSGCTRL register come up in an unknown state. For proper operation,
// all bits (including reserved bits) of MSGCTRL must be initialized to zero

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

// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
//        as a matter of precaution.

        ECanbRegs.CANTA.all        = 0xFFFFFFFF;        /* Clear all TAn bits */

        ECanbRegs.CANRMP.all = 0xFFFFFFFF;        /* Clear all RMPn bits */

        ECanbRegs.CANGIF0.all = 0xFFFFFFFF;        /* Clear all interrupt flag bits */
        ECanbRegs.CANGIF1.all = 0xFFFFFFFF;


/* Configure bit timing parameters for eCANB*/

        ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
        ECanbShadow.CANMC.bit.CCR = 1 ;            // Set CCR = 1
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;

    ECanbShadow.CANES.all = ECanbRegs.CANES.all;

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


    ECanbShadow.CANBTC.all = 0;

    #if (CPU_FRQ_150MHZ)                       // CPU_FRQ_150MHz is defined in DSP2833x_Examples.h
        /* The following block for all 150 MHz SYSCLKOUT (75 MHz CAN clock) - default. Bit rate = 1 Mbps
           See Note at end of file */
                ECanbShadow.CANBTC.bit.BRPREG = 4;
                ECanbShadow.CANBTC.bit.TSEG2REG = 2;
                ECanbShadow.CANBTC.bit.TSEG1REG = 10;
        #endif
        #if (CPU_FRQ_100MHZ)                       // CPU_FRQ_100MHz is defined in DSP2833x_Examples.h
        /* The following block is only for 100 MHz SYSCLKOUT (50 MHz CAN clock). Bit rate = 1 Mbps
           See Note at end of file */
            ECanbShadow.CANBTC.bit.BRPREG = 4;
                ECanbShadow.CANBTC.bit.TSEG2REG = 1;
                ECanbShadow.CANBTC.bit.TSEG1REG = 6;
        #endif

    ECanbShadow.CANBTC.bit.SAM = 1;
    ECanbRegs.CANBTC.all = ECanbShadow.CANBTC.all;

    ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
        ECanbShadow.CANMC.bit.CCR = 0 ;            // Set CCR = 0
    ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;

    ECanbShadow.CANES.all = ECanbRegs.CANES.all;

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


/* Disable all Mailboxes  */
        ECanbRegs.CANME.all = 0;                // Required before writing the MSGIDs

    EDIS;
}
         ///#endif // if DSP28_ECANB

使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:15 | 显示全部楼层
void InitECanbGpio(void)
{
   EALLOW;

/* Enable internal pull-up for the selected CAN pins */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.

//        GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0;          // Enable pull-up for GPIO8  (CANTXB)
//  GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;   // Enable pull-up for GPIO12 (CANTXB)
  GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;   // Enable pull-up for GPIO16 (CANTXB)
//  GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0;   // Enable pull-up for GPIO20 (CANTXB)

//        GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0;          // Enable pull-up for GPIO10 (CANRXB)
//  GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;   // Enable pull-up for GPIO13 (CANRXB)
  GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;   // Enable pull-up for GPIO17 (CANRXB)
//  GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0;   // Enable pull-up for GPIO21 (CANRXB)

/* Set qualification for selected CAN pins to asynch only */
// Inputs are synchronized to SYSCLKOUT by default.
// This will select asynch (no qualification) for the selected pins.
// Comment out other unwanted lines.

//    GpioCtrlRegs.GPAQSEL1.bit.GPIO10 = 3; // Asynch qual for GPIO10 (CANRXB)
//  GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3; // Asynch qual for GPIO13 (CANRXB)
  GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch qual for GPIO17 (CANRXB)
//  GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 3; // Asynch qual for GPIO21 (CANRXB)

/* Configure eCAN-B pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be eCAN functional pins.

//        GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 2;   // Configure GPIO8 for CANTXB operation
//  GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2;  // Configure GPIO12 for CANTXB operation
  GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 2;  // Configure GPIO16 for CANTXB operation
//  GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 3;  // Configure GPIO20 for CANTXB operation

//        GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 2;  // Configure GPIO10 for CANRXB operation
//  GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 2;  // Configure GPIO13 for CANRXB operation
  GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 2;  // Configure GPIO17 for CANRXB operation
//  GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 3;  // Configure GPIO21 for CANRXB operation

    EDIS;
}

使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:15 | 显示全部楼层
中断函数的代码


interrupt void ECAN0INTB_ISR(void)  // eCAN-B
{
  // ECanbShadow.CANRMP.all = ECanbRegs.CANRMP.all;
         while(ECanbRegs.CANRMP.all != 0x01000000 );
                  

                 ECanbRegs.CANRMP.all = 0x01000000;

                 datah = ECanbMboxes.MBOX24.MDH.all;

                 datal = ECanbMboxes.MBOX24.MDL.all;

                 PieCtrlRegs.PIEACK.bit.ACK9 = 1;



  // Insert ISR Code here


  // To receive more interrupts from this PIE group, acknowledge this interrupt
  // PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;

  // Next two lines for debug only to halt the processor here
  // Remove after inserting ISR Code
// asm ("      ESTOP0");
// for(;;);

}

使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:17 | 显示全部楼层
发送板子的代码


void main()
{

/* Create a shadow register structure for the CAN control registers. This is
needed, since, only 32-bit access is allowed to these registers. 16-bit access
to these registers could potentially corrupt the register contents. This is
especially true while writing to a bit (or group of bits) among bits 16 - 31 */

//   struct ECAN_REGS ECanaShadow;

   struct ECAN_REGS ECanbShadow;

// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example

   // Just initalize eCAN pins for this example
   // This function is in DSP2833x_ECan.c
//  InitECanGpio();
   InitECanbGpio();

// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
   InitPieVectTable();

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.

// No interrupts used in this example.

// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example

   // In this case just initalize eCAN-A and eCAN-B
   // This function is in DSP2833x_ECan.c
  // InitECan();
  InitECanb();

// Step 5. User specific code:

/* Write to the MSGID field  */

   ECanbMboxes.MBOX25.MSGID.all = 0x95555555; // Extended Identifier

/* Configure Mailbox under test as a Transmit mailbox */

   ECanbShadow.CANMD.all = ECanbRegs.CANMD.all;
   ECanbShadow.CANMD.bit.MD25 = 0;    ///  1: 接收邮箱  0:发送邮箱
   ECanbRegs.CANMD.all = ECanbShadow.CANMD.all;

/* Enable Mailbox under test */

   ECanbShadow.CANME.all = ECanbRegs.CANME.all;
   ECanbShadow.CANME.bit.ME25 = 1;     ///  1:使能    0:  不使能
   ECanbRegs.CANME.all = ECanbShadow.CANME.all;

/* Write to DLC field in Master Control reg */

   ECanbMboxes.MBOX25.MSGCTRL.bit.DLC = 8;

/* Write to the mailbox RAM field */

   ECanbMboxes.MBOX25.MDL.all = 0x12345678;
   ECanbMboxes.MBOX25.MDH.all = 0x98765432;

/* Begin transmitting */

while(1)
{
  // for(i=0; i < TXCOUNT; i++)
   {
       ECanbShadow.CANTRS.all = 0;
       ECanbShadow.CANTRS.bit.TRS25 = 1;             // Set TRS for mailbox under test
       ECanbRegs.CANTRS.all = ECanbShadow.CANTRS.all;

       do
            {
              ECanbShadow.CANTA.all = ECanbRegs.CANTA.all;
            } while(ECanbShadow.CANTA.bit.TA25 == 0 );   // Wait for TA5 bit to be set..


       ECanbShadow.CANTA.all = 0;
       ECanbShadow.CANTA.bit.TA25 = 1;                      // Clear TA5
       ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;

      loopcount ++;
    }
        }
    // asm(" ESTOP0");  // Stop here
}

使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:18 | 显示全部楼层
这两个板子的代码都是根据TI的模板改的。

使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:22 | 显示全部楼层
本帖最后由 混子黄 于 2018-4-19 14:25 编辑

现在的问题是这样的。

接受板子全速运行,发送板子也全速运行,发现

while(1)
{
  // for(i=0; i < TXCOUNT; i++)
   {
       ECanbShadow.CANTRS.all = 0;
       ECanbShadow.CANTRS.bit.TRS25 = 1;             // Set TRS for mailbox under test
       ECanbRegs.CANTRS.all = ECanbShadow.CANTRS.all;

       do
            {
              ECanbShadow.CANTA.all = ECanbRegs.CANTA.all;
            } while(ECanbShadow.CANTA.bit.TA25 == 0 );   // Wait for TA5 bit to be set..///////最后停在了这里


       ECanbShadow.CANTA.all = 0;
       ECanbShadow.CANTA.bit.TA25 = 1;                      // Clear TA5
       ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;

      loopcount ++;
    }
        }
    // asm(" ESTOP0");  // Stop here
}



while(ECanbShadow.CANTA.bit.TA25 == 0 );   // Wait for TA5 bit to be set..///////最后停在了这里


但是确实已经发送成功了,我在接受板子上也收到了数据,我现在的问题是为什么不能一直发送?

我把发送板子复位以后,就又能重新成功发送。

loopcount这个数每次也不相同,代表着发送的次数不相同,复位以后全速运行,loopcount有时候是几十,有时候只有几。

我现在的想法是发送板子能一直成功发送,这个应该怎么做?

接受板子一直在全速运行。

使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:23 | 显示全部楼层
子函数都是一样的。

使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:26 | 显示全部楼层
问题应该是出现在初始化的时候吧,因为复位以后又能重新发送了,但是找不到问题的原因,希望又碰到过的工程师给一些建议。

使用特权

评论回复
混子黄|  楼主 | 2018-4-19 14:29 | 显示全部楼层
这是接受板子收到的数据
微信图片_20180419142839.png

使用特权

评论回复
Cjy_JDxy| | 2018-4-19 16:21 | 显示全部楼层
会不会是发送的太快了?两次发送之间的间隔是多大?

使用特权

评论回复
混子黄|  楼主 | 2018-4-20 08:45 | 显示全部楼层
Cjy_JDxy 发表于 2018-4-19 16:21
会不会是发送的太快了?两次发送之间的间隔是多大?

1MS发送一次

使用特权

评论回复
混子黄|  楼主 | 2018-4-20 10:39 | 显示全部楼层
Cjy_JDxy 发表于 2018-4-19 16:21
会不会是发送的太快了?两次发送之间的间隔是多大?

。。。解决了,每次发送前先初始化一下配置就可以了,怀疑之前是哪里改变了配置。

使用特权

评论回复
Cjy_JDxy| | 2018-4-20 14:09 | 显示全部楼层
混子黄 发表于 2018-4-20 10:39
。。。解决了,每次发送前先初始化一下配置就可以了,怀疑之前是哪里改变了配置。 ...

感觉还有问题没查出来,正常情况不应该这样。

使用特权

评论回复
混子黄|  楼主 | 2018-4-20 15:03 | 显示全部楼层
Cjy_JDxy 发表于 2018-4-20 14:09
感觉还有问题没查出来,正常情况不应该这样。

while(1)
{
  // for(i=0; i < TXCOUNT; i++)
   {

   for(t = 0x00;t < 2;t++)
   {

       InitECanb();
   
       ECanbShadow.CANTRS.all = 0;
       ECanbShadow.CANTRS.bit.TRS25 = 1;             // Set TRS for mailbox under test
       ECanbRegs.CANTRS.all = ECanbShadow.CANTRS.all;
       kk = 0;
       do
            {
                 kk = kk + 1;
        //         ECanbShadow.CANTRS.all = 0;
      // ECanbShadow.CANTRS.bit.TRS25 = 1;             // Set TRS for mailbox under test
      // ECanbRegs.CANTRS.all = ECanbShadow.CANTRS.all;
              ECanbShadow.CANTA.all = ECanbRegs.CANTA.all;
                } while((ECanbShadow.CANTA.bit.TA25 == 0 ) && (kk < 10000));   // Wait for TA5 bit to be set..

         if( kk < 10000) break;
      }  
          if(kk<10000) j++;

                        //           loopcount ++;
   //   j++;
        //  ECanbMboxes.MBOX25.MDL.all = j;
    //  ECanbMboxes.MBOX25.MDH.all = j + 1;

       ECanbShadow.CANTA.all = 0;
       ECanbShadow.CANTA.bit.TA25 = 1;                      // Clear TA5
       ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;
        //   delay();

     
    }
        }
    // asm("

在while循环的时候也增加了一部分,保证不会死在发送那里,然后后面发现偶尔会发送失败,但是让他从新发送就好了。

使用特权

评论回复
qianniao| | 2019-4-29 16:32 | 显示全部楼层
能分享一下能用的代码吗?

使用特权

评论回复
蒋博1026| | 2019-4-29 20:55 | 显示全部楼层
通信如果有问题的话 大部分都是时序的问题,有可能没有发完或者没有收完

使用特权

评论回复
liang0904| | 2019-11-19 17:27 | 显示全部楼层
请问一下 您做的dsp28335 两个板子进行  can通讯  能不能把源代码给我看看  我已经卡了1星期了

使用特权

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

本版积分规则

107

主题

935

帖子

6

粉丝