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.

[参考译文] TMS320F28035:用于 TX/RX 的 SCI 配置具有中断但没有 FIFO 缓冲

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1279668/tms320f28035-sci-configuration-for-tx-rx-with-interrupts-but-without-fifo-buffering

器件型号:TMS320F28035
主题中讨论的其他器件:C2000WARE

您好、TI 团队。

我请求获得有关 SCI 寄存器配置的帮助。

我想在进行中断处理的同时接收和发送数据、但没有 FIFO 缓冲。

以下是我的配置:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define CPU_FREQ (Uint32)60E6 // 60 MHz MCU
#define LSPCLK_FREQ (Uint32)(CPU_FREQ / 4) // 15 MHz (prescaler = 4)
#define SCI_FREQ (Uint32)115200 // 115200 bps
#define SCI_PRD (Uint16)((LSPCLK_FREQ / (SCI_FREQ * 8)) - 1)
// 1 stop bit, No loopback, No parity, 8 char bits, async mode,
// idle-line protocol
//
SciaRegs.SCICCR.all =0x0007;
//
// enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKE
//
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIHBAUD = SCI_PRD >> 8;
SciaRegs.SCILBAUD = SCI_PRD;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

但是、如何在没有 FIFO 缓冲的情况下启用 Tx 和 RX 中断呢?

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

    尊敬的 WW:

    感谢您的提问。

    但是如何在没有 FIFO 缓冲的情况下启用 Tx 和 RX 中断?

    默认禁用 FIFO。 无需执行任何操作。

    此致、

    文斯

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

    是的、你有权默认禁用 FIFO、但中断怎么样呢? 我在代码中看到:

    Fullscreen
    1
    2
    SciaRegs.SCICTL2.bit.TXINTENA =1;
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    这表明启用了 RX/TX 中断、但如果运行 Example_280Creations Sci_Echoback 示例、您将看到没有报告 RX 中断- RX 读取数据时、RXRDY 未置位。

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

    尊敬的 WW:

    您是否设置了 TXENA 和 RXENA? 这些位不同于这些位的中断版本。

    此致、

    文斯

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

    您好、 。 我正在使用的 example_280c Sci_Echoback 示例、其中包含:

    Fullscreen
    1
    SciaRegs.SCICTL1.all =0x0003;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    因此、TXENA 和 RXENA 位被设置。 但是、尽管如此以及相关设置:

    Fullscreen
    1
    2
    SciaRegs.SCICTL2.bit.TXINTENA =1;
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    不报告中断。

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

    尊敬的 WW:

    您能否按照本指南中的步骤操作、并提供 RX 和 TX 线的示波器捕获、以及哪一个问题最相似? 本指南介绍了使 TX 和/或 RX 再次正常工作的完整过程。

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1031947/faq-my-c2000-sci-is-not-transmitting-and-or-receiving-data-correctly-how-do-i-fix-this

    此致、

    文斯

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

    您好、 。 当然可以、但我只是想运行 Sci_Echoback 启用了中断的 Example_28052示例、并且能够对其进行测试、但是此示例中没有报告中断、但是它们应该跟踪配置:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //
    // Note: Clocks were turned on to the SCIA peripheral in the InitSysCtrl()
    // function
    //
    //
    // 1 stop bit, No loopback, No parity, 8 char bits, async mode,
    // idle-line protocol
    //
    SciaRegs.SCICCR.all =0x0007;
    //
    // enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKE
    //
    SciaRegs.SCICTL1.all =0x0003;
    SciaRegs.SCICTL2.bit.TXINTENA =1;
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    SciaRegs.SCIHBAUD =0x0000; // 9600 baud @LSPCLK = 15MHz (60 MHz SYSCLK)
    SciaRegs.SCILBAUD =0x00C2;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    尊敬的 WW:

    感谢您的跟进。 我要求遵循常见问题解答指南、然后在此处提供您的结果的主要原因是、如果这是电线连接等硬件问题、该指南中提到的示波器捕获将有助于快速缩小问题范围。

    因此、从根本上说、RX 和 TX 的示波器捕获会极大地加快此处的调试速度、谢谢!

    此致、

    文斯

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

    您好、 。 现在、我重点介绍传输数据、这里是我从数字分析仪捕获的 TX 数据。

    这是模拟捕获。

    以下是数字捕获:

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

    尊敬的 WW:

    TX 似乎没有任何问题、但就像我之前说的、查看 RX 线路将会发现在其到 RX 引脚的路上是否发生了奇怪的情况(线路损坏、压摆率缓慢、电压被拉至低电平等)。 请提供 TX 和 RX 捕获信息。

    此致、

    文斯

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

    您好、 、这里是我的 TX 和 RX 捕获结果(数字和模拟)。

    我使用了 Example_28045_ Sci_Echoback 示例。

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

    尊敬的 WW:

    似乎工作正常、问题是什么? 它正在响应的文本显示:

    ""

    您发送了:L

    输入字符:

    ""

    此致、

    文斯

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

    您好, 

    在这种情况下、当我使用一个 Sci_Echoback 启用了 SCI 中断的 Example_280SCI 示例时、RX 和 TX 没有报告中断。 当 RX 接收数据时、RXRDY 位不置位。

    我想要实现的是修改此示例、以便在没有 FIFO 缓冲的情况下可以处理 RX 和 TX 中断。

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

    尊敬的 WW:

    也许我是在误解您的评论、但从波形中可以看到 TX 和 RX 中断工作正常、并且正在触发和读取/写入 数据。 如果在修改代码以删除 FIFO 之后获取这些波形、则看上去工作正常。

    确保不要在 CCS 中将监视窗口保持打开状态、因为它有可能在中断触发前读取字节。

    此致、

    文斯

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

    您好、 。 我想我们会相互误解。 让我解释一下... 我使用的 example_280c 示例 Sci_Echoback 没有实现 FIFO 和中断、此示例中所需要的就是支持中断。

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

    尊敬的 WW:

    好的、感谢您的解释。 我认为您要查找的确切示例是"example_2803xSci_FFDLB_int.c"示例。 中断和 FIFO 启用。 它位于 C2000Ware 的"scia_loopback_interrupts"下。

    此致、

    文斯

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

    您好、 。 我知道这个示例、但我不需要 FIFO 支持。 我想要的就是使 SCI RX TX 具有中断但没有 FIFO。

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

    WW

    这就是您需要完成的所有操作、基本上不要使用 FIFO 寄存器:

    此致、

    文斯

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

    、好的、我会尝试一下、但如果您说这些行是不必要的、以防我不需要 FIFO 支持、那么这些行也是不必要的:

    Fullscreen
    1
    2
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    在 sciaRxFifoIsr 和 thse 行中:

    Fullscreen
    1
    SciaRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    在 sciaTxFifoIsr 上。 我对吗?

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

    我检查了您的设置。 报告了 RX 中断、该中断正常、但 TX 错误。 应报告中断空 TX 缓冲器、但实际上不报告。

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

    大家好,WW

    如果我不需要 FIFO 支持,则也不需要这些行:

    正确、这些也可以添加注释。

    中断空 TX 缓冲区应报告但不应报告。

    发生这种情况时、是否设置了任何错误标志? 我想知道这是否是一个错误中断、触发了 ISR、但是没有被清除(这可能会阻止进一步的中断触发)。

    此致、

    文斯

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

    你好,  ,我做了一些研究。  
    现在、这里是我的 sci init 函数:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    scia_fifo_init()
    {
    //
    // 1 stop bit, No loopback, No parity, 8 char bits, async mode,
    // idle-line protocol
    //
    SciaRegs.SCICCR.all =0x0007;
    //
    // enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKE
    //
    SciaRegs.SCICTL1.all =0x0003;
    SciaRegs.SCICTL2.bit.TXINTENA =1;
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    SciaRegs.SCIHBAUD = SCI_PRD >> 8;
    SciaRegs.SCILBAUD = SCI_PRD;
    //SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
    //SciaRegs.SCIFFTX.all=0xC022;
    //SciaRegs.SCIFFRX.all=0x0022;
    SciaRegs.SCIFFCT.all=0x00;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我的 TX ISR:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    __interrupt void
    sciaTxFifoIsr(void)
    {
    GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;
    //SciaRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ACK
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    和 RX ISR:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    __interrupt void
    sciaRxFifoIsr(void)
    {
    GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;
    znak = SciaRegs.SCIRXBUF.all;
    PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我将测试代码放在主循环前面:

    Fullscreen
    1
    2
    3
    4
    5
    SciaRegs.SCITXBUF = 'a';
    DELAY_US(100000);
    SciaRegs.SCITXBUF = 'b';
    DELAY_US(100000);
    SciaRegs.SCITXBUF = 'c';
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我的结论:

    RX ISR 工作正常、TX ISR 在发送一个字符后报告一次、因此在这种情况下、当我想发送 a'、"b'、'c'个字符时、TX ISR 将报告三次。 难道不应该在发送缓冲器为空时一直报告它吗?

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

    我想要实现的是、当报告 TX ISR 时、这意味着 TX buffor 为空、我要在 TX ISR 中发送一些数据(char 阵列)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否不应该在传输缓冲区为空时一直报告它?

    尊敬的 WW:

    当 TX 缓冲区清空时、TX ISR 只会触发一次中断。 这是预期行为。 当您再次填满时、它将在缓冲器再次变为空时再次触发。 您应该在中断内缓冲区为空时将其填满。

    如果您不想在中断期间填充它、那么您需要在代码中的其他位置(在中断之外)手动检查 TXRDY。

    您可以在"main"循环中添加 TXRDY 检查。

    此致、

    文斯

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

    您好、 。 好的、感谢您的澄清。 如果您说我应该填充 TX 中断内部的缓冲区、在这种情况下、我应该如何触发 TX 中断? 如果我要在 TX 中断内部传输某个字符阵列、但需要触发该中断以开始传输数据、那么我应该设置哪个位?

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

    、如果您说 TX ISR 在 TX 缓冲区清空时只触发一次中断-在这种情况下、我对 TX FIFO 中断有疑问。 是什么时候提出的? 触发一次何时 TX FIFO 缓冲区为空之后、还是始终在 TX FIFO 缓冲区为空时?

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

    尊敬的 WW:

    如何触发 TX 中断?

    当 FIFO 清空时、TX 中断应该会像你已经在做的那样触发。 但当 FIFO 为空时、应该向它提供更多要发送的数据。 如果没有更多数据要发送、请等待添加更多数据、然后只需在需要添加更多数据时运行 send 命令(除非您已准备好在 ISR 结束时发送更多数据、否则无需处于 ISR 中)。

    ISR 只是(在本例中)一种让您让 CPU 知道"如果您有的话、我可以自由地发送更多数据"的方法。

    在这种情况下,我对 TX FIFO 中断有疑问。 是什么时候提出的? TX FIFO 缓冲区清空后或 TX FIFO 缓冲区清空时始终发生一次?

    倒空时应该放一次。

    此致、

    文斯

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

    您好、 。 我认为中断只应触发一次、但当我使用 TX FIFIO 缓冲时、中断会持续触发。 如果您检查 Example_2803xSCI_FFDLB_int 示例、您将看到、在这种情况下、中断始终被触发。

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

    尊敬的 WW:

    只有在不清除中断的情况下、才会发生常量触发。 你是否清除了适当的中断?

    此致、

    文斯

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

    您好、 。 在 Example_2803xSCI_FFDLB_int 示例中、即使出现以下行、也会持续触发 TX 中断:

    Fullscreen
    1
    2
    SciaRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ACK
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    存在四个事件。

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

    尊敬的 WW:

    您是否检查是否设置了其他中断标志? 似乎错误标志已设置。

    此致、

    文斯