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.

LAUNCHXL-F28379D: SCITXBUF 和 TXBUF 是同一个寄存器么?

Part Number: LAUNCHXL-F28379D
Other Parts Discussed in Thread: C2000WARE

大家好,我看了说明书 TRM(Rev. H),感觉里面有很多部分讲的很不清楚。

首先,非常感谢您的耐心阅读,写的有点多,但是,确实是相互关联的问题,没办法拆分成多个小问题。

说明书全文中只有在章节19.13.1 SCI FIFO Description 中的第6点 Buffers,出现过TXBUF,其他地方都是SCITXBUF,所以,一直以来我都认为这两个是一个寄存器,但是,如果将这两个寄存器视为一个,在理解上又有很多矛盾点,所以,我才会有这么一个问题: SCITXBUF TXBUF 是同一个寄存器么?

(为了方便讨论,后面会将TXFIFO上方的称为TXBUF,下方的称为SCITXBUF,如下图所示)

根据TRM(Rev.H)图19-2 SCI模组框图可以看出,TX FIFO队列前有一个 SCITXBUF.7-0,TX FIFO之后有一个 transmitter-Data Buffer Register.

但是,说明书里SCITXBUF的名称也是:SCITXBUF — transmitter data buffer register (p.2093).  所以我很疑惑,这两个寄存器是指的同一个么?

根据 章节19.13.1 SCI FIFO Description 中 第6点 关于Buffer的说明:

“The one-word transmit buffer of the standard SCI functions as a transition buffer between the transmit FIFO and shift register”

上句可以确定,这个一字长的发送缓冲器 位于 TX FIFO和 TXSHF之间。

“ With the FIFO enabled, TXSHF is directly loaded after an optional delay value (SCIFFCT), TXBUF is not used. ”

当FIFO模式启用时,TXSHF直接(从TX FIFO中根据选定的延迟)装填数据,不使用TXBUF

所以,我认为的是,这个one-word transmit buffer就是特指TXBUF,而不是SCITXBUF.

而且,发送首先需要对SCITXBUF写入,我单步debug的时候, 在CCS Expressions里观察SCITXBUF的写入是先于 FFTXST加1的。

所以,我理解的是,SCITXBUFTXBUF不是一个寄存器,TX FIFO模式中,被越过的是TXBUF,但仍然必须通过对SCITXBUF写操作,才能发送。

而且,寄存器SCITXBUF先于TX FIFO进行装填的 (也就是说存在一个三级关系:SCITXBUF ->  TX FIFO -> (TXBUF )-> TXSHF)。

但是,接收器框图中在 RX FIFO队列的上下都是 SCIRXBUF.7-0,如果不存在RXBUFSCIRXBUF的区别,如果说接收是发送的逆过程,那么,SCITXBUFTXBUF又应该是一个寄存器。

与这个问题相关的是:

  •  到底是SCITXBUF还是TXBUF决定了TXRDY的值
  • TXEMPTY 发送器空标志位到底什么时候为0?

说明书中的框图19-2还有一个点让我很疑惑:

TXSHF延伸出指向TX EMPTY的箭头,是不是说明,其实,TX EMPTY只由TXSHF决定?

TXBUF延伸出指向TXRDY的箭头,是不是说明,其实,TX RDY只由TXBUF决定?

但是根据说明书描述的:

- 只要SCITXBUF或/与TXSHF中被装填了数据,那么TX EMPTY 标志位置0.

(原文: 0h (R/W) = Transmitter buffer or shift register or both are loaded with data; 1h (R/W) = Transmitter buffer and shift registers are both empty

问题:那就说明不只是TXSHF决定TXEMPTY,与框图所绘制的相互矛盾。还是第一个问题,到底是SCITXBUF还是TXBUF影响这一位?

- TXRDYSCITXBUF满时,被置0;SCITXBUF中的数据被移出后,被置1

(原文:0h (R/W) = SCITXBUF is full; 1h (R/W) = SCITXBUF is ready to receive the next character (SCITXBUF empty?))

问题: 我认为是TX FIFO队列前的SCITXBUF决定了TXRDY的值,而不是TX FIFO队列后的TXBUF, 因为如果是FIFO模式,TXBUF不会被使用,那么TXRDY的值也不应该受影响,但是,实际的实验中, HWREGH(base + SCI_O_TXBUF) = array[i]; 后, TXRDY会被置0

章节19.10.2中的图19-9所示的例子,又让我更加疑惑。

时刻1TXENA发送使能。

时刻2SCITXBUF被写入,此时TXRDY置0,同时TXEMPTY也应该置零,但是,上图中,TXEMPTY则是在时刻2与3之间置零的, 说明SCITXBUF被写入并没有影响TXEMPTY.

问题:这是真实会出现的吗,还是图示有错?  我自己实验时,只要SCITXBUF被写入,TXEMPTY就会置0。

时刻3SCI将数据移入TXSHF,所以,TXRDY置1,说明数据从SCITXBUF中被转移到TXSHF中,现在SCITXBUF为空,准备好接收第二个字符。

时刻4到时刻5之间:发送完第一帧的Pa位后,图中TXRDY置1说明,此时,第二个数据被装填到TXSHF中,SCITXBUF再次为空,准备好接收新字符。

问题:此时,第一帧的发送还没有结束,Stop还没发出,TXSHF非空,第一帧的发送未完成,此时,是否可以向TXSHF装填新的数据,从而如上图所示的,让TXRDY置1。

这里不知道有没有启用FIFO,但是根据FIFO模式的描述,只有当TXSHF完成了最后一位的发送,才能够向TXSHF进行装填。

不知道标准SCI是不是允许像上图所示的,可以在第一帧发送Stop位时,就装填新的数据,从而置位TXRDY

说明书里我没有找到相关内容。

感谢您的耐心阅读,望不吝赐教。

  • 额,内容有点多,我会向其他工程师咨询后再回复你。

  • 你好,SCITXBUF 和 TXBUF的问题还在确认,关于:

    到底是SCITXBUF还是TXBUF决定了TXRDY的值

    TRM中有关于TXRDY的描述:"When set, this bit indicates that the transmit data buffer register, SCITXBUF, is ready to receive another character. Writing data to the SCITXBUF automatically clears this bit. When set, this flag asserts a transmitter interrupt request if the interrupt-enable bit, TX INT ENA (SCICTL2.0), is also set. TXRDY is set to 1 by enabling the SW RESET bit (SCICTL1.5) or by a system reset"

    TXEMPTY 发送器空标志位到底什么时候为0?

    TRM中描述:"This flag's value indicates the contents of the transmitter's buffer register (SCITXBUF) and shift register (TXSHF)"

    一旦SCITXBUF或shift移位寄存器中没有内容,TXEMPTY就将被清除。

  • 您好, 非常感谢您的回答。

    提问前,我已经非常仔细地阅读过TRM,也进行了很多次试验,您说的关于这两个标志位的说明,我也阅读过很多遍了,之所以上面没有引用,是考虑到篇幅问题,所以,只引用了关于标志位取值的说明。问题在于 TRM中关于这两个标志位说明,跟框图19-2(也就是我帖子里用红色标记的部分),以及图19-9TXEMPTY第一次置零的时间点(时刻2),是相互矛盾的。

    • 说明中:TXEMPTY取决于TXSHFSCITXBUF的内容
    • 19-2中: TXEMPTY取决于TXSHF的内容(单箭头指向,与说明不符
    • 图19-9中: 在时刻2处,TXRDY已经置零了(说明此时SCITXBUF处于满状态),但是,TXEMPTY并没有置零(那就说明SCITXBUFTXRDY没有影响,与说明不符)。TXEPMTY是在时刻2与3之间置零的(说明是其他因素决定的TXEMPTY)。但是,TRM图19-9下方关于时刻2的说明,也是说TXEMPTYTXRDY应该同时被置零,应该与寄存器说明相符才对,然而,图19-9并不是这样的。

    我自己的实验结果:

    在TXFIFO模式下,第一次循环中, HWREGH(base + SCI_O_TXBUF) = array[i]; 之后,SciaRegs.SCITXBUF 中的值是我赋予的字符(下图‘1’),但是,此时TXEMPTY会置零(说明TXEMPTYSCITXBUF的影响,与图19-2以及19-9不符,与寄存器说明相符),而TXRDY保持为1(与寄存器说明以及图19-9都不符),并且TXFFST=0,表示TXFIFO队列中此时还没有word,也就是还没有从SCITXBUF将数据移入(证明在TXFIFO前,确实有一个过度缓冲器).

     (向SCITXBUF写入'1')

    在第二次循环中, HWREGH(base + SCI_O_TXBUF) = array[i];后,SciaRegs.SCITXBUF中的值会更新为第二个字符(下图‘2’),TXEMPTY保持为0,TXFFST=1,表示TXFIFO中有了一个word,同时TXRDY被置零(是不是说明TXRDY应该取决于TXFIFO的状态,而不是SCITXBUF,至少在我实验的FIFO模式下是这样的)。

     (向SCITXBUF写入'2')

    其实这个问题也是与我之前的,那个关于driverlib中SCI例子问题的帖子相关的。只有弄明白了这些标志位到底怎么变化的,我才好推断增强FIFO发送过程是一步一步是怎么进行的,才能解决SCI例子中 SCI_FF_TX16的那个问题。

    其实SCI_FF_TX16单独并不会造成问题,也许这也是TI没有在更新里修改的原因,因为单独使用SCI_writeCharArray()是完全没有问题的,不论while里使用的是SCI_FF_TX1-16中的哪一个,这里我不展开了,在我另一个帖子的更新里有对这个问题的进一步研究,请移步:

    https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/220213/launchxl-f28379d-sci-driverlib-tx-fifo

  • 额,说实话看完你的描述我非常建议你前往我们的英文E2E论坛去咨询一下相关问题,因为说实话中文论坛这边没有对SCI寄存器研究这么透彻的工程师,但英文论坛上有相关产品和模块的FAE和AE,甚至可以触达编写TRM的产品线BU,他们对这款芯片的TRM或者SCI模块非常了解,应该能更快地帮助你解决疑惑。你可以在下面的英文E2E论坛上发帖试试:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum

    由于论坛限制,发帖账户需要有公司邮箱进行注册,如果没有公司邮箱的话可以尝试申请一个钉钉邮箱。

  • 再次感谢,我去试试,如果有答案我会贴回这里的。

  • 我没有+86的手机号,试了钉钉不行,我自己工作的学校邮箱也不算公司邮箱,同事说去年我们学校邮箱的还可以提问的。算了,我再想想办法把。

  • 您好, 我看到您在英文论坛帮我询问过SCITXBUF以及TXBUF的区别了. 非常感谢.

    我看到 Marlyn 最新的回复说:

    "The 'TXBUF' mentioned throughout the TRM refers to the Transmit Data Buffer Register. See diagram below. This is all internal to the device. The references you listed that refer to TXBUF are explaining that when FIFO mode is used, TXBUF is not really used as its not serving as one additional level of buffer where you can write data to. "

    是指的这个TXBUF设备内部的,用户是没有访问权限,对吗? 我们能够访问的实际上只有TX FIFO队列下方的SCITXBUF,是不是说明这两个确实不是一个东西,(如果不将TXBUF称为是寄存器的话)?

    还有关于TXRDY标志位的那个问题,我又试了一下C2000Ware里面 sci_loopback_interrupt 的那个例子。

    我可以确认,至少在 FIFO 模式下, TXRDY绝对不是由SCITXBUF决定的,而是 TX FIFO队列的第15,即,最先被装填的那一层。

    TX FIFO_15 如果为空,那么TXRDY就是1,否则为0. 但是,确实也对应着说明书里SCITXBUF准备好接受新字符这个说明(因为TX FIFO_15 空出来了)。

    此时,再次对SCITXBUF写入,新字符进入SCITXBUF,而之前SCITXBUF里面的字符回移入TX FIFO_15,TXRDY会被置0同时TXFFST会加1。

    这个我是通过TXFFINT以及RXFFINT中断以及TXFFST标志位确认的。

    因为,例子中TXFFIL即发送中断深度设置为2,也就是当TXFIFO中少于等于两个words时,就会置位TXFFINT,请求中断,如果中断被允许,

    在发送中断服务里,会向再向TX FIFO连续填入两个words,TXFFST从2变成4,人工清空中断标志位TXFFINT之后,不会再触发发送中断(因为此时TXFFST>TXFFIL),而是会返回主程序的for循环。与此同时,如果没有触发读取中断的话(也就是说TX FIFO中的4个words正在向着队列顶端移动,但还没有任何word被移出队列,即TXFFST保持为4),那么最下方的TX FIFO_15会空出来,此时,TXRDY会从0置1,直到新的发送中断服务被生效,TXFFINT ISR向SCITXBUF再写入新字符,这个字符再填入TX FIFO_15之后,TXRDY才会再次置零。

    再次感谢,我有时间会继续研究这个FIFO的机制的,虽然没什么大用,但是,就是好奇。

  • 这个Transmit Data Buffer Register确实也挺绕的,我也没看明白到底有什么关系。。。

  • 总之非常感谢. 我接受答案啦.

  • 最后想贴一个我自己目前为止推测的FIFO结构,是利用 sci_loopback_interrupt 推测的

    sData,rData是用户自己定义的发送接收缓冲器.

  • 我看到的TRM上描述的SCITXBUF的描述也是

    SCITXBUF — transmitter data buffer register. Contains data (loaded by the CPU) to be transmitted

    没看出来跟Marlyn图上标的具体有什么区别,我再追问一下。英文E2E链接贴给你:

    e2e.ti.com/.../tms320f28379d-question-about-scitxbuf-and-txbuf-register-in-sci-module

  • 谢谢,

    TXBUF 是特指TX FIFO队列后面的那个 The one-word transmit buffer , 根据他的回答,应该是一个器件内部缓冲器(如果我没理解错的话),用户无法访问

    "The one-word transmit buffer of the standard SCI functions as a transition buffer between the transmit FIFO and shift register. " (p.2101, 19.13.1 6.Buffer)

    SCITXBUF 才是 我们写入的 Transmit data buffer.

    然后,能确定 SCITXBUF对TXEMPTY的有作用,至于TXSHF有没有就不知道了,没办法读取TXSHF. 

    能确定 SCITXBUF 对TXRDY没作用.

    虽然,还是没办法解决 SCI_FF_TX16的那个问题, 但也差不多了,在这上面耗太久了,以后遇到别的例子,多谢参考可能就能搞明白吧

    感谢.

  • 他们回复啦,我看到真实的框图了

    所以TRM里面那个完全就是错的。我们之前讨论的那个TXBUF其实是与 TX FIFO平行的,而不是像TRM图里是串行的,而且标志位也不是像TRM里面画的那样,这个8位寄存器不影响TXRDY(根据我的试验,TXRDY也不受SCITXBUF的影响,不过无所谓了,已经算是解决我大部分的疑惑了)。接收器框图TRM也是错的。TXBUF甚至不配拥有姓名。我以后就叫它 8 了, TX 8 和 RX 8.

    谢谢啦!

    (补充: 根据图示的TX RX FIFO 旁边这个 8 好像就只是一个8位的通路而已,不是什么寄存器,TXSHF在标志SCI模式下,看着像是与SCITXBUF直连的,所以压根TXBUF就不存在,在TX FIFO旁边和后边其实没有这么一个8位寄存器)

  • 好吧,也感谢你这几天来的测试帮助!

    TRM上有些表述确实有问题,错误也经常有。

  • 可以理解, 毕竟那么多模组,每个模组那么多寄存器,每个寄存器那么多位,2000+页. 有错也是难免的.

    感谢.

  • 嗯嗯,客气了!