display bmp image from RA8875_Display shield SD card module in Arduino-Due

Hi All,
I have good experience in C++ programming and new to Aurdino programming and Electrinics. Recently purchased 7 inch TFT touch screen from https://www.buydisplay.com/serial-spi-arduino-7-inch-tft-lcd-touch-shield-ra8875-for-mega-due-uno with optional capacitive touch option. The display is compaitable with Arduino-mega, Arduino-Due and Arduino- UNO. I loaded CapacitivetouchTest sketch sample from buydisplay.com and it works fine.
Next I tried RA8875_Bitmap sample sketch. It compiles and uploads successfully. But the display is blank.
Please find the sketch below that I have tried.

#include <Adafruit_GFX.h>    // Core graphics library
#include <SPI.h>
#include <Wire.h>
#include <SD.h>
#include "Adafruit_RA8875.h"
#include <Adafruit_STMPE610.h>
#define sd_cs 5                          // uding ethernet shield sd
// Library only supports hardware SPI at this time
// Connect SCLK to UNO Digital #13 (Hardware SPI clock)
// Connect MISO to UNO Digital #12 (Hardware SPI MISO)
// Connect MOSI to UNO Digital #11 (Hardware SPI MOSI)
#define RA8875_INT 4
#define RA8875_CS 10
#define RA8875_RESET 9
Adafruit_RA8875 tft = Adafruit_RA8875(RA8875_CS, RA8875_RESET);
void setup () {
Serial.begin(9600);

if (!SD.begin(sd_cs))
{
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
Serial.println("RA8875 start");
if (!tft.begin(RA8875_800x480)) {
Serial.println("RA8875 Not Found!");
while (1);
}
Serial.println("Found RA8875");
tft.displayOn(true);
tft.GPIOX(true);      // Enable TFT - display enable tied to GPIOX
tft.PWM1config(true, RA8875_PWM_CLK_DIV1024); // PWM output for backlight
tft.PWM1out(255);
Serial.print("(");
Serial.print(tft.width());
Serial.print(", ");
Serial.print(tft.height());
Serial.println(")");
tft.graphicsMode();                 // go back to graphics mode
tft.fillScreen(RA8875_BLACK);
tft.graphicsMode();
bmpDraw("parrot.bmp", 0, 0);
}
void loop()
{
}
#define BUFFPIXEL 20
void bmpDraw(const char *filename, int x, int y) {
File     bmpFile;
int      bmpWidth, bmpHeight;   // W+H in pixels
uint8_t  bmpDepth;              // Bit depth (currently must be 24)
uint32_t bmpImageoffset;        // Start of image data in file
uint32_t rowSize;               // Not always = bmpWidth; may have padding
uint8_t  sdbuffer[3*BUFFPIXEL]; // pixel in buffer (R+G+B per pixel)
uint16_t lcdbuffer[BUFFPIXEL];  // pixel out buffer (16-bit per pixel)
uint8_t  buffidx = sizeof(sdbuffer); // Current position in sdbuffer
boolean  goodBmp = false;       // Set to true on valid header parse
boolean  flip    = true;        // BMP is stored bottom-to-top
int      w, h, row, col;
uint8_t  r, g, b;
uint32_t pos = 0, startTime = millis();
uint8_t  lcdidx = 0;
boolean  first = true;

if((x >= tft.width()) || (y >= tft.height())) return;

Serial.println();
Serial.print(F("Loading image '"));
Serial.print(filename);
Serial.println('\'');

// Open requested file on SD card
if ((bmpFile = SD.open(filename)) == false) {
Serial.println(F("File not found"));
return;
}

// Parse BMP header
if(read16(bmpFile) == 0x4D42) { // BMP signature
Serial.println(F("File size: "));
Serial.println(read32(bmpFile));
(void)read32(bmpFile); // Read & ignore creator bytes
bmpImageoffset = read32(bmpFile); // Start of image data
Serial.print(F("Image Offset: "));
Serial.println(bmpImageoffset, DEC);
// Read DIB header
Serial.print(F("Header size: "));
Serial.println(read32(bmpFile));
bmpWidth  = read32(bmpFile);
bmpHeight = read32(bmpFile);
if(read16(bmpFile) == 1) { // # planes -- must be '1'
bmpDepth = read16(bmpFile); // bits per pixel
Serial.print(F("Bit Depth: "));
Serial.println(bmpDepth);
if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
goodBmp = true; // Supported BMP format -- proceed!
Serial.print(F("Image size: "));
Serial.print(bmpWidth);
Serial.print('x');
Serial.println(bmpHeight);
// BMP rows are padded (if needed) to 4-byte boundary
rowSize = (bmpWidth * 3 + 3) & ~3;
if(bmpHeight < 0) {
bmpHeight = -bmpHeight;
flip      = false;
}
w = bmpWidth;
h = bmpHeight;
if((x+w-1) >= tft.width())  w = tft.width()  - x;
if((y+h-1) >= tft.height()) h = tft.height() - y;
// Set TFT address window to clipped image bounds
for (row=0; row<h; row++) { // For each scanline...
if(flip) // Bitmap is stored bottom-to-top order (normal BMP)
pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
else     // Bitmap is stored top-to-bottom
pos = bmpImageoffset + row * rowSize;
if(bmpFile.position() != pos) { // Need seek?
bmpFile.seek(pos);
buffidx = sizeof(sdbuffer); // Force buffer reload
}
for (col=0; col<w; col++) { // For each column...
// Time to read more pixel data?
if (buffidx >= sizeof(sdbuffer)) { // Indeed
// Push LCD buffer to the display first
if(lcdidx > 0) {
tft.drawPixel(col+x, row+y, lcdbuffer[lcdidx]);
lcdidx = 0;
first  = false;
}

bmpFile.read(sdbuffer, sizeof(sdbuffer));
buffidx = 0; // Set index to beginning
}

// Convert pixel from BMP to TFT format
b = sdbuffer[buffidx++];
g = sdbuffer[buffidx++];
r = sdbuffer[buffidx++];
lcdbuffer[lcdidx] = color565(r,g,b);
tft.drawPixel(col+x, row+y, lcdbuffer[lcdidx]);
} // end pixel

} // end scanline

// Write any remaining data to LCD
if(lcdidx > 0) {
tft.drawPixel(col+x, row+y, lcdbuffer[lcdidx]);
}

Serial.print(F("Loaded in "));
Serial.print(millis() - startTime);
Serial.println(" ms");

} // end goodBmp
}
}

bmpFile.close();
if(!goodBmp) Serial.println(F("BMP format not recognized."));
}
uint16_t read16(File f) {
uint16_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read(); // MSB
return result;
}
uint32_t read32(File f) {
uint32_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read();
((uint8_t *)&result)[2] = f.read();
((uint8_t *)&result)[3] = f.read(); // MSB
return result;
}
uint16_t color565(uint8_t r, uint8_t g, uint8_t b) {
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
}
byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}

Hope the following lines are the one I think I have to modify to make this sketch work.

#define sd_cs 5                          // uding ethernet shield sd
// Library only supports hardware SPI at this time
// Connect SCLK to UNO Digital #13 (Hardware SPI clock)
// Connect MISO to UNO Digital #12 (Hardware SPI MISO)
// Connect MOSI to UNO Digital #11 (Hardware SPI MOSI)
#define RA8875_INT 4
#define RA8875_CS 10
#define RA8875_RESET 9

The Serial monitor displays the following:
11:04:04.927 → initialization failed!
But I am not able to figure out. Also please let me know whether the SD card module present at back of TFT display is faulty or I have to wire up with connections to it make this sketch work? Any help would be appreciated.
Thanks in Advance.

I've read that there was a hardware issue with the RA8875 chip/hardware where it hogs the SPI bus and nothing else can use it. I.E. The SD drive where the image is stored. Has that been fixed? Was it only on some boards, and not others? Donno'. But its something you may want to look into.

Or someone else will show up with a more definite answer.

-jim lee

jimLee:
I've read that there was a hardware issue with the RA8875 chip/hardware where it hogs the SPI bus and nothing else can use it. I.E. The SD drive where the image is stored. Has that been fixed? Was it only on some boards, and not others? Donno'. But its something you may want to look into.

Or someone else will show up with a more definite answer.

-jim lee

Thanks Jim for the reply. I am a starter in Arduino Programming and Electronics. Have no idea whether this has been fixed by Buydisplay.com - the seller of the display. I was looking if any one have faced this issue and any work arround been tried to get rid of this issue.