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.

[参考译文] TMS320F28075:SCI/UART:无法检测到停止位差异

Guru**** 2542660 points
Other Parts Discussed in Thread: TMS320F28075

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1038813/tms320f28075-sci-uart-stop-bit-discrepancy-not-detectable

器件型号:TMS320F28075

您好!

我将上述类型的两个微控制器的 SCI 外设配置为

  • 300位/秒的波特率
  • 8位数据长度
  • 无奇偶校验

但是、一个微控制器设置为一个停止位、而另一个微控制器配置为两个停止位。 当这两者在代码中相互通信时、在 RX ISR 中、错误处理就像这样完成

// RX Error
		if (SciaRegs.SCIRXST.bit.RXERROR == 1U)
		{
			// RX Break Detection
			if (SciaRegs.SCIRXST.bit.BRKDT == 1U)
			{
				// Handle error ... 
			}
			// SCI framing-error flag
			if (SciaRegs.SCIRXST.bit.FE == 1U)
			{
			    // Handle error ... 
			}
			// SCI overrun-error flag
			if (SciaRegs.SCIRXST.bit.OE == 1U)
			{
			    // Handle error ... 
			}
			// SCI parity-error
			if (SciaRegs.SCIRXST.bit.PE == 1U)
			{
			    // Handle error ... 
			}
			SciaRegs.SCICTL1.bit.SWRESET = 0U;
			SciaRegs.SCICTL1.bit.SWRESET = 1U;
			return;
		}
 

在2019年9月的手册第2164页、字段 FE 中、它说"SCI 在找不到预期的停止位时设置此位。 只有第一个停止位被检查。" 我无法看到、任何错误都会发生、通信也会双向工作。 我的代码是错误的还是这种错误情况不可检测?

一个停止位:

两个停止位:

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

    器件型号:TMS320F28075

    您好!

    在2019年9月的手册第2163页的字段 BRKDT 中、它说"SCI 在发生中断条件时设置该位。 当 SCI 接收器数据线(SCIRXD)持续保持低电平至少10位时、会发生中断条件"。 顺便说一下、这是一个粗心的错误。  

    代码处理 RX ISR 中的错误、如所示

    // RX Error
    if (SciaRegs.SCIRXST.bit.RXERROR == 1U)
    {
    	// RX Break Detection
    	if (SciaRegs.SCIRXST.bit.BRKDT == 1U)
    	{
    		// Handle error ... 
    	}
    	// SCI framing-error flag
    	if (SciaRegs.SCIRXST.bit.FE == 1U)
    	{
    	    // Handle error ... 
    	}
    	// SCI overrun-error flag
    	if (SciaRegs.SCIRXST.bit.OE == 1U)
    	{
    	    // Handle error ... 
    	}
    	// SCI parity-error
    	if (SciaRegs.SCIRXST.bit.PE == 1U)
    	{
    	    // Handle error ... 
    	}
    	SciaRegs.SCICTL1.bit.SWRESET = 0U;
    	SciaRegs.SCICTL1.bit.SWRESET = 1U;
    	return;
    }

    当我将 RX 连接到 GND 时、我会得到 FE 而不是 BRKDT。 如何触发 BRKDT?

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

    您好、Frank、

    感谢您的提问! 合并您的两个线程、因为我们将讨论与相关问题相同的代码。

    对于 BRKDT 问题、我的理解是、如果将 RX 连接到 GND、可能会导致低电平信号出现在有效字节的中间(假设正在传输值)。 这将导致在 BRKDT 之前出现 FE。

    关于停止位的第二个问题、停止位为高电平、因此从总线接收器的角度来看、停止位看起来与最后一个位传输后的空闲时间相同。 2个停止位允许字节之间有额外的空闲时间、但从接收器的角度来看、它知道传输已经结束(因为它接收到了停止位之前的最后一个数据位以及至少一个停止位) 但无法区分第一个停止位和正常空闲时间(因为空闲时间和停止位都是逻辑高电平)。

    请告诉我这是否能解答您的问题!

    此致、

    Vince

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

    尊敬的 Vince:

    感谢您的回答。

    BRKDT
    您能告诉我如何测试我的代码吗? 如何导致 BRKDT 错误? 我还尝试将 RX 连接到 GND 而不传输任何内容。 这不会导致 BRKDT、但在我的情况下会导致 FE。

    停止位
    这意味着、该微控制器中的 TI SCI/UART 外设无法检测是否接收到太少的停止位? 只要它捕获到第一个停止位的上升沿、它就永远不会抱怨? 还是意味着无论接收器配置为多少个停止位、我始终需要一个停止位。 您能帮我解决这个问题吗?

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

    您好、Frank、

    感谢您提出的澄清问题! 请参阅以下答案:

    [引用 userid="499467" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1038813/tms320f28075-sci-uart-stop-bit-discrepancy-not-detectable/3844172 #3844172]BRKDT
    您能告诉我如何测试我的代码吗? 如何导致 BRKDT 错误? 我还尝试将 RX 连接到 GND 而不传输任何内容。 这不会导致 BRKDT、但在我的情况下会导致 FE。[/报价]

    侧注: 我确实发现一点奇怪的是、根本不会发生 BRKDT 错误(我希望 FE -和- BRKDT、可能还有其他错误)、但我猜的是代码中的 if 语句的顺序导致它在清除错误之前永远不会到达 BRKT 检查。

    我建议仅导致中断检测、使用另一个器件(插入10位低电平的器件)首先发送有效字节。 然后、一旦发送有效字节、如果器件可配置为 C2000、则将器件输出更改为~10位的低逻辑电平(9.625以触发 BRKDT)。

    如果这仍然只会导致 FE、那么我的潜在建议是(不知道 if 语句中的内容):我们可能需要根据优先级重新安排 if 语句、或者可能会阻止清除错误、直到检查完所有 if 语句。

    [引用 userid="499467" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1038813/tms320f28075-sci-uart-stop-bit-discrepancy-not-detectable/3844172 #3844172"]停止位
    这意味着、该微控制器中的 TI SCI/UART 外设无法检测是否接收到太少的停止位? 只要它捕获到第一个停止位的上升沿、它就永远不会抱怨? 还是意味着无论接收器配置为多少个停止位、我始终需要一个停止位。 您能为我解决这个问题吗?

    考虑到 UART 协议如何对空闲时间位和停止位使用高逻辑电平、第一个和最后一个问题是正确的(我认为对于所有 UART 协议器件)。 但中间的问题不是真的。

    中间问题:

    [引用 userid="499467" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1038813/tms320f28075-sci-uart-stop-bit-discrepancy-not-detectable/3844172 #3844172"]只要它捕获到第一个停止位的上升沿、它就不会抱怨什么?

    必须至少检测到一个停止位、包括该停止位的实际脉冲、因此如果它仅接收到第一个停止位的上升后沿、它将进行投诉。 它必须至少接收到第一个停止位每位8个选通信号的2/3、否则将检测到错误。 《技术参考手册》"SCI 通信格式"部分中的图更好地进行了直观解释、但要检测到某个位、需要对该位的8个选通脉冲进行"多数票决"来确定某个位的值。 停止位包含在内、因此必须包含在整个帧中。 如果未检测到该高逻辑电平位、则会标记错误。 第二个停止位可能是空闲时间、也可能不是空闲时间、但通信的重要部分(数据)已成功接收、因为我们有数据的开始和结束。

    本质上、您仍然需要具有一个完整的1停止位最小值、否则您将在总线上遇到错误。 但第二个停止位实际上可以看作是在数据包之间插入了一个额外的空闲时间。 第二个停止位更多是发送器端配置、用于在接收器向该处理接收器发送另一个字节之前为接收器提供更多的处理时间、接收器端只是查找数据包。 额外的侧注:在大多数使用低速 UART 和高系统时钟速度的情况下、如果 SCI 中断没有执行任何"繁重"处理、则可能不需要1位的额外处理时间、这是它真正不应该执行的。

    如果我误解了您的问题、请告诉我、我将提供后续行动!

    此致、

    Vince

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

    尊敬的 Vince:

    BRKDT

    我是按照你所说的那样准确的。 我认为配置有误、或者 SCI 外设的工作方式与我预期的不同。 当 SciaRegs.SCIRXST.bit.RXERROR = 1U 时、在 RX ISR 中读取 SciaRegs.SCIRXST.all 寄存器。 寄存器值为208。

    因此、RXERROR、RXDY 和 FE 为高电平。 BRKDT 为低电平。 RX 上的波形如下所示:

    我发送"p"和"o"、之后 TX 线被复用到 GPIO 外设并被设定为低电平(50ms 对应于15位@ 300BD)。 您能否重现此问题并发现 BRKDT 不能像这样引起、或者告诉我在我的配置中它必须是错误的(我们在此谈谈我应该修复/理解 ATM 的非常旧的代码)? 因此、可能发生了 BRKDT 并在我意识到之前被清除。 除了清除它之外、没有其他方法

    SciaRegs.SCICTL1.bit.SWRESET = 0U;
    SciaRegs.SCICTL1.bit.SWRESET = 1U;

    有人在听吗?

    停止位

    很好。 感谢您的回答!

    编辑:

    因此、我声称我找到了问题。 问题是、FE 会引起中断、而导致 BRKDT 的条件总是会导致 FE 优先置位。 不幸的是、最简单的解决方案是、如果发生错误、我需要在产生的 SWI 中断中等待、以确定是否在10位后设置该标志。 您能确认这种行为吗、Vince?

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

    您好、Frank、

    感谢后续行动、我将与设计团队确认这是硬件中的实际行为、但我的直觉是、您按照您观察到的错误顺序正确无误。

    请允许我在 CST 星期一结束前回复您、我们的设计团队会对此做出回应。 我将告诉您他们是否需要更多时间进行验证。

    此致、

    Vince

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

    您好、Frank、

    模拟正在进行中、但所需时间比预期的要长、请等待周五进行额外更新。

    此致、

    Vince

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

    您好、Frank、

    感谢您的耐心! 通过仿真验证后、我们可以确认 FE 确实总是在 BRKDT 之前发生、但 RX 处于睡眠模式时除外。

    如果您有任何其他问题、请告诉我!

    此致、

    Vince