代码之家  ›  专栏  ›  技术社区  ›  Max Kielland

dsPIC33EP256MC506 Uart TRMT在中断时不为空

  •  0
  • Max Kielland  · 技术社区  · 1 年前

    所以我使用dsPIC33EP256MC506和它的一个UART进行通信(9600,8,N,2)。当Tx移位寄存器为空(TRMT=1)时,我需要获得一个中断。通过将UTXSEL位设置为:

    USTAbits.UTXISEL0 = 1;
    USTAbits.UTXISEL1 = 0;
    

    根据数据表UxSTA bit 15,13 UTXISEL[1:0]:=01

    11 = Reserved; do not use
    10 = Interrupt when a character is transferred to the Transmit Shift Register (TSR) and as a result,
         the transmit buffer becomes empty.  
    01 = Interrupt when the last character is shifted out of the Transmit Shift Register; all transmit
         operations are completed.  
    00 = Interrupt when a character is transferred to the Transmit Shift Register (this implies there
         is at least one character open in the transmit buffer).
    

    我知道上面写着“…当最后一个角色 移出。。。这意味着移位寄存器不是空的。另一方面,它还说“。。。 所有传输操作 完成。”,这意味着移位寄存器应该是空的。

    然而,当中断触发时,FIFO为空,TRMT=0。因此,仍有一项轮班工作在进行中。

    TRMT: Transmit Shift Register Empty bit (read-only)
    1 = Transmit Shift Register is empty and transmit buffer is empty (the last transmission has completed)
    0 = Transmit Shift Register is not empty, a transmission is in progress or queued
    

    在我的示波器上,中断似乎是在停止位中的某个位置触发的。

    我看不出模式10和01之间的实际区别,当移位寄存器中有数据时,两者都会中断。 有人能解释/确认这是否是另一个Microchip错误,或者模式10和01之间的实际区别是什么吗。

    我真正需要的是知道最后一个停止位何时离开移位寄存器。

    谜团解开
    这是一个硅错误,勘误表中提到了它。

    当使用UTXISEL<1:0>=01(最后一个字符移位时中断 从传输移位寄存器中取出),并且最终字符是 通过传输移位寄存器(TSR)移出,传输 (TX)中断可能在最后一位被移出之前发生。

    1 回复  |  直到 1 年前
        1
  •  0
  •   pmacfarlane    1 年前

    我想你可以把它看作一个两字节的缓冲区。

    第一个字节是“传输缓冲区”,软件可以直接写入(当它为空时)。第二个字节是移位寄存器,它从“传输缓冲区”读取字节并将它们移位到导线上。

    10 模式告诉传输缓冲区现在是空的(您可以向其中写入其他内容),因为一个字节刚刚被移动到移位寄存器中。

    01 模式告诉移位寄存器何时被清空,即整个字节现在都在连线上。

    当停止位在线路上被驱动时,您可以获得中断,因为停止位不是移位寄存器中数据的一部分。所有数据都已移出。就MCU而言,停止位是“元数据”。

    感觉就像我只是用不同的语言重述了你说的话。但这对我来说是有道理的,所以不确定哪一部分让你感到困惑。

        2
  •  0
  •   Clifford    1 年前

    我知道上面写着“…当最后一个字符被移出时…”这意味着移位寄存器不是空的。另一方面,它还说“…所有传输操作都完成了。”这意味着移位寄存器应该是空的。

    这似乎是一个理解问题。你为什么这么认为 “当最后一个字符 移出” 意味着寄存器不是空的?这意味着 确切地 你甚至用示波器注意到了这一点。

    然而,当中断触发时,FIFO为空,TRMT=0。因此,仍有一项轮班工作在进行中。

    仅在模式10中是如此。

    我看不出模式10和01之间的实际区别,当移位寄存器中有数据时,两者都会中断。 在模式01中,当移位寄存器为空时,中断发生。在模式10中,FIFO为空

    您将使用模式10b来指示FIFO为空,并允许您加载缓冲区以在没有字符间间隙的情况下流式传输数据。

    例如,在禁用UART或进入低功率模式或发布软件重置之前,您可以使用模式01b来指示所有数据都已传输。或者,如果您需要在字符输出和其他I/O事件之间进行精确的定时/同步,例如,您可能正在与某个带有芯片选择控件的设备通信,该控件需要一直保持到完成。

    在大多数情况下,您希望使用模式10b,加载FIFO直到 UTXBF ,然后在模式10b中断上重复。