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.

Continuous data transmission issue with CSL_USB_CdcExample code

Hi,

In the CSL_USB_CdcExample sample code, the input from the host is send back to the host. I modified the code(See Attachment

/*  ============================================================================
 *   Copyright (c) Texas Instruments Inc 2002, 2003, 2004, 2005, 2008, 2011
 *
 *   Use of this software is controlled by the terms and conditions found in the
 *   license agreement under which this software has been supplied.
 *  ============================================================================
 */

/** @file csl_usb_cdc_example.c
 *
 *  @brief USB CDC example source file
 *
 *
 * \page    page17  CSL USB EXAMPLE DOCUMENTATION
 *
 * \section USB6   USB EXAMPLE6 - USB CDC TEST
 *
 * \subsection USB6x    TEST DESCRIPTION:
 * This test is to verify the operation of the CSL USB and CDC ACM module. This test runs
 * in interrupt mode. USB interrupts are configured and ISR is registered using
 * CSL INTC module. After initializing and configuring the USB module, the test program waits
 * on a while loop. When there is any input from the USB host application
 * USB ISR is triggered and the requested operation is performed inside the ISR.
 *
 * This USB CDC test can be verified by any terminal program (such as HyperTerminal) which can
 * send or receive data via the virtual COM port for the USB CDC. The attached INF 
 * file (C5515_CDC_ACM.inf) is required. The INF file only be installed for
 * the C5515 USB CDC device for the first time, when the using driver wizard of the windriver.
 * This installation is required only when running this example for the first
 * time.
 *
 * NOTE: IN THE CURRENT CODE EP1 IN IS CONFIGURED FOR COMMUNICATION CLASS INTERFACE
 * EP2 OUT (BULK OUT) AND EP3 (BULK IN) IN ARE CONFIGURED FOR DATA CLASS INTERFACE 
 * THOSE CAN BE CHANGED IN CSL_CDC.H
 *
 * NOTE: THIS TEST HAS BEEN DEVELOPED TO WORK WITH CHIP VERSIONS C5505 AND
 * C5515. MAKE SURE THAT PROPER CHIP VERSION MACRO IS DEFINED IN THE FILE
 * c55xx_csl\inc\csl_general.h.
 *
 * \subsection USB2y    TEST PROCEDURE:
 * @li Connect the C5505/15 EVM with a PC via USB cable
 * @li Open the CCS and connect the target (C5505/C5515 EVM)
 * @li Open, build and load the USB program to the target
 * @li Set the PLL frequency to 100MHz
 * @li Run the program loaded on to the target
 * @li Install the inf file for the USB device (Only when running for first time)
 * @li After the proper USB enumeration, check the Control Panel-->System-->Hardware-->
 *     Device Manager-->Ports (COM & LPT) looking for C5515_CDC_ACM_device. A COM port will
 *     be assigned to the CDC ACM device, says COM16
 * @li Run the HyperTerminal. Create a new connection to COM16
 * @li Configure the new connection to the desired baud rate, parity, number of bits etc.
 * @li The test program is acting as an echo device, whatever you input in the HyperTerminal,
 *     it will be echo them back. The user input to the HyperTerminal will be sent to the
 *     C5515 EVM via CSL_CDC_BULK_OUT_EP (EP2 OUT) and the data output from C5515 EVM to the 
 *     will be sent to HyperTerminal via USB CSL_CDC_BULK_IN_EP (EP3 IN). You can change the 
 *     actual port number in csl_cdc.h 
 *
 * \subsection USB2z    TEST RESULT:
 * @li USB CDC ACM device should be detected by the host PC and should be accessible
 *     through a terminal application (HyperTerminal)
 * @li Data typed in using keyborad and data displayed on the terminal window should match
 *
 * ============================================================================
 */

/* ============================================================================
 * Revision History
 * ================
 * 17-May-2011 Created
 * 31-May-2010 Updated
 * ============================================================================
 */

#include <stdio.h>
#include <string.h>
#include "soc.h"
#include "csl_usb.h"
#include "csl_usbAux.h"
#include "csl_intc.h"
#include "csl_general.h"
#include "csl_cdc.h"

#define CSL_USB_TEST_PASSED   (0)
#define CSL_USB_TEST_FAILED   (1)

#define CSL_USB_MAX_CURRENT   (50)
#define CSL_USB_WAKEUP_DELAY  (10)

#define ENABLE_DEBUG_PRINT

#ifdef ENABLE_DEBUG_PRINT
#define CSL_USB_DEBUG_PRINT printf
#else
#define CSL_USB_DEBUG_PRINT(string);
#endif

extern CSL_UsbContext     gUsbContext;
extern CSL_UsbRegsOvly    usbRegisters;

/* CDC Application handle */
CSL_CdcInitStructApp    CDC_AppHandle;
/* CDC class data structure */
CSL_CdcClassStruct      cdcClassStruct;
pCdcClassHandle         pHandle;

/* TI C5515 USB Product Id and Vendor Id */
Uint16    pId = 0x9010;
Uint16    vId = 0x0451;

pUsbEpHandle          hEPx;
CSL_UsbConfig         usbConfig;
CSL_UsbBoolean        txRxStatus;
CSL_Status            status;
pUsbContext           pContext = &gUsbContext;

Uint16	usbDataBufferRx[CSL_USB_CDC_DATA_BUF_SIZE];
Uint16	usbDataBufferTx[CSL_USB_CDC_DATA_BUF_SIZE];
Uint16	usbDataBufferTxWork[CSL_USB_CDC_DATA_BUF_SIZE/2];
Uint16	bytesRem;
Uint16	devAddr;
Uint16	saveIndex;
Uint16	endpt;
volatile Bool	stopRunning = FALSE;
Bool	usbDevDisconnect = FALSE;

void genDelay(DWORD dwMicroSeconds);

// Device Descriptor
Uint16    deviceDesc[9] =	{	
								0x0112,	// USB Device Descriptor type| descroptor size 
								0x0200,	// USB Spec Release Number in BCD format 
								0x0002, // Sub-class code - 00 | Class code - 02 (CDC)
								0x4000, // Maximum packet size for EP0 USB 64 | Protocol code 
								0x0451,	// Vendor ID
								0x9010, // Product ID
								0x0100, // Device release number in BCD format
								0x0201, // Product string index | Manufacturer string index 
								0x0103	// Number of Configuration | Device serial number string index
							};

Uint16    deviceQualDesc[5] = {0x060A, 0x0200, 0x0000, 0x4000, 0x0001};

// Configuration Descriptor for USB HighSpeed
Uint16    cfgDesc[40] =	{
							// Configure descriptor
							0x0209,	// USB configure descriptor type | size of configure descriptor 
							0x0034, // Total length of data for this configuration
							0x0102, // Index value of this configuration | number of interfaces in this configuration
							0xC003, // Attributs (Bus-Powered and Self-Powered) | Configuration string index
							0x0932,	// Size of interface 0 | max power consumption (2X mA)
                         	// Interface 0 descriptor
                         	0x0004, // Interface Number | Interface descriptor type
                         	0x0100, // Number of endpoints in this interface | Alternate setting number
                         	0x0202, // Sub-class code (2: ACM) | Class code (2: communication interface class code) 
                         	0x0001,	// Interface string index | Protocol code (V.25)
							// CDC Class-Specific Descriptors
							0x2404,	//  Descriptor type (CS_INTERFACE)| Size of this functional descriptor
							0x0202,	// Capabilities (D1) | ACM functional descriptor subtype
                         	// Endpoint descriptor for communication interface (INTR EP IN)
							0x0507, // USB endpoint descriptor type | Endpoint decsriptor size 
							0x0300|0x80|CSL_CDC_INTR_IN_EP, // Attributes (3: Interrupt) | INTR EP IN
							0x0200, // Maximum packet size 512
							0x0902,	// Size of interface 1 | Polling interval 
							// Interface 1 descriptor
							0x0104, // Interface Number | Interface descriptor type
							0x0200, // Number of endpoints in this interface | Alternate setting number
							0x000A, // Sub-class code | Class code (0x0A: Data interface)
							0x0100, // Interface string index | Protocol code
							// Endpoint descriptor for data interface (DATA EP IN)
							0x0507, // USB endpoint descriptor type | Endpoint descriptor size
							0x0200|0x80|CSL_CDC_BULK_IN_EP, // Attributes (2: Bulk) | BULK EP IN
							0x0200, // Maximum packet size 512 
							0x0700,	// Endpoint descriptor size | Polling interval
							// Endpoint descriptor for data interface (BULK EP OUT)
							0x0005|(CSL_CDC_BULK_OUT_EP<<8), // BULK EP OUT | USB endpoint descriptor type
							0x0002, // Maximum packet size 512 (lower byte) | Attributes (2: Bulk)
							0x0002 // Polling interval | Maximum packet size 512 (higher byte)
                         };

// Configuration Descriptor for USB FullSpeed
Uint16    cfgDescFS[40] =	{
							// Configure descriptor
							0x0709,	// USB alternate configure descriptor type | size of configure descriptor 
							0x002E, // Total length of data for this configuration
							0x0102, // Index value of this configuration | number of interfaces in this configuration
							0xC003, // Attributs | Configuration string index
							0x0932,	// Size of interface 0 | max power consumption (2X mA)
                         	// Interface 0 descriptor
                         	0x0004, // Interface Number | Interface descriptor type
                         	0x0100, // Number of endpoints in this interface | Alternate setting number
                         	0x0202, // Sub-class code (2: ACM) | Class code (2: communication interface class code) 
                         	0x0001,	// Interface string index | Protocol code (V.25)
							// CDC Class-Specific Descriptors
							0x2404,	//  Descriptor type (CS_INTERFACE)| Size of this functional descriptor
							0x0202,	// Capabilities (D1) | ACM functional descriptor subtype
                         	// Endpoint descriptor for communication interface (INTR EP IN)
							0x0507, // USB endpoint descriptor type | Endpoint decsriptor size 
							0x0300|0x80|CSL_CDC_INTR_IN_EP, // Attributes (3: Interrupt) | INTR EP IN
							0x0040, // Maximum packet size 64
							0x0902,	// Size of interface 1 | Polling interval 
							// Interface 1 descriptor
							0x0104, // Interface Number | Interface descriptor type
							0x0200, // Number of endpoints in this interface | Alternate setting number
							0x000A, // Sub-class code | Class code (0x0A: Data interface)
							0x0100, // Interface string index | Protocol code
							// Endpoint descriptor for data interface (DATA EP IN)
							0x0507, // USB endpoint descriptor type | Endpoint descriptor size
							0x0200|0x80|CSL_CDC_BULK_IN_EP, // Attributes (2: Bulk) | BULK EP IN
							0x0040, // Maximum packet size 64 
							0x0700,	// Endpoint descriptor size | Polling interval
							// Endpoint descriptor for data interface (BULK EP OUT)
							0x0005|(CSL_CDC_BULK_OUT_EP<<8), // BULK EP OUT | USB endpoint descriptor type
							0x4002, // Maximum packet size 64 (lower byte) | Attributes (2: Bulk)
							0x0000 // Polling interval | Maximum packet size 64 (higher byte)
                         };

Uint16    strDesc[4][20] = {
							// string 0 English-USA
							{0x0304, 0x0409},
							// string 1 "Texas Instruments"
						    {0x0324, 0x0054, 0x0045, 0x0058, 0x0041, 0x0053, 0x0020, 0x0049,0x004E,  
						    0x0053, 0x0054, 0x0052, 0x0055, 0x004D, 0x0045, 0x004E, 0x0054, 0x0053},
#if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514))
							// string 2 "C5515"
						    {0x030C, 0x0043, 0x0035, 0x0035, 0x0031, 0x0035},
#else
							// string 2 "C5505"
						    {0x030C, 0x0043, 0x0035, 0x0035, 0x0030, 0x0035},
#endif
							// string 3 "00001"
						    {0x030C, 0x0030, 0x0030, 0x0030, 0x0030, 0x0031}
						    };

extern void VECSTART(void);
CSL_Status CSL_usbCdcTest(void);
interrupt void usb_isr(void);
void CSL_suspendCallBack(CSL_Status    status);
void CSL_selfWakeupCallBack(CSL_Status    status);
static void USB_delay(Uint32    mSecs);
CSL_Status CSL_startTransferCallback(void    *vpContext,
                                     void    *vpeps);
CSL_Status CSL_completeTransferCallback(void    *vpContext,
                                        void    *vpeps);
void appBulkInCallback(pUsbContext pContext, CSL_CdcClassStruct *hCdcClass);
void appBulkOutCallback(pUsbContext pContext, CSL_CdcClassStruct *hCdcClass);
void appIntrInCallback(pUsbContext pContext, CSL_CdcClassStruct *hCdcClass);

/**
 *  \brief  main function
 *
 *  \param  None
 *
 *  \return None
 */
   /////INSTRUMENTATION FOR BATCH TESTING -- Part 1 --   
   /////  Define PaSs_StAtE variable for catching errors as program executes.
   /////  Define PaSs flag for holding final pass/fail result at program completion.
        volatile Int16 PaSs_StAtE = 0x0001; // Init to 1. Reset to 0 at any monitored execution error.
        volatile Int16 PaSs = 0x0000; // Init to 0.  Updated later with PaSs_StAtE when and if
   /////                                  program flow reaches expected exit point(s).
   /////
   

void main(void)
{
	CSL_Status    result;

	printf("USB Interrupt Test!!\n");

	result = CSL_usbCdcTest();

	if(result == CSL_USB_TEST_PASSED)
	{
		printf("USB Test Passed!!\n");
	}
	else
	{
		printf("USB Test Failed!!\n");
   /////INSTRUMENTATION FOR BATCH TESTING -- Part 2 --   
   /////  Reseting PaSs_StAtE to 0 if error detected here.
        PaSs_StAtE = 0x0000; // Was intialized to 1 at declaration.
   /////
	}
   /////INSTRUMENTATION FOR BATCH TESTING -- Part 3 -- 
   /////  At program exit, copy "PaSs_StAtE" into "PaSs".
        PaSs = PaSs_StAtE; //If flow gets here, override PaSs' initial 0 with 
   /////                   // pass/fail value determined during program execution.
   /////  Note:  Program should next exit to C$$EXIT and halt, where DSS, under
   /////   control of a host PC script, will read and record the PaSs' value.  
   /////
}

/**
 *  \brief  Tests USB interrupt mode operation
 *
 *  \param  none
 *
 *  \return Test result
 */
CSL_Status CSL_usbCdcTest(void)
{
	CSL_IRQ_Config    config;
	CSL_Status        result;
	Uint16 uartData[80], uartDataSize = 0, retNum;
	int jin = 0;
	int i;
	int s;
	Uint16 test[80] = {0};
	int j = 0x65;

	result = CSL_USB_TEST_FAILED;

	// clear the CDC class structure
	memset((void*)&cdcClassStruct, 0x00, sizeof(cdcClassStruct));
	// clear the USB data buffers
	memset((void*)usbDataBufferRx, 0x00, sizeof(usbDataBufferRx));
	memset((void*)usbDataBufferTx, 0x00, sizeof(usbDataBufferTx));
	memset((void*)usbDataBufferTxWork, 0x00, sizeof(usbDataBufferTxWork));

	/* Initializing the pointer to the CDC Handle */
	CDC_AppHandle.pCdcObj = (void*)&cdcClassStruct;
	pHandle = (pCdcClassHandle)(CDC_AppHandle.pCdcObj);
	
	// Initialize the line code
	pHandle->cdcHandle.lineCoding.dwBaudRate = 0x00002580;//0x0001C200; // 9600 baud
	pHandle->cdcHandle.lineCoding.wCharFormat = 0; // 1 stop bit
	pHandle->cdcHandle.lineCoding.wParityType = 0; // none parity
	pHandle->cdcHandle.lineCoding.wDataBits = 8; // 8 bit

	/* Link all the descriptors to the USB context */
	pContext->deviceDescPtr = deviceDesc;
	pContext->deviceQualDescPtr = deviceQualDesc;
	pContext->cfgDescPtr = cfgDesc;
	pContext->cfgDescFSPtr = cfgDescFS;
	pContext->strDescPtr[0] = strDesc[0];
	pContext->strDescPtr[1] = strDesc[1];
	pContext->strDescPtr[2] = strDesc[2];
	pContext->strDescPtr[3] = strDesc[3];
	/* Initialize the CDC module handle */
	CDC_AppHandle.rxBufferPtr   = usbDataBufferRx;
	CDC_AppHandle.rxStartIdx = CDC_AppHandle.rxEndIdx = 0;
	CDC_AppHandle.txBufferPtr   = usbDataBufferTx;
	CDC_AppHandle.txStartIdx = CDC_AppHandle.txEndIdx = 0;
	CDC_AppHandle.txWorkBufPtr   = usbDataBufferTxWork;
	CDC_AppHandle.txWorkBufIdx = 0;
	CDC_AppHandle.pId    = pId;
	CDC_AppHandle.vId    = vId;

	/* All Function Handlers in the CDC module handle need to be Initialized */
	CDC_AppHandle.bulkInCallback          = appBulkInCallback;
	CDC_AppHandle.bulkOutCallback         = appBulkOutCallback;
	CDC_AppHandle.intrInCallback          = appIntrInCallback;

	// Set up USB configuration strucrure
	usbConfig.opMode             = CSL_USB_OPMODE_POLLED;
    usbConfig.devNum             = CSL_USB0;
	usbConfig.maxCurrent         = CSL_USB_MAX_CURRENT;
	usbConfig.appSuspendCallBack = (CSL_USB_APP_CALLBACK)CSL_suspendCallBack;
	usbConfig.appWakeupCallBack  = (CSL_USB_APP_CALLBACK)CSL_selfWakeupCallBack;
	usbConfig.startTransferCallback  = CSL_startTransferCallback;
	usbConfig.completeTransferCallback = CSL_completeTransferCallback;

	// Pass the endpoint object pointers from CDC handle to USB context
	pContext->hEpObjArray[0] = &cdcClassStruct.ctrlHandle.ctrlOutEpObj;
	pContext->hEpObjArray[1] = &cdcClassStruct.ctrlHandle.ctrlInEpObj;
	pContext->hEpObjArray[2] = &cdcClassStruct.cdcHandle.bulkOutEpObj;
	pContext->hEpObjArray[3] = &cdcClassStruct.cdcHandle.bulkInEpObj;
	pContext->hEpObjArray[4] = &cdcClassStruct.cdcHandle.intrOutEpObj;
	pContext->hEpObjArray[5] = &cdcClassStruct.cdcHandle.intrInEpObj;

	/* Set the interrupt vector start address */
	IRQ_setVecs((Uint32)(&VECSTART));

	/* Plug the USB Isr into vector table */
	config.funcAddr = &usb_isr;
	IRQ_plug(USB_EVENT, config.funcAddr);

	/* Enable USB Interrupts */
	IRQ_enable(USB_EVENT);
	/* Enable CPU Interrupts */
	IRQ_globalEnable();

	/* Initialize the USB module */
	status = USB_init(&usbConfig);
	if(status != CSL_SOK)
	{
		printf("USB init failed\n");
		return(result);
	}

	/* Reset the USB device */
	status = USB_resetDev(CSL_USB0);
	if(status != CSL_SOK)
	{
		printf("USB Reset failed\n");
		return(result);
	}

	// Create a CDC handle 
	status = CDC_Open(&CDC_AppHandle);
	if(status != CSL_SOK)
	{
		if(status == CSL_ESYS_BADHANDLE)
		{
			CSL_USB_DEBUG_PRINT("Opening CDC Module Failed!\n");
			CSL_USB_DEBUG_PRINT("CDC_Open Returned - BAD HANDLE\n");
		} else
		{
			CSL_USB_DEBUG_PRINT("CDC Open Failed\n");
		}

		return(status);
	}
	else
	{
		CSL_USB_DEBUG_PRINT("CSL CDC Module Open Successful\n");
	}

	/* Set the parameters */
	status = USB_setParams(CSL_USB0, pContext->hEpObjArray, FALSE);
	if(status != CSL_SOK)
	{
		printf("USB Set params failed\n");
		return(result);
	}

	/* Connect the USB device */
	status = USB_connectDev(CSL_USB0);
	if(status != CSL_SOK)
	{
		printf("USB Connect failed\n");
		return(result);
	}

	// The echo loop
	while(stopRunning != TRUE)
	{
		
		// checking for cable disconnect
		if ((usbDevDisconnect == TRUE) &&
		   (CSL_FEXT(usbRegisters->DEVCTL, USB_DEVCTL_VBUS) !=
		            CSL_USB_DEVCTL_VBUS_ABOVEVBUSVALID))
		{
			printf("\nUSB Cable Disconnected!!\n");

			while(CSL_FEXT(usbRegisters->DEVCTL, USB_DEVCTL_VBUS) !=
		                   CSL_USB_DEVCTL_VBUS_ABOVEVBUSVALID);

			printf("USB Cable Connection Detected!!\n");

			usbDevDisconnect = FALSE;
			//USB_connectDev(CSL_USB0);

		}
	
		// Echo the input from the host back to the host
		// Get data from the host
		uartDataSize = CDC_getData(pContext, &CDC_AppHandle, uartData);
		// Echo it back, if there is an input
		if (uartDataSize>0)
		{
			while(1)
			{
				do 
				{
					// CDC_putData will return 0 if the TX is not ready for the transaction
					retNum = CDC_putData(pContext, &CDC_AppHandle, uartData, uartDataSize);
				} while (retNum==0);
			}
		}
	}

	result = CSL_USB_TEST_PASSED;
	return(result);
}

// Some USB related counters (for debugging)
Uint32 usb_int_total = 0;
Uint32 usb_int_ep0 = 0;
Uint32 usb_int_reset = 0;
Uint32 usb_int_resume = 0;
Uint32 usb_int_suspend = 0;
Uint16 usb_income_num_bytes;
Uint32 usb_ep1in_count = 0;
Uint32 usb_ep2out_count = 0;
Uint32 usb_ep3in_count = 0;
/**
 *  \brief  USB interrupt service routine
 *
 *  \param  None
 *
 *  \return None
 */
interrupt void usb_isr(void)
{
	usb_int_total++;

	/* Read the masked interrupt status register */
	pContext->dwIntSourceL = usbRegisters->INTMASKEDR1;
	pContext->dwIntSourceH = usbRegisters->INTMASKEDR2;

	/* Clear the interrupts */
	if(pContext->dwIntSourceL != FALSE)
	{
		usbRegisters->INTCLRR1 = pContext->dwIntSourceL;
	}

	if(pContext->dwIntSourceH != FALSE)
	{
		usbRegisters->INTCLRR2 = pContext->dwIntSourceH;
	}

	if((pContext->dwIntSourceL != FALSE) || (pContext->dwIntSourceH != FALSE))
	{
		/* Reset interrupt */
		if(pContext->dwIntSourceH & CSL_USB_GBL_INT_RESET)
		{
			usb_int_reset++;
			usbRegisters->INDEX_TESTMODE = usbRegisters->INDEX_TESTMODE & 0x00ff;

			if(pContext->hEpObjArray[2]->epNum == CSL_USB_IN_EP1)
			{
				CSL_FINS(usbRegisters->INDEX_TESTMODE,
						 USB_INDEX_TESTMODE_EPSEL, CSL_USB_EP1);
				CSL_FINS(usbRegisters->PERI_CSR0_INDX,
				         USB_PERI_CSR0_INDX_RXPKTRDY, TRUE);
			}
			else
			{
				CSL_FINS(usbRegisters->INDEX_TESTMODE,
						 USB_INDEX_TESTMODE_EPSEL, CSL_USB_EP2);
				CSL_FINS(usbRegisters->PERI_CSR0_INDX,
				         USB_PERI_CSR0_INDX_RXPKTRDY, TRUE);
			}
		}

		/* Resume interrupt */
		if(pContext->dwIntSourceH & CSL_USB_GBL_INT_RESUME)
		{
			usb_int_resume++;
			USB_setRemoteWakeup(CSL_USB0, CSL_USB_TRUE);
			status = USB_issueRemoteWakeup(CSL_USB0, TRUE);
			/* Give 10 msecs delay before resetting resume bit */
			USB_delay(CSL_USB_WAKEUP_DELAY);
			status = USB_issueRemoteWakeup(CSL_USB0, FALSE);
			if(status != CSL_SOK)
			{
				printf("USB Resume failed\n");
			}
		}

		/* Check end point0 interrupts */
		if(pContext->dwIntSourceL & CSL_USB_TX_RX_INT_EP0)
		{
			usb_int_ep0++;
			
			// call USB core EP0 event handler to process
			USB_coreEventProcessEp0(pContext);

			// call the CDC event handler for further processing
			CDC_eventHandler(pContext, &cdcClassStruct);
		}

		/* Check CDC Interrupt EP IN for interrupt */
		if (pContext->dwIntSourceL & (1<<CSL_CDC_INTR_IN_EP))
		{
			usb_ep1in_count++;
			// call the INTR IN callback function, if there is any
			if (CDC_AppHandle.intrInCallback!=NULL)
				CDC_AppHandle.intrInCallback(pContext, &CDC_AppHandle);
		}

		/* Check CDC Data Out Ready */
		if (pContext->dwIntSourceL & (1<<(CSL_CDC_BULK_OUT_EP+CSL_USB_IN_EP0)))
		{
			usb_ep2out_count++;

			// Handle the CDC BULK OUT
			CDC_bulkOutHandler(pContext, &CDC_AppHandle);

			// call the CDC BULK OUT callback function, if there is any
			if (CDC_AppHandle.bulkOutCallback!=NULL)
				CDC_AppHandle.bulkOutCallback(pContext, &CDC_AppHandle);
		}

		/* Check CDC Data In Ready */
		if (pContext->dwIntSourceL & (1<<CSL_CDC_BULK_IN_EP))
		{
			usb_ep3in_count++;

			// Handle the CDC BULK IN
			CDC_bulkInHandler(pContext, &CDC_AppHandle);

			// call the CDC BULK IN callback function, if there is any
			if (CDC_AppHandle.bulkInCallback!=NULL)
				CDC_AppHandle.bulkInCallback(pContext, &CDC_AppHandle);
		}

		/* Connect interrupt */
		if(pContext->dwIntSourceH & CSL_USB_GBL_INT_VBUSERR)
		{
			status = USB_connectDev(CSL_USB0);
			if(status != CSL_SOK)
			{
				printf("USB Connect failed\n");
			}
		}

		/* Disconnect interrupt */
		if(pContext->dwIntSourceH & CSL_USB_GBL_INT_DEVDISCONN)
		{
			//status = USB_disconnectDev(CSL_USB0);
			usbDevDisconnect = TRUE;
			if(status != CSL_SOK)
			{
				printf("USB Disconnect failed\n");
			}
		}

		/* Suspend interrupt */
		if(pContext->dwIntSourceH & CSL_USB_GBL_INT_SUSPEND)
		{
			usb_int_suspend++;
			status = USB_suspendDevice(CSL_USB0);
			if(status != CSL_SOK)
			{
				printf("USB Suspend failed\n");
			}
		}
	}

	// Send out End Of Interrupt
	CSL_FINS(usbRegisters->EOIR, USB_EOIR_EOI_VECTOR, CSL_USB_EOIR_RESETVAL);
}


/**
 *  \brief  USB suspend call back function
 *
 *  \param  none
 *
 *  \return Test result
 */
void CSL_suspendCallBack(CSL_Status    status)
{
	printf("\nUSB SUSPEND Callback\n");
}

/**
 *  \brief  USB self wakeup call back function
 *
 *  \param  none
 *
 *  \return Test result
 */
void CSL_selfWakeupCallBack(CSL_Status    status)
{
	printf("\nUSB Self Wakeup CallBack\n");
}

/**
 *  \brief  USB delay function
 *
 *  \param  mSecs - Delay in millisecs
 *
 *  \return None
 */
static void USB_delay(Uint32    mSecs)
{
	volatile Uint32    delay;
	volatile Uint32    msecCount;
	volatile Uint32    sysClk;  /* System clock value in KHz */

	sysClk = 100000;  /* It is assumed that system is running at 100MHz */

	for (msecCount = 0; msecCount < mSecs; msecCount++)
	{
		for (delay = 0; delay < sysClk; delay++)
		{
			asm ("\tNOP");
		}
	}
}


/**
 *  \brief  Start transfer call back function
 *
 *  \param  vpContext - USB context structure
 *  \param  vpeps     - End point status strucure pointer
 *
 *  \return CSL_Status
 */
CSL_Status CSL_startTransferCallback(void    *vpContext,
                                     void    *vpeps)
{
	pUsbContext      pContext;
	pUsbEpStatus     peps;
	pUsbTransfer     pTransfer;
	CSL_Status       status;

	status = CSL_SOK;

	pContext  = (pUsbContext)vpContext;
	peps      = (pUsbEpStatus)vpeps;

    if((pContext == NULL) || (peps == NULL))
    {
        return(CSL_ESYS_INVPARAMS);
	}

	if(!pContext->fMUSBIsReady)
	{
		return(CSL_ESYS_INVPARAMS);
	}

	/* The endpoint should be initialized */
	if(!peps->fInitialized)
	{
		return(CSL_ESYS_INVPARAMS);
	}

    pTransfer = peps->pTransfer;
    pTransfer->fComplete=FALSE;

	if(pTransfer->dwFlags == CSL_USB_OUT_TRANSFER)
	{
		if(peps->dwEndpoint == CSL_USB_EP0)
		{
			status = USB_processEP0Out(pContext);
		}
		else
		{
			status = USB_handleRx(pContext, CSL_CDC_BULK_OUT_EP);
		}
	}
	else if(pTransfer->dwFlags == CSL_USB_IN_TRANSFER)
	{
		if(peps->dwEndpoint == CSL_USB_EP0 )
		{
			status = USB_processEP0In(pContext);
		}
		else
		{
			status = USB_handleTx(pContext, CSL_CDC_BULK_IN_EP);
		}
	}
	else
	{
		status = CSL_ESYS_INVPARAMS;
	}

	return(status);
}


/**
 *  \brief  Complete transfer call back function
 *
 *  \param  vpContext - USB context structure
 *  \param  vpeps     - End point status structure pointer
 *
 *  \return CSL_Status
 */
CSL_Status CSL_completeTransferCallback(void    *vpContext,
                                        void    *vpeps)
{
	return(CSL_SOK);
}

/**
 *  \brief  Application call back function for bulk transactions
 *
 *  \param  None
 *
 *  \return None
 */
Uint32	bulkInCallbackCount = 0;
void appBulkInCallback(pUsbContext pContext, CSL_CdcClassStruct *hCdcClass)
{
	bulkInCallbackCount++;
}

/**
 *  \brief  Application call back function for control transactions
 *
 *  \param  None
 *
 *  \return None
 */
Uint32	bulkOutCallbackCount = 0;
void appBulkOutCallback(pUsbContext pContext, CSL_CdcClassStruct *hCdcClass)
{
	bulkOutCallbackCount++;
}

/**
 *  \brief  Application call back function for interrupt transactions
 *
 *  \param  None
 *
 *  \return None
 */
Uint32	intrInCallbackCount = 0;
void appIntrInCallback(pUsbContext pContext, CSL_CdcClassStruct *hCdcClass)
{
	intrInCallbackCount++;
}


void genDelay(DWORD dwMicroSeconds)
{
	volatile DWORD dwmsecs;
	volatile DWORD delay;
	volatile DWORD looper;

	dwmsecs = dwMicroSeconds;
	delay = 0;

	while(dwmsecs--)
	{
		/* CLOCK = 100 MHz */
		for (looper = 0; looper < 5; looper++)
		{
			delay++;
		}
	}
}

 ), so that I can continuously send data to host. I tried to watch the data in Tera term. After sending data for some time, further data transfer not taking place.

 If i introduce some delay in between each data send, then some more packets will be transferred correctly. The issue occurs when I try to send data continuously.

 Could you please mention a solution for this issue. I need to send data continuously over usb.

Setup Details:

TMS320VC5515 EVM.

CSL Library Being used is ‘c55xx_csl_3.00’

CCS version is ‘4.1.0.02002’

XDC Tool is ‘xdctools_3_16_02_32’

Host OS is Windows XP