Adding Sparkfun MicroSD Shield to existing GPS sketch - Continuously reboots

I have an existing GPS sketch that uses GP-635T GPS device using TTL protocol. I also have an LCD display which uses IC2 communications. This sketch was working fine, until i added a Sparkfun MicroSD Card shield. Now the Arduino simply reboot itself over and over. I believe that this must have something to do with the communications protocols of the various devices, but i am inexperienced enough, not to know what the problem is, any help would be appreciated. Here is the code:

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <stdio.h>

//Add the SD Libraries
#include <SD.h>

// ==================================
#define I2C_Address 0x27
#define I2C_NumChar 20
#define I2C_NumLines 4
#define LED 9
#define BUTTON 7
#define PRINT_DATA 0
#define DONT_PRINT_DATA 1

static const int RXPin = 0, TXPin = 1;
static const uint32_t GPSBaud = 9600;

// 4 line, 20 character/line LCD Display
LiquidCrystal_I2C lcd(I2C_Address,I2C_NumChar,I2C_NumLines); 
// The TinyGPS++ object
TinyGPSPlus gps;
// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

// MicroSD Card
//Create the variables to be used by SdFat Library
char fileName[] = "GPS_Test_01.txt";//Create an array that contains the name of our file.   

// Chip Select pin is tied to pin 8 on the SparkFun SD Card Shield
const int chipSelect = 8;  

// Global variables
bool haveData=true;
bool firstPass = true;
float homeLat, homeLong, currentLat, currentLong;
unsigned long last = 0UL;
char Latitude[20],Longitude[20],CurrentTime[20],Status[22],CurrentShortTime[20],LatShort[20],LongShort[20];
int lastDistance=0;
unsigned long dist;  
static int lastChecksum=0,currentChecksum=0;

void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);

  Serial.println(F("GPS Example.ino"));
  
  pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);

  lcd.init(); 
  lcd.backlight();
  
  // initialize the SD Card
  Serial.println("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(chipSelect, OUTPUT);
  
  // see if the card is present and can be initialized:
  Serial.println("Attempting to initialize SD Card");
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
}

void LCD_Print()
{
  Serial.println("Call to LCD_Print");  
  
  if(haveData)
    {
    lcd.setCursor(0, 0);
    lcd.print(Latitude);
    lcd.setCursor(0, 1);
    lcd.print(Longitude);
    lcd.setCursor(0, 2);
    lcd.print(CurrentTime);
    lcd.setCursor(0, 3);
    lcd.print(Status);
    }
  smartDelay(0);
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  int hours;
  
  if (!t.isValid())
   {
//    Serial.println(F("Time is invalid"));
    sprintf(CurrentTime,"Time: %02d:%02d:%02d  ",0,0,0);

   }
  else
   {
    // -4 hours to get to EST
    hours = t.hour() - 4;
    if(hours < 0)
       hours += 24;
    sprintf(CurrentTime, "Time: %02d:%02d:%02d  ", hours, t.minute(), t.second());
    sprintf(CurrentShortTime, "%02d:%02d:%02d  ", hours, t.minute(), t.second());
    
//    Serial.println(CurrentTime);
   }
  smartDelay(0);
}

void SPrintLatitude()
{
  currentLat = gps.location.lat();
  // Location parameters have 5 decimal places
  int dec = (float)(currentLat - (int)currentLat)*100000;
  int num = currentLat;

  sprintf(LatShort,"%4d.%5d",num,dec);
  sprintf(Latitude,"Lat: %s St%02d",LatShort,gps.GetSatellites());
  smartDelay(0);
}

void SPrintLongitude()
{
  currentLong = gps.location.lng();
  // Location parameters have 5 decimal places
  int dec = abs((float)(currentLong - (int)currentLong)*100000);
  int num = currentLong;

  sprintf(LongShort,"%4d.%05d",num,dec);
  sprintf(Longitude,"Long: %s",LongShort);
  smartDelay(0);
}

// This custom version of delay() ensures that the gps object
// is being "fed".
static void smartDelay(unsigned long ms)
{
  bool homeSet=false;
  
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
   if(digitalRead(BUTTON) == HIGH && !homeSet)
      {
      digitalWrite(LED,HIGH);
      homeLat = currentLat;
      homeLong = currentLong;
      Serial.println("Home Position set");
      homeSet = true;
      }
  } while (millis() - start < ms);
 digitalWrite(LED,LOW);
}

static void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartDelay(0);
}

void SaveData(int option)
{
  char outData[60];
  
  Serial.println("Call to SaveData");  

  lastChecksum = currentChecksum;
  currentChecksum = gps.failedChecksum();
  
  sprintf(outData,"%s,%s,%s,%05d,%05d,%05d,%05d\n",
     CurrentShortTime,LatShort,LongShort,dist,abs(gps.GetSatellites()),currentChecksum-lastChecksum);
     
   Serial.println("In SaveData Routine");
     
// open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open(fileName, FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(outData);
    dataFile.close();
   }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening data file");
  } 

  if(option == PRINT_DATA)
     Serial.println(outData);
     
  Serial.println("Finished SaveData Routine");
}

void loop()
{
   bool haveLocation=true;
   char text[80];
  
   Serial.println("In Loop");
  
   SPrintLatitude();
   SPrintLongitude();
   printDateTime(gps.date, gps.time);
   
   if(firstPass && gps.location.isValid())
     {
     firstPass = false;
     homeLat = currentLat;
     homeLong = currentLong;
     Serial.println("Home Position set");
     }
   else
     {
     dist = gps.distanceBetween(homeLat,homeLong,currentLat,currentLong);
     if(dist < 0)
        dist = 0;
     if(dist > 99999)
        dist = lastDistance;
     sprintf(Status,"Distance %5d yards",(int)((float)dist*1.0936));
     lastDistance = dist;
     }
  LCD_Print();

  SaveData(PRINT_DATA);
  
  smartDelay(1000);
 }