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.

[参考译文] TMS570LC4357:基于 SCI 协议的通信

Guru**** 2468460 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1072839/tms570lc4357-sci-protocol-based-communication

部件号:TMS570LC4357
“线程:HALCOGEN”中讨论的其它部件

在 TMS570LC43xx 的 HALCoGen 示例中,通过 SCI 传输数据时,先验证繁忙状态,然后通过科学发送字节函数传输字节。 以下是从示例中获取的代码:

  • 同时(((UART -> FLR & 0x4)=4);/*等待忙*/
  • 科学发送字节(UART,*文本++);     /*发送文本  */

我有三个与此相关的问题:

  1. 而((UART->FLR & 0x4)=4)行检查 SCI 标志寄存器(SCIFLR)的状态。 由于寄存器逻辑上是用0x4进行 AND 运算的,因此它应该从32位寄存器中检查第3位。 现在看一下寄存器,第三位是“空闲”,用于检查 SCI 接收器是否处于空闲状态。 我在这里的问题是,为什么我们需要在从 SCI 传输数据时检查接收器状态? 此外,该注释显示为“等待直到忙”。 从寄存器配置来看,总线占线标志是第4个,因此,如果这是为了检查,我们是否应该用0x8逻辑上不会这样做?
  2. 我们是否应该检查“总线繁忙”标志或“总线繁忙”标志以及“Txbuf 空”标志?
  3. 我们可以使用 UINT32科学研究(科学研究* 科学)还是 UINT32科学研究(科学研究*科学)或 UINT32科学研究( 科学研究* 科学研究),而不是在((UART ->消除和0x4)=4时编写;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,“苛刻”,

    [引用 userid="488031" url="~ë/support/icls/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1072839/tms570lc4357-sci-protocol-based communication’],而((UART->FLR & 0x4)==4)用于检查 SCI 标志(基于协议的通信)行的状态。 由于寄存器逻辑上是用0x4进行 AND 运算的,因此它应该从32位寄存器中检查第3位。 现在看一下寄存器,第三位是“空闲”,用于检查 SCI 接收器是否处于空闲状态。 我在这里的问题是,为什么我们需要在从 SCI 传输数据时检查接收器状态? 此外,该注释显示为“等待直到忙”。 从寄存器配置来看,总线占线标志是第4个,因此,如果这是检查的目的,那么我们是否应该使用0x8进行逻辑检查?

    SCI 接收器和 SCI 发射器可以在全双工模式下分别独立或同时操作。 我的理解是,在传输消息之前,您不需要检查空闲和忙碌位。  

    [引用 userid="488031" url="~ë/support/icls/arm-based 微处理器组/基于 ARM 的微处理器/f/arm-based 微处理器- forume/1072839/tms570lc4357-sci-protocol-based communication’]我们是否应该仅检查总线占线标志或总线占线标志以及 Txbuf/空?[引用以下两个]

    我认为在 TXing 之前不需要检查是否繁忙。

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

    HALCOGen 生成的函数 “科学数据发送字节”在 发送 字节之前已等待,直到传输缓冲区为空:

    /* SourceId : SCI_SourceId_005 */
    /* DesignId : SCI_DesignId_005 */
    /* Requirements : HL_CONQ_SCI_SR9 */
    /** @fn void sciSendByte(sciBASE_t *sci, uint8 byte)
    *   @brief Send Byte
    *   @param[in] sci  - sci module base address
    *   @param[in] byte - byte to transfer
    *
    *   Sends a single byte in polling mode, will wait in the
    *   routine until the transmit buffer is empty before sending
    *   the byte.  Use sciIsTxReady to check for Tx buffer empty
    *   before calling sciSendByte to avoid waiting.
    */
    void sciSendByte(sciBASE_t *sci, uint8 byte)
    {
    /* USER CODE BEGIN (9) */
    /* USER CODE END */
    
    	/*SAFETYMCUSW 28 D MR:NA <APPROVED> "Potentially infinite loop found - Hardware Status check for execution sequence" */
        while ((sci->FLR & (uint32)SCI_TX_INT) == 0U) 
        { 
        } /* Wait */
        sci->TD = byte;
    
    /* USER CODE BEGIN (10) */
    /* USER CODE END */
    }

    我认为这意味着该示例不需要 while ((UART->FLR & 0x4)== 4)循环。