主题中讨论的其他器件:C2000WARE
您好、TI 团队。
我请求获得有关 SCI 寄存器配置的帮助。
我想在进行中断处理的同时接收和发送数据、但没有 FIFO 缓冲。
以下是我的配置:
但是、如何在没有 FIFO 缓冲的情况下启用 Tx 和 RX 中断呢?
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.
您好、TI 团队。
我请求获得有关 SCI 寄存器配置的帮助。
我想在进行中断处理的同时接收和发送数据、但没有 FIFO 缓冲。
以下是我的配置:
#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; SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
但是、如何在没有 FIFO 缓冲的情况下启用 Tx 和 RX 中断呢?
尊敬的 WW:
感谢您的提问。
但是如何在没有 FIFO 缓冲的情况下启用 Tx 和 RX 中断?
默认禁用 FIFO。 无需执行任何操作。
此致、
文斯
是的、你有权默认禁用 FIFO、但中断怎么样呢? 我在代码中看到:
SciaRegs.SCICTL2.bit.TXINTENA =1; SciaRegs.SCICTL2.bit.RXBKINTENA =1;
这表明启用了 RX/TX 中断、但如果运行 Example_280Creations Sci_Echoback 示例、您将看到没有报告 RX 中断- RX 读取数据时、RXRDY 未置位。
尊敬的 WW:
您是否设置了 TXENA 和 RXENA? 这些位不同于这些位的中断版本。
此致、
文斯
您好、 Vince。 我正在使用的 example_280c Sci_Echoback 示例、其中包含:
SciaRegs.SCICTL1.all =0x0003;
因此、TXENA 和 RXENA 位被设置。 但是、尽管如此以及相关设置:
SciaRegs.SCICTL2.bit.TXINTENA =1; SciaRegs.SCICTL2.bit.RXBKINTENA =1;
不报告中断。
尊敬的 WW:
您能否按照本指南中的步骤操作、并提供 RX 和 TX 线的示波器捕获、以及哪一个问题最相似? 本指南介绍了使 TX 和/或 RX 再次正常工作的完整过程。
此致、
文斯
您好、 Vince。 当然可以、但我只是想运行 Sci_Echoback 启用了中断的 Example_28052示例、并且能够对其进行测试、但是此示例中没有报告中断、但是它们应该跟踪配置:
// // 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; SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
尊敬的 WW:
感谢您的跟进。 我要求遵循常见问题解答指南、然后在此处提供您的结果的主要原因是、如果这是电线连接等硬件问题、该指南中提到的示波器捕获将有助于快速缩小问题范围。
因此、从根本上说、RX 和 TX 的示波器捕获会极大地加快此处的调试速度、谢谢!
此致、
文斯
您好、 Vince。 现在、我重点介绍传输数据、这里是我从数字分析仪捕获的 TX 数据。
这是模拟捕获。
以下是数字捕获:
尊敬的 WW:
TX 似乎没有任何问题、但就像我之前说的、查看 RX 线路将会发现在其到 RX 引脚的路上是否发生了奇怪的情况(线路损坏、压摆率缓慢、电压被拉至低电平等)。 请提供 TX 和 RX 捕获信息。
此致、
文斯
您好、 Vince、这里是我的 TX 和 RX 捕获结果(数字和模拟)。
我使用了 Example_28045_ Sci_Echoback 示例。
尊敬的 WW:
似乎工作正常、问题是什么? 它正在响应的文本显示:
""
您发送了:L
输入字符:
""
此致、
文斯
您好, Vince
在这种情况下、当我使用一个 Sci_Echoback 启用了 SCI 中断的 Example_280SCI 示例时、RX 和 TX 没有报告中断。 当 RX 接收数据时、RXRDY 位不置位。
我想要实现的是修改此示例、以便在没有 FIFO 缓冲的情况下可以处理 RX 和 TX 中断。
尊敬的 WW:
也许我是在误解您的评论、但从波形中可以看到 TX 和 RX 中断工作正常、并且正在触发和读取/写入 数据。 如果在修改代码以删除 FIFO 之后获取这些波形、则看上去工作正常。
确保不要在 CCS 中将监视窗口保持打开状态、因为它有可能在中断触发前读取字节。
此致、
文斯
您好、 Vince。 我想我们会相互误解。 让我解释一下... 我使用的 example_280c 示例 Sci_Echoback 没有实现 FIFO 和中断、此示例中所需要的就是支持中断。
尊敬的 WW:
好的、感谢您的解释。 我认为您要查找的确切示例是"example_2803xSci_FFDLB_int.c"示例。 中断和 FIFO 启用。 它位于 C2000Ware 的"scia_loopback_interrupts"下。
此致、
文斯
您好、 Vince。 我知道这个示例、但我不需要 FIFO 支持。 我想要的就是使 SCI RX TX 具有中断但没有 FIFO。
WW
这就是您需要完成的所有操作、基本上不要使用 FIFO 寄存器:
此致、
文斯
Vince、好的、我会尝试一下、但如果您说这些行是不必要的、以防我不需要 FIFO 支持、那么这些行也是不必要的:
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
在 sciaRxFifoIsr 和 thse 行中:
SciaRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag
在 sciaTxFifoIsr 上。 我对吗?
Vince 我检查了您的设置。 报告了 RX 中断、该中断正常、但 TX 错误。 应报告中断空 TX 缓冲器、但实际上不报告。
大家好,WW
如果我不需要 FIFO 支持,则也不需要这些行:
正确、这些也可以添加注释。
中断空 TX 缓冲区应报告但不应报告。
发生这种情况时、是否设置了任何错误标志? 我想知道这是否是一个错误中断、触发了 ISR、但是没有被清除(这可能会阻止进一步的中断触发)。
此致、
文斯
你好, Vince ,我做了一些研究。
现在、这里是我的 sci init 函数:
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; SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset //SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; //SciaRegs.SCIFFRX.bit.RXFIFORESET=1; }
我的 TX ISR:
__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 }
和 RX ISR:
__interrupt void sciaRxFifoIsr(void) { GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1; znak = SciaRegs.SCIRXBUF.all; PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack }
我将测试代码放在主循环前面:
SciaRegs.SCITXBUF = 'a'; DELAY_US(100000); SciaRegs.SCITXBUF = 'b'; DELAY_US(100000); SciaRegs.SCITXBUF = 'c';
我的结论:
RX ISR 工作正常、TX ISR 在发送一个字符后报告一次、因此在这种情况下、当我想发送 a'、"b'、'c'个字符时、TX ISR 将报告三次。 难道不应该在发送缓冲器为空时一直报告它吗?
我想要实现的是、当报告 TX ISR 时、这意味着 TX buffor 为空、我要在 TX ISR 中发送一些数据(char 阵列)。
是否不应该在传输缓冲区为空时一直报告它?
尊敬的 WW:
当 TX 缓冲区清空时、TX ISR 只会触发一次中断。 这是预期行为。 当您再次填满时、它将在缓冲器再次变为空时再次触发。 您应该在中断内缓冲区为空时将其填满。
如果您不想在中断期间填充它、那么您需要在代码中的其他位置(在中断之外)手动检查 TXRDY。
您可以在"main"循环中添加 TXRDY 检查。
此致、
文斯
您好、 Vince。 好的、感谢您的澄清。 如果您说我应该填充 TX 中断内部的缓冲区、在这种情况下、我应该如何触发 TX 中断? 如果我要在 TX 中断内部传输某个字符阵列、但需要触发该中断以开始传输数据、那么我应该设置哪个位?
Vince 、如果您说 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 缓冲区清空时始终发生一次?
倒空时应该放一次。
此致、
文斯
您好、 Vince。 我认为中断只应触发一次、但当我使用 TX FIFIO 缓冲时、中断会持续触发。 如果您检查 Example_2803xSCI_FFDLB_int 示例、您将看到、在这种情况下、中断始终被触发。
尊敬的 WW:
只有在不清除中断的情况下、才会发生常量触发。 你是否清除了适当的中断?
此致、
文斯
您好、 Vince。 在 Example_2803xSCI_FFDLB_int 示例中、即使出现以下行、也会持续触发 TX 中断:
SciaRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ACK
存在四个事件。
尊敬的 WW:
您是否检查是否设置了其他中断标志? 似乎错误标志已设置。
此致、
文斯