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.

[参考译文] TMS320F28379D:连续数据情况下的 SCI Rx 错误

Guru**** 2589300 points
Other Parts Discussed in Thread: LAUNCHXL-F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1105688/tms320f28379d-sci-rx-error-in-case-of-continuous-data

器件型号:TMS320F28379D
主题中讨论的其他器件:LAUNCHXL-F28379D

尊敬的 TI 专家:

我正在使用 LaunchxL-F28379D 板。

我想要的是获取连续数据并发送带有 SCIB 的 ACK 或 NAK。

我在轮询模式、非 FIFO 中断和 FIFO 中断中对此进行了测试。

但是、在所有情况下、我都无法接收整个数据。

如果使用非 FIFO 中断、则只有在 PC 应用程序发送数据时等待200ms 以上才可以接收所有数据。

但 SCIB 上无法接收到无等待或100ms 等待的数据。

在不同的操作模式下、此症状是相同的。

在 FIFO 中断模式下、我将 FIFO 电平设置为2、并且可以成功接收两个连续字节、但如果前两个字节和后两个字节之间的等待时间不足、接下来的两个字节将被中断。

下面是我的非 FIFI 中断模式代码。

请任何人就我犯了什么错误向我提出建议。

在 main 函数中

    Device_init();

    Device_initGPIO();


    //
    // GPIO19 is the SCI Rx pin.
    //
    GPIO_setMasterCore(19, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_19_SCIRXDB);
    GPIO_setDirectionMode(19, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(19, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(19, GPIO_QUAL_ASYNC);

    //
    // GPIO18 is the SCI Tx pin.
    //
    GPIO_setMasterCore(18, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_18_SCITXDB);
    GPIO_setDirectionMode(18, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(18, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(18, GPIO_QUAL_ASYNC);


    Interrupt_initModule();

    Interrupt_initVectorTable();


    Interrupt_register(INT_SCIB_RX, scibRXFIFOISR);
    setSCIB();

    Interrupt_enable(INT_SCIB_RX);

    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

    EINT;
    ERTM;

    for(;;)
    {
    }

在 setSCIB()中

void setSCIB(void)
{

    SCI_performSoftwareReset(SCIB_BASE);

    //
    // Configure SCIA for echoback.
    //
    SCI_setConfig(SCIB_BASE, DEVICE_LSPCLK_FREQ, 9600, (SCI_CONFIG_WLEN_8 |
                                                        SCI_CONFIG_STOP_TWO |
                                                        SCI_CONFIG_PAR_NONE));
    SCI_resetChannels(SCIB_BASE);
    SCI_clearInterruptStatus(SCIB_BASE, SCI_INT_RXRDY_BRKDT);
    SCI_enableModule(SCIB_BASE);
    SCI_performSoftwareReset(SCIB_BASE);

    SCI_enableInterrupt(SCIB_BASE, (SCI_INT_RXRDY_BRKDT));
}

在 scibRXFIFOISR()中

__interrupt void scibRXFIFOISR(void)
{
    uint16_t i;
    uint16_t rcvChar[2];
    uint16_t fifoLevel;

    rcvdData = SCI_readCharBlockingNonFIFO(SCIB_BASE);

    SCI_clearOverflowStatus(SCIB_BASE);

    SCI_clearInterruptStatus(SCIB_BASE, SCI_INT_RXRDY_BRKDT);

    //
    // Issue PIE ack
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);

}

提前感谢您。

此致、

James。

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

    尊敬的 James:

    您能否确认发送数据的格式是否与您在示例代码中配置的格式相匹配?

    波特率:9600

    字长:8.

    停止位:2.

    奇偶校验:无

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

    您好、Aditya、

    是的、我已经确认数据格式与我配置的格式匹配。

    我正在使用 Putty 和我自己的应用程序。 两者都设置为9600-8-2-无。

    如上所述、我的代码可以正确获取数据、但在数据帧之间等待时间不足的情况下、连续数据会中断。

    是否有问题或我错过了什么?

    提前感谢您、

    James

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

    James、

    我主要看不到代码配置的任何问题、让我在这里也邀请硬件专家。  

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

    尊敬的 James:

    您能否确认在发送延迟小于100ms 时 PC 没有对传输进行"重新编号"? 从本质上讲、您能否获取 C2000-RX 引脚的示波器截图供我们查看? 如果不直接看到引脚、很难分辨发生了什么情况。

    我之前见过类似的情况、其中发送设备没有"队列"、基本上只是开始相互传输所有数据。

    另一个潜在问题是、如果您不使用2个停止位。 每次在 SCI 上触发中断时、中断都不会启动、直到1个停止位加上另1/8个停止位的检测时间。 这是 SCI 本身的问题。 因此、中断之间总共需要1+7/8个停止位。

    此致、

    Vince