Adafruit TFT 1.8 shield problems

I am using an Adafruit TFT 1.8 shield with an arduino mega 2560

I connected the shield properly to the mega's spi pins and its working fine by itself, however if I want to add another shield (using of course a different slave select pin) the TFT shield doesn't display anymore.

I am using the tft shield + a wifi shield + can shield. Can-bus shield and wifi shield work fine together, however the display doesn't. I made some research and didn't find anything wrong as far as pin conflicts go.

my setup looks like this :

void setup() {
  WiFi.setPins(47,7,5);
    pinMode(9, OUTPUT);      
    pinMode(47, OUTPUT);
    pinMode(53, OUTPUT);
    pinMode(49, OUTPUT);
  
 // Serial.begin(9600); // For debug use
digitalWrite(53,HIGH);
digitalWrite(47, HIGH);
digitalWrite(49,LOW);
delay(1000);        //   tft.setRotation(3);
                      tft.initR(INITR_BLACKTAB);   
                       Serial.println("OK!");
                      tft.fillScreen(ST7735_BLACK);
                      tft.setTextSize(2);
                      tft.setTextColor(ST7735_WHITE);
                      tft.setCursor(0, 0);
                      tft.println("message"); 
                       tft.setCursor(0, 20);
                      tft.println("DE-S"); 
                        
digitalWrite(49,HIGH);
digitalWrite(53,LOW);
  Serial.begin(9600); // For debug use
  
  if(Canbus.init(CANSPEED_500))  
    {
      Serial.println("CAN Init ok");
  
    
  delay(1000);

digitalWrite(53,HIGH);
digitalWrite(47, LOW);  
// check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    while (true);       // don't continue
  }
   
  // attempt to connect to WiFi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
  
     
    Serial.println(ssid);                   // print the network name (SSID)
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
    // wait 10 seconds for connection:
    delay(10000);
  }
  server.begin();                           // start the web server on port 80
  printWiFiStatus();                        // you're connected now, so print out the status
    
    
digitalWrite(47, HIGH);  }


else Serial.println("Can't init CAN");
  

}

What happens is:

  1. TFT shield displays message
  2. can is initialized and prints in serial monitor "CAN init OK"
  3. Wifi shield connects to my hotspot

However If I put the TFT part of the code somewhere else (or in loop) it doesn't display anything anymore. I need to tft shield to display information from the can-bus shield, but even if I receive an information from the canbus, then shut down can and use digitalwrite to talk to TFT lcd shield, it still won't display.

Anyone has any idea whats the problem ?