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.

[参考译文] TMS320F28374S:TMS320F28374S 上的 SCIB 只能发送消息、但无法接收消息、而 SCIA 完全正常工作。

Guru**** 2535150 points
Other Parts Discussed in Thread: TMS320F28374S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1425112/tms320f28374s-the-scib-on-the-tms320f28374s-can-only-send-messages-but-cannot-receive-messages-while-the-scia-functions-completely-normally

器件型号:TMS320F28374S

工具与软件:

CCS 版本:12.6.0

编译版本:TI v22.6.0.1.TLS

芯片模型:TMS320F28374S

GPIO 初始化代码如下:

void scib_gpio54_55_init(void)
{

        EALLOW;

        const uint16_t mux54 = 6;   // GPIO54_MUX = 6:  SCIB_TX
        const uint16_t mux55 = 6;   // GPIO55_MUX = 6:  SCIB_RX

        GpioCtrlRegs.GPBGMUX2.bit.GPIO54 = mux54 / 4;
        GpioCtrlRegs.GPBMUX2.bit.GPIO54  = mux54 % 4;
        GpioCtrlRegs.GPBPUD.bit.GPIO54   = 0;           // 0: enable pull up
        GpioCtrlRegs.GPBDIR.bit.GPIO54   = 1;           // 0:input 1:output

        GpioCtrlRegs.GPBGMUX2.bit.GPIO55 = mux55 / 4;
        GpioCtrlRegs.GPBMUX2.bit.GPIO55  = mux55 % 4;
        GpioCtrlRegs.GPBPUD.bit.GPIO55   = 0;           // 0: enable pull up
        GpioCtrlRegs.GPBDIR.bit.GPIO55   = 0;           // 0:input 1:output

        EDIS;
}

void scia_gpio35_36_init(void)
{
        EALLOW;

        const uint16_t mux35 = 1;   // GPIO35_MUX = 1:  SCIA_RX
        const uint16_t mux36 = 1;   // GPIO36_MUX = 1:  SCIA_TX

        // SCIA_RX
        GpioCtrlRegs.GPBGMUX1.bit.GPIO35 = mux35 / 4;    // 0:GPIO 1:RXD
        GpioCtrlRegs.GPBMUX1.bit.GPIO35  = mux35 % 4;    // 0:GPIO 1:RXD
        GpioCtrlRegs.GPBPUD.bit.GPIO35   = 0;    // enable pull up
        GpioCtrlRegs.GPBDIR.bit.GPIO35   = 0;    // 0:input 1:output

        // SCIA_TX
        GpioCtrlRegs.GPBGMUX1.bit.GPIO36 = mux36 / 4;   // 0:GPIO 1:TXD
        GpioCtrlRegs.GPBMUX1.bit.GPIO36  = mux36 % 4;   // 0:GPIO 1:TXD
        GpioCtrlRegs.GPBPUD.bit.GPIO36   = 0;    // enable pull up
        GpioCtrlRegs.GPBDIR.bit.GPIO36   = 1;    // 0:input 1:output

        EDIS;
}


SCI 初始化代码如下:

void scib_init(uint32_t baud_rate)
{
        uint16_t prescale = (uint16_t)(get_clock_freq() / 4 / baud_rate / 8 - 1);

        ScibRegs.SCICTL1.all             = 0x00;                // reset SCI
        ScibRegs.SCICCR.all              = 0x07;                // 1 bit stop, disable parity, idle mode, 8 bits data
        ScibRegs.SCIHBAUD.bit.BAUD       = prescale / 256;
        ScibRegs.SCILBAUD.bit.BAUD       = prescale % 256;
        ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;                   // 1:enable RXFIFO
        ScibRegs.SCIFFTX.bit.SCIRST      = 1;                   // 1:resume FIFO, 0: reset FIFO
        ScibRegs.SCIFFTX.bit.SCIFFENA    = 1;                   // enable FIFO
        ScibRegs.SCICTL1.all             = 0x23;                // Enable RX and TX, enable SCI

        add_task("scib_soft_fifo", soft_fifo_1ms_task, FOREGROUND_TASK, 1, 0);
}

static void soft_fifo_1ms_task(void)
{
        uint16_t i;

        // --------------------------------------------------------------------
        if(ScibRegs.SCIRXST.bit.RXERROR)
        {
                // writing a zero to SWRESET to clear FE OE PE RXERROR
                ScibRegs.SCICTL1.bit.SWRESET = 0;
                // re-enable SCI by writing a 1 to SWRESET bit
                ScibRegs.SCICTL1.bit.SWRESET = 1;
        }

        // --------------------------------------------------------------------
        while(ScibRegs.SCIFFRX.bit.RXFFST)
        {
                uint8_t rxd = ScibRegs.SCIRXBUF.bit.SAR;

                if(ScibRxFifo.ElementNum < 2*ArrLen(ScibRxFifo.Buffer))
                {
                        packed_byte_array_set(ScibRxFifo.Buffer,
                                        ScibRxFifo.EnqueueIndex,
                                        rxd);

                        ScibRxFifo.EnqueueIndex ++;
                        ScibRxFifo.EnqueueIndex %= 2*ArrLen(ScibRxFifo.Buffer);
                        ScibRxFifo.ElementNum   ++;
                }
        }

        // --------------------------------------------------------------------
        for(i=0; i<16; i++)
        {
                if(ScibRegs.SCIFFTX.bit.TXFFST < 16)
                {
                        uint8_t txd;

                        if(ScibTxFifo.ElementNum)
                        {
                                txd = packed_byte_array_get(ScibTxFifo.Buffer, ScibTxFifo.DequeueIndex);

                                ScibTxFifo.DequeueIndex ++;
                                ScibTxFifo.DequeueIndex %= 2*ArrLen(ScibTxFifo.Buffer);
                                ScibTxFifo.ElementNum   --;

                                ScibRegs.SCITXBUF.bit.TXDT = txd;
                        }
                }
                else
                {
                        break;
                }
        }
}

void scia_init(uint32_t baud_rate)
{
        uint16_t prescale = (uint16_t)(get_clock_freq() / 4 / baud_rate / 8 - 1);

        SciaRegs.SCICTL1.all             = 0x00;                // reset SCI
        SciaRegs.SCICCR.all              = 0x07;                // 1 bit stop, disable parity, idle mode, 8 bits data
        SciaRegs.SCIHBAUD.bit.BAUD       = prescale / 256;
        SciaRegs.SCILBAUD.bit.BAUD       = prescale % 256;
        SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;                   // 1:enable RXFIFO
        SciaRegs.SCIFFTX.bit.SCIRST      = 1;                   // 1:resume FIFO, 0: reset FIFO
        SciaRegs.SCIFFTX.bit.SCIFFENA    = 1;                   // enable FIFO
        SciaRegs.SCICTL1.all             = 0x23;                // Enable RX and TX, enable SCI

        add_task("scia_soft_fifo", soft_fifo_1ms_task, FOREGROUND_TASK, 1, 0);
}

static void soft_fifo_1ms_task(void)
{
        uint16_t i;

        // --------------------------------------------------------------------
        if(SciaRegs.SCIRXST.bit.RXERROR)
        {
                // writing a zero to SWRESET to clear FE OE PE RXERROR
                SciaRegs.SCICTL1.bit.SWRESET = 0;
                // re-enable SCI by writing a 1 to SWRESET bit
                SciaRegs.SCICTL1.bit.SWRESET = 1;
        }

        // --------------------------------------------------------------------
        while(SciaRegs.SCIFFRX.bit.RXFFST)
        {
                uint8_t rxd = SciaRegs.SCIRXBUF.bit.SAR;

                if(SciaRxFifo.ElementNum < 2*ArrLen(SciaRxFifo.Buffer))
                {
                        packed_byte_array_set(SciaRxFifo.Buffer,
                                        SciaRxFifo.EnqueueIndex,
                                        rxd);

                        SciaRxFifo.EnqueueIndex ++;
                        SciaRxFifo.EnqueueIndex %= 2*ArrLen(SciaRxFifo.Buffer);
                        SciaRxFifo.ElementNum   ++;
                }
        }

        // --------------------------------------------------------------------
        for(i=0; i<16; i++)
        {
                if(SciaRegs.SCIFFTX.bit.TXFFST < 16)
                {
                        uint8_t txd;

                        if(SciaTxFifo.ElementNum)
                        {
                                txd = packed_byte_array_get(SciaTxFifo.Buffer, SciaTxFifo.DequeueIndex);

                                SciaTxFifo.DequeueIndex ++;
                                SciaTxFifo.DequeueIndex %= 2*ArrLen(SciaTxFifo.Buffer);
                                SciaTxFifo.ElementNum   --;

                                SciaRegs.SCITXBUF.bit.TXDT = txd;
                        }
                }
                else
                {
                        break;
                }
        }
}

我们以相同的方式初始化 SCIA 和 SCIB、SCIA 函数正常。 但是、SCIB 只能发送消息、而无法接收消息。 我们在 SCIB 接收引脚之前测量了波形、波形准确且正常。 不过、SCIB 接收 FIFO 总是保持为0、表示没有接收到消息。 如何解决该问题?

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

    您好!

    如果您在 RX 上看到从另一个器件发送的波形正确、但在 FIFO 中没有看到接收到的数据、则这可能是 GPIO 设置问题。  

    您可以仔细检查 SCIB 的 GPIO 多路复用是否正确吗?

    侧边说明:您可以通过启用内部环回(将 TX 和 RX 在内部连接在一起)来确认 SCI 配置(GPIO 多路复用除外)是否正确、从而验证您是否可以在 SCIB 中发送和接收数据正常。

    此致、

    Allison

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

    尊敬的 Allison:

         目前、我们正在从引导过渡到应用程序执行。 如果该应用程序直接运行、则功能正常、SCIB 可以正确读取和写入。 但是、在从引导模式转换到应用程序时、会出现问题、例如 SCIB 无法读取。 是否有人有任何好的解决方案? 非常感谢!

    此致、

    Yulong Cheng

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

    尊敬的 Yulong Cheng:

    您能否在这方面再详细说明一下吗? 例如、您使用什么引导模式? 您是否在启动过程中使用 SCI (例如 SCI 引导等)? 您能否验证您是否正确地从 bootROM/bootloader 跳转到应用程序代码、在此之前没有卡住、并且 SCIB 在此过程中得到了正确初始化? 更多信息可以帮助我提供有关调试方法的建议。  

    为了澄清、您已经使用 SCIA 完成了此启动并跳转到应用 SCIB 和 SCIA 能够正常工作(可以发送和接收)、但 SCIB 却不能正常工作?  

    此致、

    Allison

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

    尊敬的  Allison:

        感谢您的答复和支持。 出现此问题的原因是我们意外地将另一个引脚配置为 SCIB 的 RX。

    此致、

    Yulong Cheng

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

    尊敬的 Yulong Cheng:

    很高兴听到您能够解决此问题! 我将继续、关闭该线程

    此致、

    Allison