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.

TMS320F280049C: 280049 LIN用作SCI的波特率计算及配置

Part Number: TMS320F280049C

你好,问:280049 外设LIN用作SCI,系统主频100M, 要9600波特率,相关对应BRSR.SCI_LIN_PSL,SCI_LIN_PSH, M值应该多少?怎样计算?

  • 您可以看一下driverlib内的如下函数

    //*****************************************************************************
    //
    //! Set Baud Rate Prescaler
    //!
    //! \param base is the LIN module base address
    //! \param prescaler is the 24-bit integer prescaler
    //! \param divider is the 4-bit fractional divider
    //!
    //! In LIN and SCI mode, this function is used to set the baudrate based on
    //! the \e prescaler and \e divider values.
    //!
    //! P = Prescaler  \n
    //! M = Fractional Divider \n
    //! Bitrate = (SYSCLOCK) / ((P + 1 + M/16) * 16) \n
    //!
    //! \return None.
    //
    //*****************************************************************************
    static inline void
    LIN_setBaudRatePrescaler(uint32_t base, uint32_t prescaler,
                             uint32_t divider)
    {
        //
        // Check the arguments.
        //
        ASSERT(LIN_isBaseValid(base));
        ASSERT(prescaler <= (LIN_BRSR_SCI_LIN_PSL_M | LIN_BRSR_SCI_LIN_PSH_M));
        ASSERT(divider <= (LIN_BRSR_M_M >> LIN_BRSR_M_S));
    
        //
        // Set baud rate prescaler and divider
        //
        HWREG_BP(base + LIN_O_BRSR) = (prescaler | (divider << LIN_BRSR_M_S));
    }

  • 波特率配置没问题了。谢谢

    1、参考例程(地址方式)配置或修改LIN收发都可以正常

    2、参考例程(地址方式)配置LIN,自己写配置LIN模块相关(时钟+PIN+LIN的SCI模式配置)代码,配置成内循环或外循环,接收用查询或中断都收和发不成功,是什么原因?出错在哪里?

    配置LIN代码如下:

    EALLOW;

    LinaRegs.SCIGCR0.bit.RESET = 0; // Into reset, lin module
    DELAY_US(50);
    LinaRegs.SCIGCR0.bit.RESET = 1; // Out of reset

    LinaRegs.SCIGCR1.bit.SWnRST = 0; // Into software reset, reset state

    //
    // SCI Configurations
    //
    LinaRegs.SCIGCR1.bit.COMMMODE = 0; // Idle-Line Mode 1
    LinaRegs.SCIGCR1.bit.TIMINGMODE = 1; // Asynchronous Timing 1
    LinaRegs.SCIGCR1.bit.PARITYENA = 0; // No Parity Check 1
    LinaRegs.SCIGCR1.bit.PARITY = 0; // Odd Parity 1
    LinaRegs.SCIGCR1.bit.STOP = 0; // One Stop Bit 1
    LinaRegs.SCIGCR1.bit.CLK_MASTER = 1; // Enable SCI Clock 1
    LinaRegs.SCIGCR1.bit.LINMODE = 0; // SCI Mode
    LinaRegs.SCIGCR1.bit.SLEEP = 0; // Ensure Out of Sleep
    LinaRegs.SCIGCR1.bit.MBUFMODE = 0; // No Buffers Mode 1
    LinaRegs.SCIGCR1.bit.LOOPBACK = 0; // External Loopback
    // LinaRegs.SCIGCR1.bit.LOOPBACK = 1; // interner Loopback
    LinaRegs.SCIGCR1.bit.CONT = 1; // Continue on Suspend 1
    // LinaRegs.SCIGCR1.bit.RXENA = 1; // Enable RX
    // LinaRegs.SCIGCR1.bit.TXENA = 1; // Enable TX

    //
    // Ensure IODFT is disabled
    //
    // LinaRegs.IODFTCTRL.bit.IODFTENA = 0x0;

    //
    // Set transmission length
    //
    LinaRegs.SCIFORMAT.bit.CHAR = 7; //Eight bits 1
    LinaRegs.SCIFORMAT.bit.LENGTH = 0; //One byte 1

    //
    // Set baudrate
    //
    LinaRegs.BRSR.bit.SCI_LIN_PSL = 650; //Baud = 9600 bps
    LinaRegs.BRSR.bit.M = 1;

    LinaRegs.SCIGCR1.bit.SWnRST = 1; //bring out of software reset, ready state

    //-----------int---------------------------------
    LinaRegs.SCISETINT.bit.SETRXINT = 1;
    LinaRegs.SCICLEARINTLVL.bit.CLRRXINTLVL = 1;
    // LinaRegs.SCISETINTLVL.bit.SETRXINTOVO = 1;

    LinaRegs.LIN_GLB_INT_EN.bit.GLBINT0_EN = 1; //enable
    LinaRegs.LIN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1; //clear int0
    LinaRegs.LIN_GLB_INT_FLG.bit.INT0_FLG = 1; //clear flag

    //
    // Disable write to protected registers
    //
    EDIS;

  • 自己写配置LIN模块相关(时钟+PIN+LIN的SCI模式配置)代码,配置成内循环或外循环,接收用查询或中断都收和发不成功

    请问具体表现是什么?另外您硬件方面使用的是开发板?

  • 自写代码为什么收发不了,表现:Tx示波器没有波形和串口上位没有数据,接收没有中断或查询接收标志RXRDY没有置位

    同样TI开发板,lib lin例程库上修改成中断或查询,内循环或外部都正常收发波形和数据。

    图2 寄存器异常,什么原因

  • 在上面代码基础上插入LIN例程仿真结果值

    //----------------------------------------------

    LinaRegs.SCIGCR0.all = 0x00000001;   // 插入例程仿真结果值
    LinaRegs.SCIGCR1.all = 0x00A20000;
    LinaRegs.SCIGCR2.all = 0x030200A2;
    LinaRegs.SCISETINT.all = 0x00000302;
    LinaRegs.SCICLEARINT.all = 0x00000000;
    LinaRegs.SCISETINTLVL.all= 0x00000000;
    LinaRegs.SCICLEARINTLVL.all= 0x00000000;
    LinaRegs.SCIFLR.all = 0x00000000;   // 插入例程仿真结果值

    //----------------------------------------------

    LinaRegs.SCIGCR1.bit.SWnRST = 1; //bring out of software reset, ready state

    1、仿真跑到次位置看寄存器值与插入配置对应值不一样,见图2,为什么会这样?CCS V10.3

    2、同个东西,在两页显示不一样为什么会这样?见下两图

  • 图2 寄存器异常,什么原因

    若是可以的话,请给出您的工程,我在开发板上具体看一下

  • 没问题了,原因漏配置,感谢。