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.

tm4c194ncpdt

Other Parts Discussed in Thread: TM4C1294NCPDT, EK-TM4C1294XL

Hi,

I am new in Tiva series TM4C1294ncpdt controller.
I have used TM4C1294ncpdt controller , and usb0 as a host.

i am attaching schematic diagram of controller and usb connector , let me that it is correct or not?

there is no compilation error in ccs project.


when i connect usb pan drive , it hangs the system , i am attaching here with  usb host functions and routines.

please help for following issue.

Regards,

Rohit Prajapati

/***********************************usb routines ********************************************/

/********************************************************************************
                      USB PEN DEVICE INTERFACE PROGRAM FILE                                                          
**********************************************************************************/
// LIST OF THE VARIOUS HEADER FILE CONTAINS THE DECLARATION
/*  DECLARATION OF THE VARIOUS INCLUDE FILE REQUIRED FOR THIS FILE FUNCTION  */
#include <stdio.h>
#include <string.h>
#include "Header_File/Declare.h"
#include "Header_File/RBC_Declare.h"
#include "Header_File/RBC_Constant.h"
#include "Header_File/Func_Prototype.h"
#include "Header_File/Global_Variable.h"
/* *********************** VARIOUS CONSTANT USED IN THE PROGRAM ******************** */
// GLOBAL CONSTANT USED FOR FILE FORMAT SYSTEM
static FATFS g_sFatFs;
static DIR g_sDirObject;                        // HOLD THE CURRENT DIRECTORY PATH
static FIL g_sFileObject;                        // HOLD THE CURRENT FILE PATH
static char g_cCwdBuf[80] = "/";
// CONSTANT RELATED TO THE uDMA CONTROLLER
#pragma DATA_ALIGN(g_sDMAControlTable, 1024)        
tDMAControlTable g_sDMAControlTable[6];
// CONSTANT RELATED TO ALL THE HOST DRIVER (MSC CLASS IS LOADED)
static tUSBHostClassDriver const * const g_ppHostClassDrivers[] =
{
    &g_sUSBHostMSCClassDriver
};
// THE GLOBAL CONTAINS THE NUMBER OF THE CLASS DRIVER IN THE g_ppHostClassDrivers LIST
#define NUM_CLASS_DRIVERS       (sizeof(g_ppHostClassDrivers) / sizeof(g_ppHostClassDrivers[0]))

//unsigned long g_ulMSCInstance = 0;            // INSTATIONEOUS DATA FOR MSC DRIVER
tUSBHMSCInstance  *g_ulMSCInstance = 0;            // INSTATIONEOUS DATA FOR MSC DRIVER
#define HCD_MEMORY_SIZE         128            // SIZE OF THE HOST CONTROLLER MEMORY POOL
unsigned char g_pHCDPool[HCD_MEMORY_SIZE];    // MEMORY POOL TO PROVIDE TO THE HOST CONTROLLER DRIVERS
// THIS FUNCTION IS CALLBACK FROM THE MSC DRIVERS. IT HANDLE THE EVENT I.E MSC EVENT OPEN & MSC EVENT CLOSE(FROM THE MSC DRIVERS)
//static void MSCCallback(unsigned long ulInstance, unsigned long ulEvent, void *pvData)
static void MSCCallback( tUSBHMSCInstance *ulInstance,  uint32_t ulEvent, void *pvData)
{
    switch(ulEvent)            // DETERMINE THE EVENT
    {
        case MSC_EVENT_OPEN:        // CALLED WHEN DEVICE IS SUCCESSFULLY ENUMERATED
        {
            g_eState = STATE_DEVICE_ENUM;            // PROCESS THE ENUMERATED DEVICE
            break;
        }
        case MSC_EVENT_CLOSE:        // CALLED WHEN THE DEVICE IS CLOSE OR NOT DETECTED
        {
            g_eState = STATE_NO_DEVICE;                // GO BACK TO THE NO DEVICE
            break;
        }
        default:
        {
            break;
        }
    }
}
// THE FUNCTION USED TO CONFIGURE THE USB INTERFACE CONTROLLER & POWER UP THE USB BUS LINE
void ConfigureUSBInterface(void)
{
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
    uDMAEnable();
    uDMAControlBaseSet(g_sDMAControlTable);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);        // ENABLE THE USB CONTROLLER
    USBStackModeSet(0, eUSBModeHost, 0);                //rohit
    // SET UP THE GPIO'S PINS OF THE CONTROLLER BY THE USB CONTROLLER
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);
    ROM_GPIOPinConfigure(GPIO_PD6_USB0EPEN);
    ROM_GPIOPinTypeUSBDigital(GPIO_PORTD_BASE, GPIO_PIN_6);
    GPIOPinConfigure(GPIO_PD7_USB0PFLT);
    ROM_GPIOPinTypeUSBDigital(GPIO_PORTD_BASE, GPIO_PIN_7);
    ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 | GPIO_PIN_7);
    ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    // REGISTER THE USB HOST CLASS DRIVER
    //USBHCDRegisterDrivers(0, g_ppHostClassDrivers, g_ui32NumHostClassDrivers);
    USBHCDRegisterDrivers(0, g_ppHostClassDrivers, NUM_CLASS_DRIVERS);
     // OPEN AN INSTANCE OF THE MASS STORAGE CLASS DRIVER
    g_ulMSCInstance = USBHMSCDriveOpen(0, MSCCallback);
    // INITIALISE OF POWER THE USB BUS (I.E ACTIVE LOW THE POWER ENABLE SIGNAL)  
    USBHCDPowerConfigInit(0,USBHCD_VBUS_AUTO_HIGH);
    // INITILISE THE HOST CONTROLLER WHICH FUNCTION AS HOST DEVICE  
    USBStackModeSet(0, eUSBModeForceHost, 0);
    SysCtlDelay(ui32SysClock/100);
    USBHCDInit(0, g_pHCDPool, HCD_MEMORY_SIZE);
    return;
}
// THE FUNCTION USED TO DETECT THE MASS STORAGE DEVICE & SAVE THE FAULT LOG TO THE MASS STORAGE DEVICE
void UpdaterUSB(void)
{
    USBHCDMain();                                // FUNCTION USED TO DETECT THE USB MSC DEVICE & ENUMERATE THE DEVICE
    if(fUSB.USBDeviceDetect == 0){                // IF USB DEVICE IS NOT DETECTED THEN TRY TO DETECT THE DEVICE                
        switch(g_eState){
            case STATE_DEVICE_ENUM:                // MASS STORAGE DEVICE IS ENUMBERATED             
                fUSB.USBDeviceDetect = 1;        // NOW SET THE FLAG FOR INDICATE THAT USB DEVICE IS DETECTED
                fUSB.USBSaveLog = 0;            // NOW RESET THE FLAG FOR INDICATE THAT DATA SAVE IN USB MSD
                flag.Display_Update = 1;                           
                  break;
            case STATE_NO_DEVICE:                 // NO DEVICE IS DETECTED                 
                fUSB.USBDeviceDetect = 0;        // NOW RESET THE FLAG FOR DETECT THE USB DEVICE
                break;
            case STATE_DEVICE_READY:             // NO DEVICE IS DETECTED                 
                fUSB.USBDeviceDetect = 1;        // NOW RESET THE FLAG FOR DETECT THE USB DEVICE
                flag.Display_Update = 1;
                g_eState = STATE_DEVICE_ENUM;
                break;    
        }
    }else if(!fUSB.USBSaveLog){                                        // IF DEVICE IS DETECTED THEN
        // CALL THE FUNCTION INITILISATION OF THE FILE SYSTEM
        if(LoadUSBData() == 0){
            fUSB.USBSaveLog = 1;
            USBHCDPowerConfigSet(0,USBHCD_VBUS_AUTO_HIGH);
        }        
    }
    return;
}
// THE FUNCTION USED TO CONVERT THE INTEGER DATA IN TO THE STRING DATA FORMAT
void IntToStr(char *Dest_Ptr,unsigned short Src_Data,unsigned short Tot_Byte)
{
    // FIRST INCREMENT THE DESTINATION POINTER TO TOTAL NO OF BYTE
    Dest_Ptr += (Tot_Byte);
    Dest_Ptr--;
    while(Tot_Byte > 0){
        *Dest_Ptr = ((Src_Data % 10) + 0x30);
        Src_Data = (Src_Data / 10);
        Dest_Ptr--;                    // DECREMENT THE DESTINATION POINTER
        Tot_Byte--;                    // DECREMENT THE TOTAL NO OF BYTES
    }
}
// THE FUNCTION USED TO INITLISE THE FILE SYSTEM & CREATE THE FILE IN THE USB MSD & SAVE THE FILE IN THE USB MSD
unsigned long LoadUSBData(void)
{    
    volatile unsigned long ulIdx;
    unsigned long ulRetry;        
    // CHECK IF THE USB MASS STORAGE DEVICE IS READY & IF IT OCCURS ERROR THEN IT TRY FOR 5 TIMES STILL IT GIVEN THE ERROR
    ulRetry = 5;
    // FUNCTION USED TO CHECK THE USB DRIVE READY
    while(USBHMSCDriveReady(g_ulMSCInstance)){
        for(ulIdx = 0; ulIdx < 50000; ulIdx++){
        }
        ulRetry--;
        if(ulRetry == 0)
            return(1);
    }   
    if(g_eState == STATE_DEVICE_ENUM){
        if(f_mount(0, &g_sFatFs) != FR_OK) return(1);                // MOUNT THE MSD DEVICE WITH FILE SYSTEM        
        if(f_opendir(&g_sDirObject, g_cCwdBuf) != FR_OK)            // NOW OPEN THE ROOT DIRECTORY IF ANY PROBLEM THEN RETURN               
            return(1);        
        // NOW CREATE THE FILE IN THE USB PEN DRIVE
        for(ulRetry = 1;ulRetry < 9;ulRetry++)
            g_cCwdBuf[ulRetry] = (unsigned char)(USER_PARA[46 + ulRetry] + 0x30);  
        sprintf(&g_cCwdBuf[9],".csv");                                        // RESET THE WORKING DIRECTORY TO ROOT DIRECTORY                          
           //IntToStr(&g_cCwdBuf[6],USER_PARA[47],3);
           /*ulRetry = ((USER_PARA[47] / 100) + 0x30);
           g_cCwdBuf[6] = (char)ulRetry;           
           ulRetry = ((USER_PARA[47] % 10) + 0x30);
           g_cCwdBuf[8] = (char)ulRetry;           
           ulRetry = (USER_PARA[47] / 10);           
           ulRetry = ((ulRetry % 10) + 0x30);
           g_cCwdBuf[7] = (char)ulRetry; */
           // FIRST CHECK THAT IF SAME FILE NAME IS PRESENT THEN DELETE THE EXISTING ONE & CREATE THE NEW ONE
           if(f_open(&g_sFileObject, g_cCwdBuf,FA_CREATE_NEW) == FR_EXIST)
               f_unlink(g_cCwdBuf);
         if(f_open(&g_sFileObject, g_cCwdBuf,FA_OPEN_ALWAYS | FA_WRITE) != FR_OK)     return(1);           // NOW OPEN THE FILE WITH SERIAL NO
         // CALL THE FUNCTION WHICH WRITE THE COMPLETE LOG DATA IN TO THE CSV OPEN FILE
         if(WriteLog_File() != 0) return(1);
           g_eState = STATE_DEVICE_READY;           
    }          
       return(0);    
}

// THE FUNCTION USED TO READ THE COMPLETE FAULT LOG DATA FROM THE EEPROM & SAVE IT TO THE TEXT FILE
unsigned long WriteLog_File()
{
    volatile FRESULT fresult;
    char Save_Str[100] = "Sr.No,FAULT DATE,FAULT TIME,FAULT NAME,FAULT STATUS,FAULT DESCRIPTION\n";    
    unsigned short FSave_No;
    unsigned int usBytesRead;
    unsigned int usBytesWrite;
    unsigned long Rel_Flt;
    //Save_Str[98] = '\n';                        
    //Save_Str[99] = '\0';
    // FIRST WRITE THE FILE HEADER IN THE OPEN FILE
    if(f_write(&g_sFileObject,&Save_Str,70,&usBytesRead) != FR_OK)         return(1);
    FSave_No = 1;
    // NOW FETCH THE FAULT LOG FROM THE EEPROM & THEN SAVE IT TO THE FILE    
    //Save_Str[0] = '\0';                                    // CLEAR THE SAVE STR BUFFER  
    Read_Address = Log_Addr.Flt_Add;    
    while(FSave_No <= Log_Addr.Tot_Flt){                // LOOP TILL THE COMPLETE FAULT READ & SAVE TO THE TEXT FILE
        Rel_Flt = 0;        
        // READ THE FAULT LOG FROM THE READ LOCATION OF EEPROM
        EEPROM_Read(Read_Address,(unsigned char *)&Flt_Read.Type,16);                
        if(Flt_Read.No < 512){
            // NOW CONVERT THE READ DATA FROM THE EEPROM TO THE TEXT FORMAT FOR STRING BUFFER
            sprintf(Save_Str,"%3d,",FSave_No);                    // SR.NO COPY TO BUFFER
            IntToStr(&Save_Str[4],Flt_Read.day,2);                // DAY VALUE COPY TO BUFFER
            Save_Str[6] = '/';Save_Str[14] = ',';
            sprintf(&Save_Str[9],"/20");
            IntToStr(&Save_Str[7],Flt_Read.month,2);            // MONTH VALUE COPY TO BUFFER
            IntToStr(&Save_Str[12],Flt_Read.year,2);            // YEAR VALUE COPY TO BUFFER
            IntToStr(&Save_Str[15],Flt_Read.hour,2);            // HOUR VALUE COPY TO BUFFER
            IntToStr(&Save_Str[18],Flt_Read.minute,2);            // MIN VALUE COPY TO BUFFER
            IntToStr(&Save_Str[21],Flt_Read.sec,2);            // SEC VALUE COPY TO BUFFER
            Save_Str[17] = ':';
            Save_Str[20] = ':';
            Save_Str[23] = ',';
            //sprintf(Save_Str,"%3d,%2d/%2d/20%2d,%2d:%2d:%2d,",FSave_No,Flt_Read.day,Flt_Read.month,Flt_Read.year,Flt_Read.hour,Flt_Read.minute,Flt_Read.sec);
            // NOW STORE THE FAULT NAME TO THE BUFFER
            if(Flt_Read.No >= 256){
                Flt_Read.No -= 256;
                Rel_Flt = 1;                
            }
            if(Flt_Read.No < FAULT_SLAB[0]){                        
                for(usBytesRead = 0;usBytesRead < 16;usBytesRead++){
                    Save_Str[24 + usBytesRead] = SC_Flt_Msg[Flt_Read.No][usBytesRead];  
                }                                
            }else if(Flt_Read.No < FAULT_SLAB[1]){
                Flt_Read.No = (Flt_Read.No - FAULT_SLAB[0]);
                for(usBytesRead = 0;usBytesRead < 16;usBytesRead++){                    
                    Save_Str[24 + usBytesRead] = UI_Flt_Msg[Flt_Read.No][usBytesRead];  
                }                                    
                Flt_Read.No = (Flt_Read.No + FAULT_SLAB[0]);            
            }
            if(Rel_Flt){
                sprintf(&Save_Str[39],"*,RELEASED  ,");            // 8 CHARACTER MSG
            }else{
                sprintf(&Save_Str[40],",OCCURED   ,");            // 8 CHARACTER MSG
            }            
            for(usBytesRead = 0;usBytesRead < 47;usBytesRead++){                    
                Save_Str[52 + usBytesRead] = Fault_Description[Flt_Read.No][usBytesRead];
                if(Save_Str[52 + usBytesRead] == '\n')
                    break;
            }            
            usBytesRead = (usBytesRead + 52);
            usBytesRead++;
            //Save_Str[usBytesRead] = '\0';
            usBytesWrite = 0;
            // SAVE THE BUFFER IN TO THE TEXT FILE
            if(f_write(&g_sFileObject,&Save_Str,usBytesRead,&usBytesWrite) != FR_OK)         return(1);
        //    FSave_No++;    
        }
        FSave_No++;
        Read_Address = (Read_Address - 16);             // SET THE COUNTER FOR READING THE NEXT FAULT LOG DATA     
        if(Read_Address < FLOG_LOWER){                    // IF READ COUNTER IS LESS THEN LOWER LIMIT THEN SET THE UPPER LIMIT FOR READING LOG
            Read_Address = (FLOG_UPPER - 16);
        }        
    }
    if(f_close(&g_sFileObject) != FR_OK)     return(1);
    return(0);                    // IF COMPLETE FILE WRITE SUCCESSFULLY
}