T4.1 unresponsive after SD.begin when powered by Adafruit Powerboost 500 Basic

thecomfychair

Active member
I am trying to make a standalone device using a Teensy 4.1 powered via USB using an Adafruit Powerboost 500 Basic attached to 2x AA batteries. When I try to initialise the onboard SD card with this setup, the Teensy stops responding. When powered from a PC or USB wall charger using the same USB cable, SD.begin works fine and the Teensy continues as normal.

I have examined the power output of the Powerboost and it is 5.2V, so unlikely to be a voltage issue I'm guessing. The Powerboost also allegedly outputs 500mA so that should also be plenty of current, although I have not tested this.

To reproduce the issue:

Hardware:

Hardware setup:
20230416_125215-1.jpg

Program the Teensy with the following sketch using Arduino 1.8.19 and Teensyduino 1.56. It's a slightly modified version of the 'listfiles' example from the Teensy SD library, to which I have added some LED debugging, and removed the wait for the Serial port since no Serial communication would be possible when not connected to a PC.
Code:
/*
  SD card basic directory list example
 
 This example shows how to create and destroy an SD card file 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11, pin 7 on Teensy with audio board
 ** MISO - pin 12
 ** CLK - pin 13, pin 14 on Teensy with audio board
 ** CS - pin 4, pin 10 on Teensy with audio board
 
 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */
#define debugLED 13

#include <SD.h>

// change this to match your SD shield or module;
// Teensy 2.0: pin 0
// Teensy++ 2.0: pin 20
// Wiz820+SD board: pin 4
// Teensy audio board: pin 10
// Teensy 3.5 & 3.6 & 4.1 on-board: BUILTIN_SDCARD
const int chipSelect = BUILTIN_SDCARD;

void setup()
{
  pinMode(debugLED, OUTPUT);

  LEDblink(200); //debug blink 1
  
  //Uncomment these lines for Teensy 3.x Audio Shield (Rev C)
  //SPI.setMOSI(7);  // Audio shield has MOSI on pin 7
  //SPI.setSCK(14);  // Audio shield has SCK on pin 14  
  
  // Open serial communications and wait for port to open:
  Serial.begin(9600);

  LEDblink(200); //debug blink 2

//If not connected to PC with Arduino IDE running, Serial port will never be ready  
//   while (!Serial) {
//    ; // wait for serial port to connect.
//  }

  Serial.print("Initializing SD card...");

  LEDblink(200); //debug blink 3

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

  //unresponsive from this point
  
  LEDblink(200); //debug blink 4

  File root = SD.open("/");
  
  printDirectory(root, 0);
  
  Serial.println("done!");
}

void loop()
{
  // nothing happens after setup finishes.
}

void LEDblink(int len){
  digitalWrite(debugLED, HIGH);
  delay(len);
  digitalWrite(debugLED, LOW);
  delay(len);  
}

void printDirectory(File dir, int numSpaces) {
   while(true) {
     File entry = dir.openNextFile();
     if (! entry) {
       //Serial.println("** no more files **");
       break;
     }
     printSpaces(numSpaces);
     Serial.print(entry.name());
     if (entry.isDirectory()) {
       Serial.println("/");
       printDirectory(entry, numSpaces+2);
     } else {
       // files have sizes, directories do not
       unsigned int n = log10(entry.size());
       if (n > 10) n = 10;
       printSpaces(50 - numSpaces - strlen(entry.name()) - n);
       Serial.print("  ");
       Serial.print(entry.size(), DEC);
       DateTimeFields datetime;
       if (entry.getModifyTime(datetime)) {
         printSpaces(4);
         printTime(datetime);
       }
       Serial.println();
     }
     entry.close();

     LEDblink(100);
   }
}

void printSpaces(int num) {
  for (int i=0; i < num; i++) {
    Serial.print(" ");
  }
}

void printTime(const DateTimeFields tm) {
  const char *months[12] = {
    "January","February","March","April","May","June",
    "July","August","September","October","November","December"
  };
  if (tm.hour < 10) Serial.print('0');
  Serial.print(tm.hour);
  Serial.print(':');
  if (tm.min < 10) Serial.print('0');
  Serial.print(tm.min);
  Serial.print("  ");
  Serial.print(tm.mon < 12 ? months[tm.mon] : "???");
  Serial.print(" ");
  Serial.print(tm.mday);
  Serial.print(", ");
  Serial.print(tm.year + 1900);
}

Test 1:
Power the Teensy using the USB port of a computer, or a USB wall charger, and observe LED.
Result: LED flashes 4 times, then flashes each time it opens a new file from the SD card. This is as expected.

Test 2:
Power the Teensy using the USB port of the Powerboost.
Result: LED flashes only 3 times, then never flashes again after trying to run:
Code:
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

Any thoughts greatly appreciated!
 
Back
Top