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 错误处理的详细信息

Guru**** 2587345 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1206437/tms320f28379d-request-for-details-on-sci-error-handling

器件型号:TMS320F28379D

大家好

我想要求提供有关 f28379d 上的 SCI 如何处理错误情况的更多详细信息。

此帖子中有很多问题、因此请仔细阅读、您可以随意地将您的答案分成多个答案。

我将这个问题局限于接收器部分(RX)、还局限于使用 FIFO 的情况。

第一章介绍不同的错误状态位

 我已经看到过关于这一主题的其他帖子,但我肯定地注意到结论。

三个寄存器具有错误状态位

  • SCIRXST
    • RXERROR (FE|OE|PE)
    • BRKDT (不总是一个错误,但我还是把它包括在这里)
    • OE
    • PE
  • SCIRXBUF
    • SCIFFFE
    • SCIFFPE
  • SCIFFRX
    • RXFFOVF

我明白不同的错误类型是什么、即组帧错误基本上是一个缺少的停止位 a.s.o。

尚不清楚的是 SCIRXST->FE 和 SCIRXBUF->SCIFFFE 之间的行为和关系。

SCIRXST->PE 和 SCIRXBUF->SCIFFPE 也是如此

让我解释一下我如何理解这一点、然后请纠正我的错误。

想象一下 SCI 接收到5个字节的数据、这些数据都存储在 FIFO 中。

我们将这些字节 b0命名为 b4、其中 b0是第一个到达串行线路的字节、因此位于 FIFO 中。

当 SCI 接收到 B2时、它检测到一个奇偶校验错误。

现在、我明白了这一点。

  • 在接收到 B2并检测到奇偶校验错误的时刻、SCIRXST->PE 位将置位、如果启用、将触发错误 IRQ。
  • SCIRXST->PE 位将保持置位、直到 SW 发出 SW 复位、方法是将0写入 SCICTL1->SWRESET 位、然后将1写入同一位。
  • FIFO 中留出了存储这些信息的空间、因此奇偶校验错误会与字节一起存储。
  • 当从 FIFO 读取字节时、通过读取 SCIRXBUF 寄存器、我得到 SCIFFPE 位被设置为当并且仅当我读取 B2时
    • 由于到 SWRESET 的说明中没有提到这些寄存器、我假设存储在 FIFO 中的错误信息不受软件复位的影响。

因此、读取5次 SCIRXBUF 寄存器后、我就得到了以下结果:

字节

位15

SCIFFFE

位14

SCIFFPE

位13-8

保留

位7-0

SAR

B0 0 0 X

数据

B1 0 0 X 数据
B2. 0 1. X 无效数据
B3 0 0 X 数据
B4. 0 0 X 数据
  • 另据我所知、我必须在一次读取中读取 SCIFFPE 和 SAR、作为只读取 SCIFFPE 的尝试、将计数为读取该寄存器、并从 FIFO 中弹出下一个值。

这一切都意味着我可以得出结论:b0和 b1是有效数据、因为它们在错误之前是接收到的、而 b3和 b4是有效数据、因为它们在错误之后是接收到的、如果它们有效、则在很大程度上取决于其他因素、 但在接收这些寄存器期间未检测到错误。

现在、我们来看看问题的下一章、"发生数据和错误"。

这里、我想的是被移入 RXSHF 寄存器的内容、以及之后在不同错误场景下会在 SCIRXBUF 中启动的内容。

  • 在发生奇偶校验错误时、我希望接收到的位存在、只是通过奇偶校验错误位标记为"不良"。
  • 当组帧错误发生时、我预期会发生同样的情况、所以在线路上的一个高到低转换触发读取、但是线路又出现了、因此没有停止位、我会在 SAR 中使用零。
    • 如果你现在看一下 RXSHF 的内容(我知道它不能从 SW 访问),包括奇偶校验在内的所有零,取决于奇偶校验设置,这可以被检测为奇偶校验错误。 这也会导致奇偶校验错误位的设置、还是被组帧错误排除?
  • 从手册进行中断检测时"当 SCI 接收器数据线(SCIRXD)持续保持低电平至少10位、在缺少第一个停止位后开始、便会出现中断状态"
    • 这个"缺少第一个停止位"会触发一个组帧错误、还是被中断检测排除?
    • "中断的发生 但它不会导致加载接收器缓冲区。"、部分取决于对上一个问题的回答。 "丢失的第一个停止位"之前的数据是否会被移位、从而更改 RXFFST?

最后一章、SW 行为错误。

SW 的行为有时不同于 SCI 的设计人员所期望的:-)

从连接到 CTL 寄存器等的 RX 引脚移位数据的难度有多大。 ?

如果 SWRESET 位或 RXENA 位在接收一个字节的中间被 SW 改变。

  • 转换到 RXSHF 是否会暂时停止?
    • 如果不是、它会被推送到 SCIRXBUF 吗?
    • 如果是、会将已接收到的位推入、这是否会导致检测到奇偶性校验或帧错误?

除了上述错误外、有没有其他方法可以使错误的 SW 触发错误 PE/OE/FE 错误?

如果我要更改奇偶校验位等设置、 首次通信后(无法保证线路静默)、那么建议的步骤是什么?

是的、我的确假定这个过程涉及到清零 RXENA 位、但是

  • 我是否需要等待任何事情、例如在更改期间移动正在接收的潜在字节?
  • 是否需要清空 FIFO、如果不重新解释 FIFO 中的当前数据、即更改数据大小或奇偶校验设置?

发出软件复位时、首先写入0、然后向 SWRESET 写入1。 我是否需要在写入0和1之间插入暂停?

注意:参考手册"SPRUHM8I–2013年12月–2019年9月修订"第2295页第4行中存在拼写错误
"SCIFFTX 控制接收 FIFO 中断"我认为它应该是"SCIFFRX 控制接收 FIFO 中断"

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

    尊敬的 Martin:

    感谢您的发帖。 我需要一些时间来详细回答您的所有问题。 请预计我的初始回答在一周结束前。 注意、您提出的某些问题可能需要我们的设计团队提供一些建议、在这种情况下、为您提供答案可能需要更长时间。 因此、请告诉我、这些问题中是否有任何一个对您来说是紧急的、我们可以根据需要确定优先级。

    此致、

    Marlyn

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

    尊敬的 Martin:

    Unknown 说:
    让我解释一下我是如何理解这一点的、然后请在哪里更正我的错误。

    您解读信息的方式是正确的。 RXBUF 寄存器内的'SCIFFFE'和'SCIFFPE'位用于作为正在接收的特定数据集的标志。  SCIRXST 寄存器内的'FE'和'PE'位可以被认为是高级错误标志、如果接收到的任何数据 存在帧或奇偶校验错误、该标志将被置位。

    在奇偶校验错误时,我希望接收到的位在那里,只是用奇偶校验错误位标记为"不良"。

    正确。

    Unknown 说:
    关于组帧错误,我认为是一样的,所以在线路上有一个高->低转换的情况下,触发了读取,但是线路又出现了,因此没有停止位,我会在 SAR 中使用零。
    • 如果你现在看一下 RXSHF 的内容(我知道它不能从 SW 访问),包括奇偶校验在内的所有零,取决于奇偶校验设置,这可以被检测为奇偶校验错误。 这也会导致奇偶校验错误位的设置、还是被组帧错误排除?
    [/报价]

    检测机制独立于这两者、因此标记成帧错误不会排除检测到奇偶校验错误。 如果存在奇偶校验和帧错误、则会设置两个标志。

    进行手动中断检测时"当 SCI 接收器数据线(SCIRXD)持续保持低电平并持续保持至少10位时、从缺少第一个停止位后开始、便会出现中断情况"
    • 这个"缺少第一个停止位"会触发一个组帧错误、还是被中断检测排除?
    • "中断的发生 但它不会导致加载接收器缓冲区。"、部分取决于对上一个问题的回答。 "丢失的第一个停止位"之前的数据是否会被移位、从而更改 RXFFST?
    [/报价]

    在所有情况下、它们都是独立检测的、并且不会阻止彼此设置。 所以将会有一个组帧错误和一个中断检测错误。 请注意、如果你正在检查 SCIRX 是否突然被某些 SCITX 误驱动为低电平、那么检查中断检测标志比组帧错误标志更好。  与 FE 相比、BRKDT 的优势在于它可以被 SCIRX 检测到、并且即使在多处理器 SCI 模式使用中休眠、也会向 SW 触发中断。 睡眠 SCIRX 只有在检测到地址位为"1"时才会唤醒、但如果地址位也为"0"、则不会唤醒睡眠 RX。 在这种情况下、BRKDT 只能触发、因为 FE 无法帮助识别卡在"0"问题上的问题。

    仍会移动丢失的第一个停止位之前的数据。  只要检测到起始位、SCI 仍将接收数据并在存在任何错误时相应地设置错误。 这一切都取决于起始位的位置。

    如果 SWRESET 位或 RXENA 位在接收一个字节的中间被 SW 改变。

    • 转换到 RXSHF 是否会暂时停止?
      • 如果不是、它会被推送到 SCIRXBUF 吗?
      • 如果是、会将已接收到的位推入、这是否会导致检测到奇偶性校验或帧错误?
    [/报价]

    RXENA 负责将数据移入 RX 缓冲器。 如果在接收字节的过程中将 RXENA 位清零、则仍将在 RXSHF 寄存器中接收数据、只是不会移入 RX 缓冲区。 从 TRM 来看、"数据继续在 RXSHF 中进行汇编、但不会传输到接收器缓冲寄存器。" 此外、一旦 SCI 接收到完整的帧、便会将 RXSHF 寄存器中的数据传输到 SCIRXBUF 寄存器。  

    位接收过程中 SWRESET 的变化不应影响数据的接收。

    Unknown 说:

    是、请 ︎ 此主题了解更多详细信息(特别是 Vince 标记为"TI 认为已解析"的回答:TMS320F280025:SCI 通信字节时序- C2000微控制器论坛- C2000 μ s 微控制器- TI E2E 支持论坛

    需要注意的重要事项是确保您使用的是2个停止位、并且您要使 RX 中断尽可能短。  

    Unknown 说:
    如果我想更改奇偶校验位之类的设置。 首次通信后(不能保证静默线路)、那么建议的程序是什么?

    这取决于系统(在需要更改时没有硬件限制)。

    是的、我的确假定这个过程涉及到清零 RXENA 位、但是

    • 我是否需要等待任何事情、例如在更改期间移动正在接收的潜在字节?
    • 是否需要清空 FIFO、如果不重新解释 FIFO 中的当前数据、即更改数据大小或奇偶校验设置?
    [/报价]

    一旦它进入 FIFO、将发生 RX 错误(如果有的话)。 SCI 模块不会使用新的奇偶校验或其他可能已更改的设置重新解释数据。 因此、在您更改参数后、您应该清除 FIFO 数据或在您的系统中确认此更改很可能导致数据中出现错误。   

    Unknown 说:
    在发出 SW-reset 时、首先写入0、然后向 SWRESET 写入1。 我是否需要在写入0和1之间插入暂停?

    对 SWRESET 写入之间所需的等待时间没有要求。

    Unknown 说:
    NB:参考手册"SPRUHM8I–December 2013–reversed September 2019"、第2295页、第4行中有一个拼写错误
    "SCIFFTX 控制接收 FIFO 中断"我认为应该是"SCIFFRX 控制接收 FIFO 中断"[/引号]

    谢谢! 我们将在本文档的下一个修订版本中更正此问题。  

    如果您有任何进一步的问题、敬请告知。 TX 侧的工作方式与 RX 侧非常相似。 该逻辑大部分情况下在这两者之间进行镜像。  

    此致、

    Marlyn

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

    我将它标记为已解决、因为您回答了我的所有问题、但我有一个跟进问题忘记了。

    它与中断触发有关。

    目前、我已经设置好使用 FIFO、但 RXFFIL 设置为1、因此我们在收到一个字节时立即收到中断。

     我有一个 IRQ 处理函数、这与您在大多数示例中找到的函数相似、首先我检查错误、然后我循环使用 FIFO 缓冲区(使用 RXFFST)从该缓冲区读取所有数据。 最后清除中断标志。

    如果在短时间内接收到一个字节/帧的结束、从 我的 lat 读取 RXFFST 直到我清除中断标志、该怎么办?

    • 它会立即触发一个新的中断吗?
    • TRM 中的文本"只要 FIFO 状态 位(RXFFST4-0)大于或等于"、接收 FIFO 就产生中断、意思是我只在接收到下一个字节/帧且 RXFFST 为=2时才得到中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Martin:

    是否会立即触发新的中断?

    是的、由于在这种情况下您还没有从 FIFO 读取新数据、将触发一个新的中断、并且此标志将保持置位状态、直到您读取数据/清除中断标志。

    TRM 中的文本"只要 FIFO 状态 位(RXFFST4-0)大于或等于,接收 FIFO 就产生中断"是否意味着仅当接收到下一个字节/帧且 RXFFST =2?

    由于 RXFFIL 设置为1、因此一旦 RX FIFO 中有一个字或多个字、就会发生中断。

    此致、

    Marlyn  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,因为在这种情况下您尚未从 FIFO 读取新数据,所以将触发新的中断,并且该标志将保持设置状态,直到您读取数据/清除中断标志。

    我不知道我的问题是否清楚,让我 ilustrate。

    下面是 IRQ 服务函数中一个非常简化的代码片段

    我将尝试说明一下、我将讨论从读取 RXFFST 到清除中断标志的很短的时间跨度。

    当你在回复中写道"在你读取数据前保持置位/清除中断标志"、但我在最后一行"清除中断标志"!

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

    尊敬的 Martin:

    感谢您的澄清。  

    将触发一个新中断,且该标志将保持设置状态,直到您读取数据/清除中断标志

    让我重新表达我的响应以使其更清楚、我的意思是 、在您清除当前中断标志后、中断标志将被重置。 只有在你读取该新的数据集之后(没有更多数据要读取)、才会有更多挂起的中断标志。

    在您的情形中、 只要 FIFO 中有一个字(RXFFST >= 1)、中断标志就会被置位、即使您在该条件为 true 时清除该标志、也会在清除后再次被置位。  

    此致、

    Marlyn