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

EL Wire/Tape/Panels, LEDs, pixels and strips, LCDs and TFTs, etc products from Adafruit

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
User avatar
local_dani_21
 
Posts: 129
Joined: Sun Apr 19, 2009 3:10 pm

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

Post by local_dani_21 »

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?

User avatar
paulstoffregen
 
Posts: 444
Joined: Sun Oct 11, 2009 11:23 am

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

Post by paulstoffregen »

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.

User avatar
local_dani_21
 
Posts: 129
Joined: Sun Apr 19, 2009 3:10 pm

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

Post by local_dani_21 »

Just as a BANNED 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

User avatar
paulstoffregen
 
Posts: 444
Joined: Sun Oct 11, 2009 11:23 am

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

Post by paulstoffregen »

That BANNED 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.

User avatar
local_dani_21
 
Posts: 129
Joined: Sun Apr 19, 2009 3:10 pm

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

Post by local_dani_21 »

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

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

/******************************************************************
 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.

User avatar
paulstoffregen
 
Posts: 444
Joined: Sun Oct 11, 2009 11:23 am

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

Post by paulstoffregen »

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.

User avatar
local_dani_21
 
Posts: 129
Joined: Sun Apr 19, 2009 3:10 pm

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

Post by local_dani_21 »

Excellent!

User avatar
local_dani_21
 
Posts: 129
Joined: Sun Apr 19, 2009 3:10 pm

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

Post by local_dani_21 »

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

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

#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

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

User avatar
paulstoffregen
 
Posts: 444
Joined: Sun Oct 11, 2009 11:23 am

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

Post by paulstoffregen »

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.

User avatar
local_dani_21
 
Posts: 129
Joined: Sun Apr 19, 2009 3:10 pm

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

Post by local_dani_21 »

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

User avatar
paulstoffregen
 
Posts: 444
Joined: Sun Oct 11, 2009 11:23 am

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

Post by paulstoffregen »

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.

User avatar
adafruit_support_rick
 
Posts: 35092
Joined: Tue Mar 15, 2011 11:42 am

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

Post by adafruit_support_rick »


User avatar
paulstoffregen
 
Posts: 444
Joined: Sun Oct 11, 2009 11:23 am

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

Post by paulstoffregen »

Rick, that's the nRF8001 schematic.

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

User avatar
paulstoffregen
 
Posts: 444
Joined: Sun Oct 11, 2009 11:23 am

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

Post by paulstoffregen »

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.

User avatar
paulstoffregen
 
Posts: 444
Joined: Sun Oct 11, 2009 11:23 am

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

Post by paulstoffregen »

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

Locked
Please be positive and constructive with your questions and comments.

Return to “Glowy things (LCD, LED, TFT, EL) purchased at Adafruit”