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.

TMS320F280049M: TMS320F280049 Lin bus SCI mode

Part Number: TMS320F280049M
Other Parts Discussed in Thread: TMS320F280049, C2000WARE

Hi ,

My customer wants to use Lin-SCI on TMS320F280049 and try DMA to access Lin-SCI.

TI did not release f28004x LIN-SCI example code yet.

He modifies F2803x_LIN_SCI_Echoback.C  to try.

But the program cannot escape from "while(LinaRegs.SCIFLR.bit.IDLE == 1);".

The Lin bus module user guide seems some difference with F28004x and F2803x.

Please give advices to solve it.

thanks,

best regards,

Simen

//###########################################################################
//
//!  \addtogroup f2803x_example_list
//!  <h1>LIN-SCI Digital Loop Back(lina_sci_echoback)</h1>
//!
//!  This test receives and echos back data through the LIN-A port
//!  which has been configured for SCI operation.
//!
//!  The PC application 'hypterterminal' can be used to view the data
//!  from the LIN and to send information to the LIN.  Characters received
//!  by the LIN port are sent back to the host.
//!
//!  \b Running \b the \b Application
//!  -# Configure hyperterminal:
//!  Use the included hyperterminal configuration file SCI_96.ht.
//!  To load this configuration in hyperterminal
//!    -# Open hyperterminal
//!    -# Go to file->open
//!    -# Browse to the location of the project and
//!       select the SCI_96.ht file.
//!  -# Check the COM port.
//!  The configuration file is currently setup for COM1.
//!  If this is not correct, disconnect (Call->Disconnect)
//!  Open the File-Properties dialog and select the correct COM port.
//!  -# Connect hyperterminal Call->Call
//!  and then start the 2803x LIN-SCI echoback program execution.
//!  -# The program will print out a greeting and then ask you to
//!  enter a character which it will echo back to hyperterminal.
//!
//!  \note If you are unable to open the .ht file, you can create
//!  a new one with the following settings
//!  -  Find correct COM port
//!  -  Bits per second = 19200
//!  -  Date Bits = 8
//!  -  Parity = None
//!  -  Stop Bits = 1
//!  -  Hardware Control = None
//!
//!  \b Watch \b Variables \n
//!  - \b LoopCount, for the number of characters sent
//!  - \b ReceivedChar, for character received from Hyperterminal
//!
//! \b External \b Connections \n
//!  Connect the LIN-A port to a PC via a transceiver and cable.
//!  - GPIO9 is LIN-TX
//!  - GPIO11 is LIN-RX
//
//###########################################################################
// $TI Release: F2803x C/C++ Header Files and Peripheral Examples V130 $
// $Release Date: May  8, 2015 $
// $Copyright: Copyright (C) 2009-2015 Texas Instruments Incorporated -
//             http://www.ti.com/ ALL RIGHTS RESERVED $
//###########################################################################

#include "F28x_Project.h"

// Prototype statements for functions found within this file.
void InitLinaGpio(void);
void SetupSCI(void);
void error(void);
void scia_xmit(char Char);
void scia_msg(char *msg);

// Global variables
Uint16 LoopCount;
Uint16 ReceivedChar;

void main(void)
{
	//Initialize Variables

	//Step 1. Initialize System Control:
	//PLL, WatchDog, enable Peripheral Clocks
	//This example function is found in the DSP2803x_SysCtrl.c file.
   	InitSysCtrl();

   	EALLOW;

	//Step 2. Initialize GPIO:
	//This example function is found in the DSP2803x_Gpio.c file and
	//illustrates how to set the GPIO to it's default state.
	//InitGpio();
	//Setup only the GP I/O only for SCI-A and SCI-B functionality
	//This function is found in DSP2803x_Sci.c
   	InitLinaGpio();

	//Step 3. Clear all interrupts and initialize PIE vector table:
	//Disable CPU interrupts
   	DINT;

	//Initialize PIE control registers to their default state.
	//The default state is all PIE interrupts disabled and flags
	//are cleared.
	//This function is found in the DSP2803x_PieCtrl.c file.
   	InitPieCtrl();

	//Disable CPU interrupts and clear all CPU interrupt flags:
   	IER = 0x0000;
   	IFR = 0x0000;

    //Initialize and Enable BLIN SCI module
    SetupSCI();

	//Step 4. Initialize all the Device Peripherals:
	// Not required for this example

	//Step 5. User specific code, enable interrupts:

	//Init send data.  After each transmission this data
	//will be updated for the next transmission
   	EALLOW;

	LoopCount = 0;

	//Wait for SCI to be idle and ready for transmission
//	do{
//    LinaRegs.SCIGCR1.bit.SWnRST = 1;  //bring out of software reset
//	}while(LinaRegs.SCIFLR.bit.IDLE == 1);
	while(LinaRegs.SCIFLR.bit.IDLE == 1);

    scia_msg("\r\nYou will enter a character, and the DSP will echo it back! \n\0");
    for(;;)
    {
    	scia_msg("\r\nEnter a character: \0");

		//Wait for a character to by typed
		while(LinaRegs.SCIFLR.bit.RXRDY == 0);

		ReceivedChar =LinaRegs.SCIRD.all;

		scia_msg("  You sent: \0");
		scia_xmit(ReceivedChar);

		LoopCount++;    }
}

void scia_xmit(char Char)
{
	//Wait for the module to be ready to transmit
	while(LinaRegs.SCIFLR.bit.TXRDY == 0);

	//Begin transmission
	LinaRegs.SCITD.all = Char;
}

void scia_msg(char *msg)
{
	int it;
    it = 0;
    while(msg[it] != '\0')
    {
        scia_xmit(msg[it]);
        it++;
    }
}

void SetupSCI(void)
{
	//Allow write to protected registers
	EALLOW;

	LinaRegs.SCIGCR0.bit.RESET = 0; //Into reset
	LinaRegs.SCIGCR0.bit.RESET = 1; //Out of reset

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

	//SCI Configurations
	LinaRegs.SCIGCR1.bit.COMMMODE = 0;   //Idle-Line Mode
	LinaRegs.SCIGCR1.bit.TIMINGMODE = 1; //Asynchronous Timing
	LinaRegs.SCIGCR1.bit.PARITYENA = 0;  //No Parity Check
	LinaRegs.SCIGCR1.bit.PARITY = 0;	 //Odd Parity
	LinaRegs.SCIGCR1.bit.STOP = 0;		 //One Stop Bit
	LinaRegs.SCIGCR1.bit.CLK_MASTER = 1; //Enable SCI Clock
	LinaRegs.SCIGCR1.bit.LINMODE = 0;	 //SCI Mode
	LinaRegs.SCIGCR1.bit.SLEEP = 0;      //Ensure Out of Sleep
	LinaRegs.SCIGCR1.bit.MBUFMODE = 0;	 //No Buffers Mode
	LinaRegs.SCIGCR1.bit.LOOPBACK = 0;   //External Loopback
	LinaRegs.SCIGCR1.bit.CONT = 1;		 //Continue on Suspend
	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
    LinaRegs.SCIFORMAT.bit.LENGTH = 0;   //One byte

	//Set baudrate
    LinaRegs.BRSR.bit.SCI_LIN_PSH = 0;          //Baud = 9.6khz
    LinaRegs.BRSR.bit.SCI_LIN_PSL = 194;          //Baud = 9.6khz
    LinaRegs.BRSR.bit.M = 5;

//    LinaRegs.SCIGCR0.bit.RESET = 1; //Out of reset
    LinaRegs.SCIGCR1.bit.SWnRST = 1;  //bring out of software reset

	//Disable write to protected registers
	EDIS;
}

void error(void)
{
	__asm("     ESTOP0"); // Test failed!! Stop!
	for (;;);
}


//LINA_TX GPIO32, LINA_RX GPIO33
void InitLinaGpio()
{
    GPIO_SetupPinMux(32, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(32, GPIO_OUTPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(33, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(33, GPIO_INPUT, GPIO_PUSHPULL);
}


//===========================================================================
// No more.
//===========================================================================



  • Hi Simen,

    Please refer to the C2000Ware example code for LIN in SCI Loop back mode for initial setup configuration. For echo back you can refer to the SCI example. 

    Using Lin in SCI mode - \driverlib\f28004x\examples\lin\CCS\lin_ex2_sci_loopback.projectspec

    Using SCI to echo back - \driverlib\f28004x\examples\sci\CCS\sci_ex1_echoback.projectspec

    We have taken a note to add the Echo back example code for LIN in SCI mode. In the meantime try the above examples, and let us know if you are still seeing issues.

    Regards,

    Nirav

  • Nirav,

    Thank you for your answer.

    Simen