0

Driving 2X RA8875 off of one microcontroller, can it be done
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Re: Driving 2X RA8875 off of one microcontroller, can it be

by local_dani_21 on Thu Nov 20, 2014 6:22 am

adafruit_support_rick wrote:It does work with a Mega, if that helps.

I have a setup with two RA8875 on an Arduino Mega that is working very well. However - and I hardly dare writing it: as soon as I connect a third RA8875 to the setup (again: same SCK/MISO/MOSI as on the other two, separate CS/RST), I run into the same problem ... the initialization fails ... RA8875 not found.

Has anyone encountered that as well?
Does anyone have an explanation?

local_dani_21
 
Posts: 126
Joined: Sun Apr 19, 2009 3:10 pm
Location: Zürich, Switzerland

Re: Driving 2X RA8875 off of one microcontroller, can it be

by paulstoffregen on Thu Nov 20, 2014 6:40 am

Well, I currently only have a single RA8875. I purchased a second one, Adafruit order #631697-1196014723, which is on the way.

If anyone from Adafruit reads this and wants me to test with 3, well, you're going to need to send me a third one (for free). I buy various hardware nearly every week for testing libraries, but I really don't feel like ordering yet another of these fairly expensive displays.

paulstoffregen
 
Posts: 434
Joined: Sun Oct 11, 2009 11:23 am
Location: Portland, Oregon, USA

Re: Driving 2X RA8875 off of one microcontroller, can it be

by local_dani_21 on Thu Nov 20, 2014 6:51 am

Just as a teaser Image
... the «7 TFT next to each other»-installation might become really nice. Adafruit I would appreciate it very much if you could help me or Paul in digging into this RA8875-chip and it's problems. Thank you! Dani

local_dani_21
 
Posts: 126
Joined: Sun Apr 19, 2009 3:10 pm
Location: Zürich, Switzerland

Re: Driving 2X RA8875 off of one microcontroller, can it be

by paulstoffregen on Thu Nov 20, 2014 7:54 am

That teaser would be a much more effective (at getting me to verify whatever fix I develop) if you attached the complete sketch (so I can just copy and paste the whole thing into Arduino) and the 2 files needed on the SD card.

paulstoffregen
 
Posts: 434
Joined: Sun Oct 11, 2009 11:23 am
Location: Portland, Oregon, USA

Re: Driving 2X RA8875 off of one microcontroller, can it be

by local_dani_21 on Thu Nov 20, 2014 11:44 am

Alright: Here is everything so far: A working setup with Arduino MEGA, Ethernetshield with SD-Card and 2 RA8875 https://www.adafruit.com/products/1590 with 2 800x480 5" TFTs https://www.adafruit.com/products/1680 from adafruit.com.

Wiring: (image see previous post)
Code: Select all | TOGGLE FULL SIZE
Arduino MEGA with Ethernet Shield
and SD-Slot                       | RA8875 1 | RA8875 2
-------------------------------------------------------
5V                                | VIN      | VIN
GND                               | GND      | GND
50 MISO                           | MISO     | MISO
51 MOSI                           | MOSI     | MOSI
52 SCK                            | SCK      | SCK
22                                | CS
23                                | RST
24                                |          | CS
25                                |          | RST


Sketch
Code: Select all | TOGGLE FULL SIZE
/******************************************************************
 This is an example for the Adafruit RA8875 Driver board for TFT displays
 ---------------> http://www.adafruit.com/products/1590
 The RA8875 is a TFT driver for up to 800x480 dotclock'd displays
 It is tested to work with displays in the Adafruit shop. But only with
 one at a time! (Or two using Arduino UNO or MEGA). Other displays
 may need timing adjustments and are not guanteed to work.
 
 Adafruit invests time and resources providing this open
 source code, please support Adafruit and open-source hardware
 by purchasing products from Adafruit!
 
 Written by Limor Fried/Ladyada for Adafruit Industries.
 BSD license, check license.txt for more information.
 All text above must be included in any redistribution.
 ******************************************************************/

#include <SPI.h>
#include "Adafruit_GFX.h"
#include "Adafruit_RA8875.h"
#include <SD.h>
#define sd_cs 4


// 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_CS 22
#define RA8875_RESET 23
#define RA8875_CS_2 24
#define RA8875_RESET_2 25

Adafruit_RA8875 tft1 = Adafruit_RA8875(RA8875_CS, RA8875_RESET);
Adafruit_RA8875 tft2 = Adafruit_RA8875(RA8875_CS_2, RA8875_RESET_2);
uint16_t tx, ty;



void setup()
{
  Serial.begin(57600);
  while(!Serial){}
  if (!SD.begin(sd_cs))
  {
    Serial.println("initialization failed!");
    return;
  }

  Serial.println("initialization done.");

  Serial.println("RA8875 1 start");
  /* Initialise the display using 'RA8875_480x272' or 'RA8875_800x480' */
  if (!tft1.begin(RA8875_800x480)) {
    Serial.println("RA8875 1 Not Found!");
    while (1);
  }
  Serial.println("Found RA8875");

  Serial.println("RA8875 2 start");
  /* Initialise the display using 'RA8875_480x272' or 'RA8875_800x480' */
  if (!tft2.begin(RA8875_800x480)) {
    Serial.println("RA8875 2 Not Found!");
    while (1);
  }
  Serial.println("Found RA8875 2");

  tftSetup(&tft1);
  tftSetup(&tft2);
}

void loop() {
  bmpDraw(&tft1, "1.bmp", 0, 0); delay(10000);
  bmpDraw(&tft2, "2.bmp", 0, 0); delay(10000);
  bmpDraw(&tft1, "3.bmp", 0, 0); delay(10000);
  bmpDraw(&tft2, "4.bmp", 0, 0); delay(10000);
}

void tftSetup(Adafruit_RA8875 *tft)
{
  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);

  // With hardware accelleration this is instant
  tft->fillScreen(RA8875_WHITE);
}
#define BUFFPIXEL 20

void bmpDraw(Adafruit_RA8875 *tft, 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)) == NULL) {
    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 is negative, image is in top-down order.
        // This is not canon but has been observed in the wild.
        if(bmpHeight < 0) {
          bmpHeight = -bmpHeight;
          flip      = false;
        }

        // Crop area to be loaded
        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...
          // Seek to start of scan line.  It might seem labor-
          // intensive to be doing this on every line, but this
          // method covers a lot of gritty details like cropping
          // and scanline padding.  Also, the seek only takes
          // place if the file position actually needs to change
          // (avoids a lot of cluster math in SD library).
          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, row, 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, row, lcdbuffer[lcdidx]);
          } // end pixel

        } // end scanline

        // Write any remaining data to LCD
        if(lcdidx > 0) {
          tft->drawPixel(col, row, 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."));

}

// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.

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) );
}


The SD card formatted with SDFormatter contains four files attached to this post: http://www.wunderwald.ch/pics/1.bmp http://www.wunderwald.ch/pics/2.bmp http://www.wunderwald.ch/pics/3.bmp http://www.wunderwald.ch/pics/4.bmp

I uploaded the sketch using Arduino IDE 1.0.6 using Adafruits RA8875library.

I haven't been able to add more TFT's (as mentioned above) - I'll post that setup and the sketch in a following post.

local_dani_21
 
Posts: 126
Joined: Sun Apr 19, 2009 3:10 pm
Location: Zürich, Switzerland

Re: Driving 2X RA8875 off of one microcontroller, can it be

by paulstoffregen on Thu Nov 20, 2014 5:21 pm

Ok, Adafruit might be sending me a 3rd one, order #634613-8633670409.

If it arrives, I'll wire up all 3 and figure out why 3 doesn't work.

paulstoffregen
 
Posts: 434
Joined: Sun Oct 11, 2009 11:23 am
Location: Portland, Oregon, USA

Re: Driving 2X RA8875 off of one microcontroller, can it be

by local_dani_21 on Thu Nov 20, 2014 6:26 pm

Excellent!

local_dani_21
 
Posts: 126
Joined: Sun Apr 19, 2009 3:10 pm
Location: Zürich, Switzerland

Re: Driving 2X RA8875 off of one microcontroller, can it be

by local_dani_21 on Fri Nov 21, 2014 4:35 pm

For all those who want to find out what's up with a third RA8875:
Setup that does NOT work:

Arduino MEGA with Ethernet Shield (incl. SD-card), 3 RA8875 with 3 5" TFT's (800x480).
Wiring:
Code: Select all | TOGGLE FULL SIZE
Arduino MEGA with Ethernet Shield
and SD-Slot                       | RA8875 1 | RA8875 2 | RA8875 3
------------------------------------------------------------------
5V                                | VIN      | VIN      | VIN
GND                               | GND      | GND      | GND
50 MISO                           | MISO     | MISO     | MISO
51 MOSI                           | MOSI     | MOSI     | MOSI
52 SCK                            | SCK      | SCK      | SCK
22                                | CS
23                                | RST
24                                |          | CS
25                                |          | RST
26                                |          |          | CS
27                                |          |          | RST


Sketch (almost the same as above ... exended for 3rd TFT)
Code: Select all | TOGGLE FULL SIZE
#include <SPI.h>
#include "Adafruit_GFX.h"
#include "Adafruit_RA8875.h"
#include <SD.h>
#define sd_cs 4


// 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_CS 22
#define RA8875_RESET 23
#define RA8875_CS_2 24
#define RA8875_RESET_2 25
#define RA8875_CS_3 26
#define RA8875_RESET_3 27

Adafruit_RA8875 tft1 = Adafruit_RA8875(RA8875_CS, RA8875_RESET);
Adafruit_RA8875 tft2 = Adafruit_RA8875(RA8875_CS_2, RA8875_RESET_2);
Adafruit_RA8875 tft3 = Adafruit_RA8875(RA8875_CS_3, RA8875_RESET_3);
uint16_t tx, ty;



void setup()
{
  Serial.begin(57600);
  while(!Serial){}
  pinMode(53, OUTPUT); // hardware SS must be set to OUTPUT

  if (!SD.begin(sd_cs))
  {
    Serial.println("SD initialization failed!");
    return;
  }

  Serial.println("SD initialization done.");

  Serial.println("RA8875 1 start");
  /* Initialise the display using 'RA8875_480x272' or 'RA8875_800x480' */
  if (!tft1.begin(RA8875_800x480)) {
    Serial.println("RA8875 1 Not Found!");
    while (1);
  }
  Serial.println("Found RA8875");

  Serial.println("RA8875 2 start");
  /* Initialise the display using 'RA8875_480x272' or 'RA8875_800x480' */
  if (!tft2.begin(RA8875_800x480)) {
    Serial.println("RA8875 2 Not Found!");
    while (1);
  }
  Serial.println("Found RA8875 2");

  Serial.println("RA8875 3 start");
  /* Initialise the display using 'RA8875_480x272' or 'RA8875_800x480' */
  if (!tft3.begin(RA8875_800x480)) {
    Serial.println("RA8875 3 Not Found!");
    while (1);
  }
  Serial.println("Found RA8875 3");

  tftSetup(&tft1);
  tftSetup(&tft2);
  tftSetup(&tft3);
}

void loop() {
  bmpDraw(&tft1, "1.bmp", 0, 0);
  bmpDraw(&tft2, "2.bmp", 0, 0);
  bmpDraw(&tft3, "3.bmp", 0, 0);
}

void tftSetup(Adafruit_RA8875 *tft)
{
  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);

  // With hardware accelleration this is instant
  tft->fillScreen(RA8875_WHITE);
}
#define BUFFPIXEL 20

void bmpDraw(Adafruit_RA8875 *tft, 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)) == NULL) {
    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 is negative, image is in top-down order.
        // This is not canon but has been observed in the wild.
        if(bmpHeight < 0) {
          bmpHeight = -bmpHeight;
          flip      = false;
        }

        // Crop area to be loaded
        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...
          // Seek to start of scan line.  It might seem labor-
          // intensive to be doing this on every line, but this
          // method covers a lot of gritty details like cropping
          // and scanline padding.  Also, the seek only takes
          // place if the file position actually needs to change
          // (avoids a lot of cluster math in SD library).
          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, row, 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, row, lcdbuffer[lcdidx]);
          } // end pixel

        } // end scanline

        // Write any remaining data to LCD
        if(lcdidx > 0) {
          tft->drawPixel(col, row, 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."));

}

// These read 16- and 32-bit types from the SD card file.
// BMP data is stored little-endian, Arduino is little-endian too.
// May need to reverse subscript order if porting elsewhere.

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) );
}


The SD card (pin 4) formatted with SDFormatter contains three files attached to this post: http://www.wunderwald.ch/pics/1.bmp http://www.wunderwald.ch/pics/2.bmp http://www.wunderwald.ch/pics/3.bmp

I uploaded the sketch using Arduino IDE 1.0.6 using Adafruits RA8875library.

Terminal output:
Code: Select all | TOGGLE FULL SIZE
SD initialization failed!


Image
Last edited by local_dani_21 on Fri Nov 21, 2014 6:15 pm, edited 1 time in total.

local_dani_21
 
Posts: 126
Joined: Sun Apr 19, 2009 3:10 pm
Location: Zürich, Switzerland

Re: Driving 2X RA8875 off of one microcontroller, can it be

by paulstoffregen on Fri Nov 21, 2014 5:52 pm

I still have only 1 display, but 2 more are on the way.

The one I ordered (and paid for out of pocket) is in the postal mail. The USPS tracking has no info available.

The one Adafruit sent (they paid for it) is due to be delivered on Monday, by UPS.

Sometime next week I should be able to dig into this problem.

paulstoffregen
 
Posts: 434
Joined: Sun Oct 11, 2009 11:23 am
Location: Portland, Oregon, USA

Re: Driving 2X RA8875 off of one microcontroller, can it be

by local_dani_21 on Fri Nov 21, 2014 6:14 pm

Cool. I posted it to have it written down somewhere. Hope you'll have a good idea! Best regards, Dani

local_dani_21
 
Posts: 126
Joined: Sun Apr 19, 2009 3:10 pm
Location: Zürich, Switzerland

Re: Driving 2X RA8875 off of one microcontroller, can it be

by paulstoffregen on Sun Nov 23, 2014 8:07 pm

I received one of the 2 display and I'm working with it right now.

It seems the RA8875 is not putting its MISO pin into tri-state mode when CS is high. It doesn't drive very hard, but still, it's conflicting with the SD card, which probably manages to pull the MISO line low while the RA8875 is driving high. Can't be good for your SD card...

If anyone from Adafruit see this, is a PDF schematic available for this breakout board? I couldn't find one.

paulstoffregen
 
Posts: 434
Joined: Sun Oct 11, 2009 11:23 am
Location: Portland, Oregon, USA

Re: Driving 2X RA8875 off of one microcontroller, can it be

by adafruit_support_rick on Sun Nov 23, 2014 8:15 pm


adafruit_support_rick
 
Posts: 35095
Joined: Tue Mar 15, 2011 11:42 am
Location: Buffalo, NY

Re: Driving 2X RA8875 off of one microcontroller, can it be

by paulstoffregen on Sun Nov 23, 2014 8:59 pm

Rick, that's the nRF8001 schematic.

I'm working on a RA8875 conflict today. I fixed nRF8001 a couple days ago!

paulstoffregen
 
Posts: 434
Joined: Sun Oct 11, 2009 11:23 am
Location: Portland, Oregon, USA

Re: Driving 2X RA8875 off of one microcontroller, can it be

by paulstoffregen on Sun Nov 23, 2014 9:04 pm

I already started hardware hacking, so far only a couple trace cuts, 1 jumper, 1 resistor replaced. But I'm flying blind without the schematic... and there's something funny going on with the reset circuit on this board.

It might simply be a matter of the RA8875 requiring an external tri-state buffer (like the CC3000 does). But I'd like to try a few more things before jumping to that conclusion. A schematic would really help.

paulstoffregen
 
Posts: 434
Joined: Sun Oct 11, 2009 11:23 am
Location: Portland, Oregon, USA

Re: Driving 2X RA8875 off of one microcontroller, can it be

by paulstoffregen on Sun Nov 23, 2014 11:38 pm

The problem appears to be hardware, that the RA8875 chip does not tri-state its MISO pin when CS is high.

Here is the example, with both MISO pins run through a 74HC125 tri-state buffer chip, controlled by the 2 chip selects.

Image

paulstoffregen
 
Posts: 434
Joined: Sun Oct 11, 2009 11:23 am
Location: Portland, Oregon, USA

Please be positive and constructive with your questions and comments.