This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28377D:通过 SCI (使用 CPU2内核)实现两个 DSP 之间的通信问题

Guru**** 2604225 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1478774/tms320f28377d-communication-issues-between-two-dsps-via-sci-using-cpu2-core

器件型号:TMS320F28377D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

两个28377D 器件通过串行端口通信。

通信参数配置如下:波特率设置为115200、RX FIFO 配置为8位、使用基于中断的方法执行通信。

发送器每次发送8个字节、当接收到第1帧(共8个字节)时操作正常、从第2次发送开始、接收过程中将出现数据偏移错误。

串行端口配置如下::

void InitSciBFIFO()
{

//    ScibRegs.SCICCR.all = 0x0007;                           // 1 stop bit,  No loopback
//                                                            // No parity,8 char bits,
//                                                            // async mode, idle-line protocol

    ScibRegs.SCICCR.all = 0x0087;                           // 1 stop bit,  No loopback
                                                            // No parity,8 char bits,
                                                            // async mode, idle-line protocol

    ScibRegs.SCICTL1.all = 0x0003;                          // enable TX, RX, internal SCICLK,
                                                            // Disable RX ERR, SLEEP, TXWAKE
    ScibRegs.SCICTL2.all = 0x0003;

    //ScibRegs.SCICTL2.bit.TXINTENA = 0;
    ScibRegs.SCICTL2.bit.RXBKINTENA = 1;                    //Enable SCIB _RX

//
//  SCIA at 9600 baud
//  @LSPCLK = 50 MHz (200 MHz SYSCLK) HBAUD = 0x02 and LBAUD = 0x8B.
//  @LSPCLK = 30 MHz (120 MHz SYSCLK) HBAUD = 0x01 and LBAUD = 0x86.
//  @LSPCLK = 25 MHz (100 MHz SYSCLK) HBAUD = 0x01 and LBAUD = 0x45.

    ScibRegs.SCIHBAUD.all = 0x0000;                     // @LSPCLK = 50 MHz  115200
    ScibRegs.SCILBAUD.all = 0x0036;

//    ScibRegs.SCIHBAUD.all = 0x0000;                     // @LSPCLK = 50 MHz  1M
//    ScibRegs.SCILBAUD.all = 0x0006;

    ScibRegs.SCIFFTX.bit.TXFIFORESET = 0;
    ScibRegs.SCIFFRX.bit.RXFIFORESET = 0;

    ScibRegs.SCICTL1.all = 0x0023;                      // Relinquish SCI from Reset

//  Enable SCIFIFO
    ScibRegs.SCIFFTX.all = 0xF040;                      //Disable FIFO Using 4 Enable FIFO Using 6

    ScibRegs.SCIFFRX.all = 0x2068;                      //FIFO interupter level 8    interrupter level == 5
    ScibRegs.SCIFFCT.all = 0x0;

    ScibRegs.SCIFFTX.bit.TXFFINTCLR = 1;    //Avoid PowerUp DataTX
    ScibRegs.SCIFFTX.bit.TXFFIENA = 0;      //Avoid PowerUp DataTX

}

中断处理

__interrupt void ScibRxfifo_isr(void)
{

    volatile static Uint32 ScibInteruptimes = 0;

    ScibInteruptimes++;

    if (SCIB_Recdata.uStatus != FINISH)
    {
        while(ScibRegs.SCIFFRX.bit.RXFFST)
        {
            SCIB_Recdata.uData[SCIB_Recdata.uIndex++] = ScibRegs.SCIRXBUF.all&0xff;
        }
        //update sci recevie status and set interrupt interval.
        SCIB_Recdata.uStatus = WORKING;
        SCIB_Recdata.ticker = SCIB_Recdata.spacetime;
    }



    ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1;                                    // Clear Overflow flag
    ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1;                                    // Clear Interrupt flag

    ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;

    // Issue PIE ack
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;                                 // Issue PIE ACK PIEACK_GROUP9
}

具体示例如下:

当我发送 0x01 0x47 0x6A 0x00 0x00 0x00 0x00 0x55时  

在接收器的中断函数中进行观察。

接收数据为  0x00 0x55 0x01 0x47 0x6A 0x00 0x00 0x00   

上述配置已经应用于 DSP 和 ARM 之间的通信工程、在通信过程中没有问题。 但是、在调试两个 DSP 之间的通信时、您对解决这个问题有什么建议吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请看一下 c2000ware SCI 示例。

    C:\ti\c2000\C2000Ware_5_02_00_00\driverlib\f2837xd\examples\cpu1\sci  

    您可以查看这些示例中的配置与您的配置。