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.

[参考译文] TMS320F28P650SH:SCI:如何检查数据是否已被传输。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1406694/tms320f28p650sh-sci-how-to-check-that-data-has-been-transmitted-or-not

器件型号:TMS320F28P650SH
主题中讨论的其他器件:SysConfig

工具与软件:

团队成员、您好!

我对 SCI 有一个疑问、在这方面需要一些帮助。

场景:

有2个控制器(F28P6x 和 F2839x)通过 SCI 协议进行通信。

我的设计基于半双工、这意味着只有1个控制器处于发送模式、另一个控制器处于 atime 中的接收模式、并且两侧都有1个 EN 引脚用于控制哪一个是主控制器以及哪一个是从控制器。

最初我已经使 F28p6x (EN1引脚高电平)作为主器件和另一个作为从器件(EN2引脚低电平)。

我的问题如下:

-在电源循环主机发送数据后, EN1引脚我们把低电平模式下做一个接收器,但我没有找到任何 API 告诉我数据已成功传输,如果有任何 API 将在那里,将很容易作出决定做一个主机和从机。

您能帮助解决这个问题吗?

因为我没有使用任何 Tx FIFO。

下面是我用于传输数据的示例代码。

SysConfig SCI 设置:

用于传输数据的 API:

用于检查是否已成功传输数据的 API:  (此 API 不工作)。

静态内联 bool
SCI_isTransmitterBusy (uint32_t base)

请告诉我如何知道所有数据均已成功传输。

谢谢你

Shashank

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

    大家好、Shashank、

    你从哪里调用 uart_send_data()函数? 由于您将发送 FIFO 级别设置为在 FIFO 中有16个可用位置时中断、因此我建议在此 ISR 中一次写入16个字符。 然后、当下一个中断被触发时、您知道这意味着所有之前的字符已经被发送出去。 在接收端、您可以将 FIFO 电平设置为在 FIFO 已满时触发中断、因此在该中断中、您想要一次读取16个字符。 一旦 SCI 成功读取了所有16个字符、就会知道 RX FIFO 为空。

    为了澄清、您是否要按如下方式在状态之间切换:

    状态1:器件1向器件2传输16个字符

    状态2:器件2向器件1传输16个字符

    状态1:设备1向设备2传输16个字符...

    如果是、 我建议使用一些全局标志来跟踪该状态。 例如、如果该标志设置为1、则写入 ISR 中的 TX FIFO、并将该标志设置为0。 如果该 标志 设置为0、则在 TX ISR 中不执行任何操作。 然后您可以 在 RX ISR 中将该标志重新设置为1、这表示已经接收到16个字符。

    请告诉我这是否回答了您的问题;我也对我的延迟答复表示歉意。

    此致、

    Delaney

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

    您好、Delaney、

    感谢您的答复。

    我 每100ms 调用一次此函数 UART_SEND_DATA ()、调用此函数后、我正在等待使用此函数完成传输: while (SciaRegs.SCICTL2.bit.TXEMPTY = 1);

    但有时它似乎 不起作用。

    目前、我正在将8个字符从设备1传输到设备2。

    器件2向器件1传输16个字符。

    同样、器件1向器件2传输8个字符。

    正如您在附加图像中看到的、我已将传输 FIFO 设置级别设置为8、并将传输中断设置为参考图像、在中断中、我不执行任何任务。

    我的问题是、是否没有 API 告诉我们传输状态?

    我们必须只发送中断中的数据、当下一个 TX 中断碰到它时、我们应该认为上一个数据已经提交了、我不对吗?

    谢谢你

    Shashank

     

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

    大家好、Shashank、

    由于 SCI_isTransmitterBusy () 仅检查 FIFO 是否为空、即使 TX 缓冲区或移位寄存器中仍存在数据、也可能返回 false。  另一方面、SCICTL2寄存器中的 TXEMPTY 位只检查 TX 缓冲器和移位寄存器是否为空、不检查 TX FIFO。 由于传输的数据进入 TX 缓冲区-> TX FIFO -> TX 移位寄存器、因此您需要知道这三个数据何时为空(如果我正确理解了您的应用)。 此外、您可能希望 while 循环循环循环循环"while (SciaRegs.SCICTL2.bit.TXEMPTY == 0)" while not empty"、以便在它实际为空时中断。

    API 函数用于检测何时可以在不丢失数据的情况下将数据写入 SCI 发送器、而不是检测 TX 线路上的传输实际上何时完成、因此我们没有适用于您的确切情况的 API 功能。 您可以在代码中尝试以下操作吗?

    while( (SciaRegs.SCICTL2.bit.TXEMPTY == 0) && (SCI_isTransmitterBusy()) );

    然后、您可以在这段 while 循环中断后切换 GPIO、这将表明发送器已完成所有数据的发送。 在这种情况下、您应该无需启用 SCI TX 中断。 TXRDY 标志会触发 SCI TX 中断、而这不会在您需要两者的确切状态下触发。 请告诉我这是否可以解决您的问题。

    此致、

    Delaney