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.

[参考译文] TMS320F280025C:在多缓冲模式下读取 LINB 数据始终返回最后一个值。

Guru**** 2439560 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1045544/tms320f280025c-reading-linb-data-in-multibuffered-mode-always-returning-the-last-value

器件型号:TMS320F280025C
主题中讨论的其他器件:C2000WARE

我已经为8深度缓冲器配置了 SCI 模式下的 LINB、如下所示:

void LINB_configureSCIMode()
{
    //
        // Enter LIN reset state to perform configurations
        //
        LIN_enterSoftwareReset(LINB_BASE);

        //
        // Switch LIN into SCI mode
        //
        LIN_enableSCIMode(LINB_BASE);

        //
        // Set the SCI communication mode to idle line
        //
        LIN_setSCICommMode(LINB_BASE, LIN_COMM_SCI_IDLELINE);

        //
        // Set SCI to transmit one stop bit
        //
        LIN_setSCIStopBits(LINB_BASE,LIN_SCI_STOP_ONE);

        //Setting baud rate to 115200
        LIN_setBaudRatePrescaler(LINB_BASE,53,4);

        //
        // Disable parity check
        //
        LIN_disableSCIParity(LINB_BASE);

        //
        // Enable multi-buffer mode
        //
        LIN_enableMultibufferMode(LINB_BASE);
        //Enable Receive Data Transfer.
        LIN_enableDataReceiver(LINB_BASE);
        //
        // Module set to complete operations when halted by debugger
        //
        LIN_setDebugSuspendMode(LINB_BASE, LIN_DEBUG_COMPLETE);

        //
        // Set character length as 8-bits
        //
        LIN_setSCICharLength(LINB_BASE, 8);

        //
        // Set to 1 character in response field
        //
        LIN_setSCIFrameLength(LINB_BASE, 8);

        //
        // Disable Internal Loopback mode
        //
        LIN_disableIntLoopback(LINB_BASE);

        //
        // Disable interrupt for when a frame has been completely received
        //
        LIN_enableSCIInterrupt(LINB_BASE, LIN_SCI_INT_RX);

        //
        // Set the interrupt priority to line 0 (high)
        //
        LIN_setSCIInterruptLevel0(LINB_BASE, LIN_SCI_INT_RX);

        //
        // Exit LIN reset state
        //
        LIN_exitSoftwareReset(LINB_BASE);
}

以下代码用于从接收到的缓冲区中读取8个字节:

   if (LIN_isSCIDataAvailable(LINB_BASE))
    {
        char rx_buffer[10];
        int i = 0;
        for (i = 0; i < 8; i++)    //buffer is 8 byte deep
        {
            rx_buffer[i] = LIN_readSCICharNonBlocking(LINB_BASE, false);
        }
    }

但是、当我打印 RX_buffer 的内容时、将为所有索引打印最后接收到的字符的值。 请告诉我出错了。

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

    经过很多努力、我意识到我需要在缓冲模式下写入/读取 LINKTDx 和 LINRx 寄存器。 我使用了以下方法来实现缓冲区读取和写入:

    缓冲器读数:

    TEMP1=HWREGH (LINB_BASE+ LIN_O_RD0+2);
    TEMP2=HWREGH (LINB_BASE+LIN_O_RD0);
    temp3=HWREGH (LINB_BASH+LIN_O_RD1+2);
    temp4=HWREGH (LINB_BASH+LIN_O_RD1);

    缓冲器写入(用于回波测试):

    HWREGH (LINB_BASK+ LIN_O_TD0+2)=温度1;
    HWREGH (LINB_BASK+ LIN_O_TD0)=温度2;
    HWREGH (LINB_BASK+ LIN_O_TD1+2)=temp3;
    HWREGH (LINB_BASK+ LIN_O_TD1)=温度4;

    驱动程序库似乎没有用于读取和写入这些寄存器的函数。 如果我错了、请纠正我的问题。

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

    阿萨德

    驱动程序 API 随 C2000Ware 提供。 请在下面找到用于发送和接收数据寄存器的代码段:

    //*****************************************************************************
    //
    // LIN_sendData
    //
    //*****************************************************************************
    void
    LIN_sendData(uint32_t base, uint16_t *data)
    {
        int16_t i;
        uint16_t length;
        uint16_t *pData;
    
        //
        // Check the arguments.
        //
        ASSERT(LIN_isBaseValid(base));
    
        //
        // Get the length from the SCIFORMAT register.
        //
        length = (uint16_t)((HWREG_BP(base + LIN_O_SCIFORMAT) &
                              LIN_SCIFORMAT_LENGTH_M) >> LIN_SCIFORMAT_LENGTH_S);
    
        pData = data + length;
    
        //
        // Shift each 8-bit piece of data into the correct register.
        //
        for(i = (int32_t)length; i >= 0; i--)
        {
            if(pData != 0U)
            {
                HWREGB(base + LIN_O_TD0 + ((uint16_t)i ^ 3U)) = *pData;
                pData--;
            }
        }
    }
    
    //*****************************************************************************
    //
    // LIN_getData
    //
    //*****************************************************************************
    void
    LIN_getData(uint32_t base, uint16_t * const data)
    {
        uint16_t i;
        uint16_t length;
        uint16_t *pData = data;
    
        //
        // Check the arguments.
        //
        ASSERT(LIN_isBaseValid(base));
    
        //
        // Get the length from the SCIFORMAT register.
        //
        length = (uint16_t)((HWREG_BP(base + LIN_O_SCIFORMAT) &
                            LIN_SCIFORMAT_LENGTH_M) >> LIN_SCIFORMAT_LENGTH_S);
    
        //
        // Read each 8-bit piece of data.
        //
        for(i = 0U; i <= length; i++)
        {
            if(pData != 0U)
            {
                *pData = HWREGB(base + LIN_O_RD0 + ((uint32_t)i ^ 3U));
                pData++;
            }
        }
    }
    

    LIN_EX7_external_loopback 使用这些驱动程序函数、这些函数可作为开发用途的参考。

    谢谢、

    Aditya

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

    您好、Aditya、

       在我的问题中、我可能错过了在 SCI 模式下使用 LIN 的问题。 您想说我可以将 LIN 函数用于 SCI 多缓冲模式吗?

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

    您好、Asad、

    有 SCITD 寄存器和 SCIRD 寄存器、这些寄存器具有 driverlib 中可用的相应函数。 您可以检查 lin.h 文件以了解可用的函数。

    如果您需要说明、请告知我们。


    谢谢、

    Aditya

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

    您好、Aditya、  

      实际上、我的问题与读取缓冲 SCI 数据的函数有关。 我尝试使用函数"LIN_readSCICharNonBlocking"、但它始终返回缓冲器中的最后一个值。 据我了解、您的回复不建议使用一个函数来读取缓冲 SCI 数据。 如果您已经建议了一个与从 LIN 接口读取缓冲 SCI 数据相关的答案、请进行澄清。

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

    阿萨德

    让我清除 LIN 中的多缓冲器通信。 请检查从以下 TRM 获取的图像、了解如何在 mbuf 模式下接收数据:

    如前所述、对于 Mbuf 模式、将使用 LINRD0和 LINRD1。 可使用 LIN_sendData LIN_getData 函数来访问它们。 LIN_getData 函数中的 length 参数应考虑您突出显示的问题。  

    我们还有一个 C2000Ware 示例- LIN_ex3_sci_dma、其中展示了如何在 mbuf 模式下使用 DMA (不使用 LIN_ReadData () fn)读取数据。 此外、您还可以检查 LIN_ex4_loopback_Polling、以了解 LIN_sendData 和  LIN_getData 函数的用法。

    重申一下、这些函数也可以在 SCI 模式下使用。

    希望这对您有所帮助。

    谢谢、

    Aditya

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

    感谢您的澄清。