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.

[参考译文] TMS320F280039C:SCI 中断检测条件

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1436954/tms320f280039c-sci-break-detect-condition

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

工具与软件:

我上次询问了如何调节 SCI 中断、TI 专家告诉我可以通过 GPIO 控制调节 SCI 中断。

在数据表中: SCI 在丢失的停止位之后为9.625位时为低电平。 (开始1位+数据8位+奇偶校验1位+停止1位+ 9.625位= 20.625位低电平(在250,000波特率下为82.5us)

在上述计算之后、我将 SCI 低电平条件设为约82.5us、但很少设置 SCI_RXSTATUS_BREAK。

我在77.96us 和85.05us 之间测试了总共104次、但 SCI 中断仅发生一次。 (SCI 中断在84.968us 低电平时发生、但 SCI 中断未在另一个84.968us 处发生)

您能建议我断开 SCI 的具体时间或条件吗?

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

    你好、Jaehoon、

    您是否可以提供代码片段、其中您直接操作引脚多路复用使其成为输出并通过 GPIO 模块驱动该输出? 一些验证 SCI 引脚是否为低电平的示波器屏幕截图也会有所帮助。 您是否可以尝试在这段时间内从外部将 SCI 引脚驱动为低电平、并查看这如何影响 SCI 寄存器中的中断检测标志?

    此致、

    Delaney

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

    MCU 1:通过 GPIO 控制使 SCI 线路变为低电平

    Fullscreen
    1
    2
    3
    4
    GPIO_setPinConfig(GPIO_16_GPIO16); // Change Pin configuration for GPIO control
    GPIO_writePin(SCITXDA_GPIO, 0); // Make the SCI line to low
    DEVICE_DELAY_US(50); // Keep low the SCI line
    GPIO_setPinConfig(GPIO_16_SCIA_TX); // Release the SCI line
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Break_Flag 2 :跟踪 SCI 中断和递增计数"DSSI_MCU"变量

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    __interrupt void sciaRxISR(void)
    {
    IER = INTERRUPT_CPU_INT3; // EPWM 1,2
    EINT;
    Function_DSSI_Rx();
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    #pragma FUNC_ALWAYS_INLINE(Function_DSSI_Rx)
    static inline void Function_DSSI_Rx(void)
    {
    unsigned char i, Count_Unsupported_CMD;
    uint16_t DSSI_Received;
    if((SCI_getRxStatus(SCIA_BASE) & SCI_RXSTATUS_BREAK)) // DSSI Break -> Configuration Phase
    {
    DSSI_Break_Flag++;
    Reply_OK();
    DSSI_Packet_Index = 0;
    SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXRDY_BRKDT);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    下面是 MCU 1控制的 SCI 线路的波形。

    我也使用了外部开关、但很难在100us 以下延迟实现。 (我使用外部开关时、最小 SCI 低电平时间约为50ms)

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

    你好、Jaehoon、

    您此处所示的计算和配置看起来是正确的。 另一种可能是波特率错误会干扰时序-您在使用什么 LSPCLK 设置?

    您的中断嵌套可能也会起作用-您是否可以尝试仅隔离 SCI RX 中断(删除嵌套和其他中断)以查看您现在是否接收到中断检测中断? 另请注意、您缺少一些用于嵌套中断的推荐代码、请参阅 此处链接的中断嵌套指南

    此致、

    Delaney

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

    尊敬的 Delaney:

    DEVICE_LSPCLK_FREQ 为30MHz。

    我还将按照您的建议进行测试、但如果嵌套块 SCI 中断的设置、我将如何做?

    在实际操作中不应删除嵌套。

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

    你好、Jaehoon、

    在30MHz 的 LSPCLK 和250,000 bps 的波特率下、应该会有0%的误差、这应该不是问题。

    中断嵌套有时会导致特定 ISR 的阻塞、或导致中断丢失。 由于您允许其他中断在执行实际功能之前中断 SCI RX ISR、因此可能无法达到 ISR 中的以下代码。 为了隔离这一点、你可以注释掉除了 ISR 内的:interrupt_clearACKGroup (interrupt_ACK_group9);行之外的所有内容?  

    此外、你在你的应用中启用了其它哪些中断?

    此致、

    Delaney

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

    尊敬的 Delaney:

    很抱歉,我在台湾出差。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    __interrupt void sciaRxISR(void)
    {
    if((SCI_getRxStatus(SCIA_BASE) & SCI_RXSTATUS_BREAK)) // DSSI Break -> Configuration Phase
    {
    DSSI_Break_Flag++;
    SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXRDY_BRKDT);
    SCI_performSoftwareReset(SCIA_BASE);
    }
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我类似地更改了代码、但很少像以前一样设置 SCI_RXSTATUS_Break 标志。

    --------------------------------------------------------------------------------------------------------------------

    INTERRUPT_ENABLE (INT_PMBUSA);

    INTERRUPT_ENABLE (INT_SCIB_RX);

    INTERRUPT_ENABLE (INT_SCIB_TX);

    INTERRUPT_ENABLE (INT_SCIA_RX);

    INTERRUPT_ENABLE (INT_SCIA_TX);

    INTERRUPT_ENABLE (INT_myECAP0);

    INTERRUPT_ENABLE (INT_XINT1);

    interrupt_enable (TTPLPFC_C28x_instruments_interrupt_TIMER0);

    interrupt_enable (TTPLPFC_C28x_instruments_interrupt_Timer1);

    INTERRUPT_ENABLE (PSFB_FB_PWM1_INT);

    INTERRUPT_ENABLE (PSFB_C28x_CONTROLISR_INTERRUPT);

    INTERRUPT_ENABLE (INT_I2CA_FIFO);

    INTERRUPT_ENABLE (INT_I2CA);

    --------------------------------------------------------------------------------------------------------------------

    以上是我的代码中的所有中断。

    我认为这种中断不会因其他中断而发生、这是不可接受的。

    中断可以因其他中断而延迟执行、但因其他中断而不执行中断没有意义。

    如您所知、C2000系列用于电源控制、因此不可避免地会嵌套用于电源控制的中断。

    请给我更多的基本建议。

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

    你好、Jaehoon、

    我明白、如果你仔细操作、你不应该有任何中断损失。 请查看 此处链接的文档 并将您的中断代码与此处匹配、以验证嵌套是否正确发生。 还有一些可以使用的示例屏蔽文件、如[C2000ware install]/driverlib/f28003x/examples/interrupt/interrupt_ex3_sw_prioritization.中的中断软件优先级示例所示 您能否指定要使用的优先级顺序、以及我能否为软件实现提供一些指导?

    此外、排除嵌套作为一个问题的一个好方法是在禁用除 SCI A 接收中断之外的所有其他中断的情况下测试应用程序。

    此致、

    Delaney