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.

[参考译文] TL16C750E:RX 缓冲器读取问题

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1019065/tl16c750e-rx-buffer-read-issue

器件型号:TL16C750E

我很难让 TL16C750E UART 正确读取数据。  
问题似乎出在内部缓冲区中。

背景:
测试代码正在将器件初始化为在非 FIFO 轮询模式下运行、奇偶校验位代码控制9位数据运行。
如果以下初始化顺序不正确、请告诉我如何纠正它:

复位(50us 高脉冲)
LCR <- 0xBF
EFR <-- 0x10
LCR <-- 0x83
DLH <-- V1 ----+
dll <-- V2    |-->1M 波特
DLF <-- V3 ----+
LCR <-- 0xBF
EFR <-- 0x00
LCR <-- 0x03    
IER <-- 0x00
FCR <-- 0x00

一个独立的电路板以低速率发送递增(1)字节值(9位数据)(所以运行时数据没有问题)、并且它的代码一直首先启动。
在上述初始化之后、TL16C750E 测试代码向该电路板发送一个值以触发它开始发送其慢速数据、然后轮询 LSR 的位0、查找新接收到的字节:


读取 LSR、直到 THR 空为真。
MCR <-- 0x02  (/DTS 和/RTS 输出驱动 LED)
LCR <- 0x2B (通过代码控制的奇偶校验位传输9位数据)
THR <-触发响应的数据
count=0 log 检测接收到的新字节

永久循环:
 读取 LSR 直到"接收器中的数据"位=1
 如果为 true
  递增计数
  读取数据字节的 RHR
  如果 数据>0
    记录数据
    记录 count 的值
  字节序
 字节序
死循环结束

我在日志结果中看到的是:
真正 的数据直到读取128个字节后才开始。  注意: LSR" 接收器中的数据"位每次都正确更新。
    前64位始终为0x00、后64位不正确、第二64位的第一个字节关闭、例如、当真实数据为0x05时、0xC5在后续字节上从0xC5递增。

2.如果另一个电路板的起始值发生更改、则第128个读取值在以下情况下才正确:
   a:TL16C750E 测试代码运行两次
   b.对 TL16C750E 电路板进行下电上电。


目的是让 UART 在非 FIFO 的轮询模式下运行,因此根据数据表:"如果 FIFO 被禁用,FIFO 的位置0被用来存储字符"(第9.2.2节)
但存储和读取内部指针似乎仍然使用整个128字节 FIFO、而不是仅使用位置0来存储和读取数据。

提前感谢您的帮助。

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

    您好 KR、

    今天、我将更深入地了解这一点、并返回给您。

    -Bobby

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

    谢谢 Bobby。

    另一个信息是我们以全双工方式运行 UART 接口。

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

    KR 您有我们可以查看的原理图吗?

    器件的 MODE 引脚如何偏置?

    -Bobby

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

    Bobby、

    该模式被拉至 Vcc。

    (笑声)

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

    KR、

    引脚排列看起来不错(与数据表引脚排列相匹配)。

    网络名称也与原理图引脚名称相匹配。

    Vcc 上的局部去耦电容器看起来不错。

    设置为 Vcc bias 的模式是我所期望的{这就是我们所说的英特尔模式}。 (我之前曾使用过此器件、但当我在仍使用 Vcc 偏置模式的情况下意外地将模式设置为 GND 时遇到问题、然后看到字节发生变化、因此我担心您会看到类似的情况。)

    原理图对我来说没问题、唯一的小问题是某些 RS485/RS232输入(如 CTS 和 DSR)是浮动的、因此由于这些引脚的输入 CMOS 级上的击穿电流、您将获得一些额外的泄漏。

    ----------------------------------------

    1) 1)您是否对此器件进行了回路测试? (将 TX 短接到 RX 并读取您发送的内容)

    2) 2)发送字节时、您能否探测 RX 引脚并验证您是否看到了预期结果? (可能显示其范围)

    3) 3)您能否测量器件 TX 引脚上的位周期并将位周期与单独电路板的 TX 进行比较、以确保波特率不会太不匹配?

    4) 4)当您初始化寄存器时、是否在写入后执行寄存器读取以验证数据是否正确写入寄存器?

    5) 5)初始化序列检查

    复位(50us 高脉冲)
    LCR <- 0xBF //8位2停止位奇偶校验、偶数强制奇偶校验除数访问被启用//此设置为进入 EFR 访问
    EFR <- 0x10 //启用对 IER[7:4] FCR [5:4]和 MCR[7:5]的访问 //完成此操作可访问 DLF
    LCR <- 0x83 // 8位2停止位除数仍然启用
    DLH <-- V1 ----+
    dll <-- V2    |-->1M 波特
    DLF <-- V3 ----+
    LCR <- 0xBF //8位2停止位奇偶校验校验、偶数强制奇偶校验除数访问被启用//此设置为进入 EFR 访问
    EFR <-- 0x00 //关闭对特殊寄存器的访问并设置 RTS 和 CTS 的正常操作
    LCR <-- 0x03   // 8位2停止位
    IER <- 0x00 //禁用 INT (根据原理图不使用 INT、如果这样做、则轮询是通过 LSR 检查 INT 的方法)
    FCR <- 0x00 //DMA0模式、FIFO 被禁用

    "一个独立的电路板以低速率发送递增(1)字节值(9位数据)(所以运行时数据没有问题)、并且它的代码总是首先启动。"

    只需再次确认、LCR 值具有8位数据加上2个停止位和一个起始位、因此总字节格式为11位。 您提到的9位是否有拼写错误?

    -Bobby

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

    感谢您的回复 Bobby。

    你的模式引脚偏置错误: 我们都去过--我们中的一些人至少两次:-)

    项目1->3:接收器输入信号正常。

    在 TL16C750E 被初始化并且触发 cmd 字节被发送后、另一个电路板获得 cmd 并且一直发送递增的应答字节(目前从0x07开始)。  在 LSR 位0检查检测到650字节并存储 RHR 的后续读数 后、TL16C750E 代码当前停止(与值无关)。  日志显示发送的第一个字节(0x07)的正确值、是 RHR 的第128次读操作中的值。 所有后续数据都是正确的-第129次读取时为0x08、第130次读取时为0x09等  如果波特率或停止位中有任何关闭、UART 将永远不会正确读取如此多的字节。  因此、字节在那里、只是 RHR 指针位于错误的位置。

    项目4: 好建议----感谢提醒"信任但核查"。  

    结果:除了 FCR、所有寄存器验证都正常。  其使能 FIFO 位0在写入0x00时清零、但读取的值为0x01。  数据表显示 FCR 是一个只写寄存器、因此读取结果最好是有问题的。  但是、0x01读取确实对应于看似仍然有效的 FIFO。  同样、根据我在数据表中的理解、在初始化时应禁用 FIFO、并且只应填充 FIFO 索引[0]并随后从中读取。  该器件的运行方式与第一个存储在 Rx FIFO 索引[0]中类似、第一次从 Rx FIFO 索引[1]中读取、在后续字节接收时、存储指针和读取指针都从那里递增。

    项目5:我的排印错误。  对于8位数据和1个停止位、LCR (在 EFR <- 0x00之后)实际上被初始化为0x2B、并且对奇偶校验位的初始控制以生成9位数据。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="492714" URL"~/support/interface-group/interface/f/interface-forum/1019065/tl16c750e-rx-buffer-read-issue/3770389 #3770389">除 FCR 外、所有寄存器验证均正常。  其使能 FIFO 位0在写入0x00时清零、但读取的值为0x01。  [/报价]

    因此、这意味着 FIFO 在读取时被绝对禁用。 当您读取地址0B010时、它会显示 IIR 以及 IIR 的位7和位6反映 FCR 位0值。 您正在读取的0x01h 意味着存在一个确认的 INT、我假设我们忽略它、因为 INT 未在您的设置中使用。

    我可能需要查看我是否可以为器件获取其中一个 EVM、并尝试通过尝试执行初始化步骤来复制您看到的内容。 我将在星期五通知您、我是否能够获得 EVM 的暂停。

    顺便说一下、问题的可重复性如何? 您是否仅使用一个电路板/单元进行了测试? 问题是否出在设备上? 您是否已将"坏电路板"替换为新器件以查看问题是否再次出现?  

    -Bobby

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

    该问题看起来可以解决。  

    读取 UART 的器件在其读取中存在一些缓冲问题。  该程序实际上正在进行几次物理读取以获得一个读取。  现在读数看起来更好、更有用、但仍然有一个小的神秘。  如果 FIFO 使用被禁用、那么内部指针不应该总是从 FIFO[0]中读取、正如数据所示?

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

    尊敬的 KR:

    很高兴看到您能够解决该问题。  

    [引用 userid="492714" URL"~/support/interface-group/interface/f/interface-forum/1019065/tl16c750e-rx-buffer-read-issue/3772504 #3772504"]现在的读数看起来更好且可用,但仍有一个小秘密

    是否更好地意味着问题已完全消失、或者在最终获得预期字符之前、您仍然看到几个0x00h?

    [引用 userid="492714" URL"~/support/interface-group/interface/f/interface-forum/1019065/tl16c750e-rx-buffer-read-issue/3772504 #3772504"]如果 禁用 FIFO 使用,则内部指针不应始终从 FIFO[0]读取数据,因为数据指示?

    是的、如果 FIFO 被禁用、您应该从该寄存器中读取数据。

    -Bobby

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

    我想现在我们可以宣布胜利。  

    TL16C750E 由一个并行端口外设与一个真正的并行端口驱动、并且被缓冲。   测试代码读取两次以从引脚到程序代码中获取值。  两次读取都会产生物理总线周期。 两个(与之前的太多)读取技术正常工作、但我认为最终版本会将第二个读取更改为使用超出 UART 范围的地址、以防读取 RHR 两次会导致不可预见的问题。

    在此阶段没有 FIFO、但如果稍后使用 FIFO、则此类单次物理读取可能是最好的。  如果稍后在使用 FIFO 时遇到问题、我将重新发布。

    再次感谢 Bobby 的所有帮助。