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,
/***********************************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
}