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:将 LIN 用作 UART 以串行方式发送数据

Guru**** 2394305 points
Other Parts Discussed in Thread: TMS320F280025C, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1273686/tms320f280025c-using-lin-as-uart-to-serially-transmit-data

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

大家好、

我正在使用 TMS320F280025C 微控制器、并想使用 LIN A 在串行终端上发送数据缓冲器(我正在使用清除终端)。

为此、虽然我只需要传输功能、但我已经配置了 GPIO 22 (LIN A TX)和 GPIO 23 (LIN A RX)并使用外部 FTDI 将其连接到 PC。

由于我是该微控制器的新手、因此我发现 TRM 中给出的信息非常令人困惑。 我还参考了 C2000Ware 中提供的一些示例:

"C2000Ware_5_00_00_00\driverlib\f28002x\examples\lin\lin_ex3_sci_dma.c"
"C2000Ware_5_00_00_00\driverlib\f28002x\examples\LIN\LIN_EX7_external_loopback.c"
"C2000Ware_5_00_00_00\device_support\f28002x\examples\dma\dma_ex1_gsram_transfer.c"

上述示例无法为我提供 所需的答案。

对于初学者、我只想在  SCI 模式下使用 LIN 模块在终端中打印简单的字符数据(例如、"Hello world")。 我不确定是否可行、请告诉我。

此外,我想知道我们何时使用函数"LIN_sendData ();"和"LIN_writeSCICharBlocking ();"

谢谢

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

    尊敬的 Mahesh:

    感谢您的提问。

    要首先回答有关打印的关键问题、您好!我建议先从 C2000Ware 中的"lin_ex2_sci_loopback.c"或"lin_ex7_external_loopback.c"示例开始。 具体来说、外部环回非常接近"Hello World"示例。

    您可以修改 EX7_external_loopback 示例、使其不需要 RX 中断。 因此、基本而言、您可以在这里完全禁用中断。 然后您只需在主函数的"for loop"内添加"lin_writeSCICharBlocking"。

      

    第二、LIN 外设使用入门时遇到的困惑。 所以、如果您对开始使用 C2000完全不熟悉、可以访问 C2000 Academy 培训、特别是 SCI 实验室(SCI 与 SCI 模式下的 LIN 外设非常相似、因此很多学习内容对两者都有帮助): https://dev.ti.com/tirex/explore/node?node=A__AQzGVO2iy7.Q8lS7.6gUow__C2000-ACADEMY__3H1LnqB__LATEST

    这是相当不错的入门详细介绍。

    此外、像您一样浏览 C2000Ware 示例并让它们运行可能是 Academy 之外的最佳培训。

    最后介绍 TRM 中的寄存器描述。 这将帮助您了解外设中可能存在的一切、并且是深入了解器件的好方法。

      

    有关您的问题

    "lin_sendData ();"和"lin_writeSCICharBlocking ();"

    名称中包含"SCI"的函数主要用于 SCI 模式。 SCI 模式是基本 UART 通信。 LIN 模式是功能齐全的 LIN 协议、每个数据包具有多个字节。 我建议像您所做的那样从 SCI 模式开始。

    此致、

    文斯

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

    您好、Vince。

    感谢您的答复。

    正如您建议的那样、我浏览了  C2000Ware 中的"lin_EX7_external_loopback.c"示例。 此示例在 LIN 模式下工作、而不是在 SCI 兼容模式下工作、但它确实有助于我更好地了解 LIN 模块。 现在我有一个部分可正常工作的代码、但打印在终端上的字符不符合预期。

    调试后、我能够观察到发送缓冲区(SCITD)中的正确数据、但在终端中接收到的数据损坏。 我假设这与发送器移位寄存器(SCITXSHF)有什么关系。

    我随附了代码以及寄存器和终端窗口的屏幕截图、以供您参考。

    //
    // Included Files
    //
    #include "driverlib.h"
    #include "device.h"
    #include "string.h"
    
    //
    // Defines
    //
    #define CHAR_LENGTH     8
    #define FRAME_LENGTH    1
    
    //
    // Configure the Baud Rate to 115.207kHz
    //
    uint32_t PRESCALER=0x000001a;
    uint16_t DIVIDER=0x0002;
    
    //
    // Globals
    //
    uint16_t data[] = {'H','e','l','l','o',' ','W','o','r','l','d'};
    uint16_t i;
    
    //
    // Function Prototypes
    //
    void configureSCIMode(void);
    
    //
    // Main
    //
    void main(void)
    {
        uint16_t len = strlen(data);
    
        //
        // Initialize device clock and peripherals
        //
        Device_init();
    
        //
        // Initialize GPIO and configure GPIO pins for LINTX/LINRX
        //
        Device_initGPIO();
    
        //
        // Initialize PIE and clear PIE registers. Disables CPU interrupts.
        //
        Interrupt_initModule();
    
        //
        // Initialize the PIE vector table with pointers to the shell Interrupt
        // Service Routines (ISR).
        //
        Interrupt_initVectorTable();
    
        //
        // Configure GPIO pins.
        //
        GPIO_setPinConfig(DEVICE_GPIO_CFG_LINTXA);
        GPIO_setDirectionMode(DEVICE_GPIO_PIN_LINTXA, GPIO_DIR_MODE_OUT);
        GPIO_setPadConfig(DEVICE_GPIO_PIN_LINTXA, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(DEVICE_GPIO_PIN_LINTXA, GPIO_QUAL_ASYNC);
    
        //
        // Initialize the LIN module
        //
        LIN_initModule(LINA_BASE);
    
        //
        // Enable Global Interrupt (INTM) and real time interrupt (DBGM)
        //
        EINT;
        ERTM;
    
        //
        // Configure the LIN module to operate in SCI mode
        //
        configureSCIMode();
    
        for(i=0;i<len;i++)
        {
            //
            // Write data to Tx Buffer of LINA
            //
            LIN_writeSCICharBlocking(LINA_BASE, data[i]);
    
            //
            // Wait until Transmit buffer is empty and has completed transmission
            //
            while(!LIN_isTxBufferEmpty(LINA_BASE));
    
            DEVICE_DELAY_US(10000);  //10ms delay
        }
    
        //
        // Example completed.
        //
        asm("   ESTOP0");
    }
    
    //
    // Configure SCI Mode - This function configures the LIN module to operate as
    // an SCI with the specified settings.
    //
    void
    configureSCIMode(void)
    {
        //
        // Enter LIN reset state to perform configurations
        //
        LIN_enterSoftwareReset(LINA_BASE);
    
        //
        // Enable Transmit Data Transfer.
        //
        LIN_enableDataTransmitter(LINA_BASE);
    
        //
        // Switch LIN into SCI mode
        //
        LIN_enableSCIMode(LINA_BASE);
    
        //
        // Set the SCI communication mode to idle line
        //
        LIN_setSCICommMode(LINA_BASE, LIN_COMM_SCI_IDLELINE);
    
        //
        // Set SCI to transmit one stop bit
        //
        LIN_setSCIStopBits(LINA_BASE,LIN_SCI_STOP_ONE);
    
        //
        // Disable parity check
        //
        LIN_disableSCIParity(LINA_BASE);
    
        //
        // Disable multi-buffer mode
        //
        LIN_disableMultibufferMode(LINA_BASE);
    
        //
        // Module set to complete operations when halted by debugger
        //
        LIN_setDebugSuspendMode(LINA_BASE, LIN_DEBUG_COMPLETE);
    
        //
        // Set character length as 8-bits
        //
        LIN_setSCICharLength(LINA_BASE, CHAR_LENGTH);
    
        //
        // Set to 1 character in response field
        //
        LIN_setSCIFrameLength(LINA_BASE, FRAME_LENGTH);
    
        //
        // Set the Baud Rate
        //
        LIN_setBaudRatePrescaler(LINA_BASE, PRESCALER, DIVIDER);
    
        //
        // Exit LIN reset state
        //
        LIN_exitSoftwareReset(LINA_BASE);
    }
    
    //
    // End of File
    //

    请告诉我您对此问题的看法。

    同时、感谢您回答另一个问题。 我还想知道 在 LIN 的 SCI 兼容模式下发送和接收的数据是 FIFO 格式还是 LIFO 格式?

    谢谢。此致、

    马赫什

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

    尊敬的 Mahesh:

    看起来 LIN 正在发送8位字、但终端需要16位字(注意终端中的每个字节是如何包含"F"的)。 您可以展示您的终端设置吗?

    此致、

    文斯

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

    您好、Vince。

    以下是您请求的终端设置。

    除此之外、显示模式暂时设置为"hex"。 如果您有任何其他需要、请告诉我。

    此外,如果你能回答我先前的答复中的问题,也是很好的:

    我还想知道 在 LIN 的 SCI 兼容模式下传输和接收的数据是采用 FIFO 格式还是 LIFO 格式吗?

    此致、

    马赫什

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

    Mahesh

    预分频器和分频器不正确。

    根据代码中的 P/M 值、实际波特率为230414。

    要获得115207的波特率、可能需要将更改为:

    P=0x35        =>(十进制=53)

    M=0x4          ==(十进制=4)

    请仔细检查波特率计算、谢谢!

    此致、

    文斯

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

    您好、Vince。

    这解决了我的问题。 非常感谢。 您提到过、存在波特率计算错误。 我假定 LIN 模块的输入时钟为50MHz、因此出现故障。 我的代码现在正常运行。

    谢谢。此致、

    马赫什