Regarding 2 spi interface in seeed studio nrf52840

Hi, I am working with Max30003 and SD card module.

below is my code.

/
/*

  SD card test

  This example shows how use the utility libraries on which the'

  SD library is based in order to get info about your SD card.

  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:

    SD card attached to SPI bus as follows:

 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila

 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila

 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila

 ** CS - depends on your SD card shield or module.

    Pin 4 used here for consistency with other Arduino examples

  created  28 Mar 2011

  by Limor Fried

  modified 9 Apr 2012

  by Tom Igoe

*/

// include the SD library:

#include <SPI.h>

#include "SD.h"

#include "protocentral_Max30003.h"

// set up variables using the SD utility library functions:

Sd2Card card;

SdVolume volume;

SdFile root;

// change this to match your SD shield or module;

// Arduino Ethernet shield: pin 4

// Adafruit SD shields and modules: pin 10

// Sparkfun SD shield: pin 8

// MKRZero SD: SDCARD_SS_PIN

const int chipSelect = 0;

MAX30003 max30003;

void setup() {

  // Open serial communications and wait for port to open:

  Serial.begin(57600);

  while (!Serial) {

    ; // wait for serial port to connect. Needed for native USB port only

  }

pinMode(MAX30003_CS_PIN,OUTPUT);

    digitalWrite(MAX30003_CS_PIN,HIGH); //disable device

    SPI.begin();

    SPI.setBitOrder(MSBFIRST);

    SPI.setDataMode(SPI_MODE0);

    bool ret = max30003.max30003ReadInfo();

    if(ret){

      Serial.println("Max30003 read ID Success");

    }else{

      while(!ret){

        //stay here untill the issue is fixed.

        ret = max30003.max30003ReadInfo();

        Serial.println("Failed to read ID, please make sure all the pins are connected");

        delay(10000);

      }

    }

    Serial.println("Initialising the chip ...");

    max30003.max30003Begin();   // initialize MAX30003

    delay(1000);

  Serial.print("\nInitializing SD card...");

  pinMode(chipSelect,OUTPUT);

    digitalWrite(chipSelect,LOW); //disable device

  // we'll use the initialization code from the utility libraries

  // since we're just testing if the card is working!

  if (!card.init(SPI_HALF_SPEED, chipSelect)) {

    Serial.println("initialization failed. Things to check:");

    Serial.println("* is a card inserted?");

    Serial.println("* is your wiring correct?");

    Serial.println("* did you change the chipSelect pin to match your shield or module?");

    // while (1);

  } else {

    Serial.println("Wiring is correct and a card is present.");

  }

  // print the type of card

  Serial.println();

  Serial.print("Card type:         ");

  switch (card.type()) {

    case SD_CARD_TYPE_SD1:

      Serial.println("SD1");

      break;

    case SD_CARD_TYPE_SD2:

      Serial.println("SD2");

      break;

    case SD_CARD_TYPE_SDHC:

      Serial.println("SDHC");

      break;

    default:

      Serial.println("Unknown");

  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32

  if (!volume.init(card)) {

    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");

    // while (1);

  }

  Serial.print("Clusters:          ");

  Serial.println(volume.clusterCount());

  Serial.print("Blocks x Cluster:  ");

  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");

  Serial.println(volume.blocksPerCluster() * volume.clusterCount());

  Serial.println();

  // print the type and size of the first FAT-type volume

  uint32_t volumesize;

  Serial.print("Volume type is:    FAT");

  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks

  volumesize *= volume.clusterCount();       // we'll have a lot of clusters

  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)

  Serial.print("Volume size (Kb):  ");

  Serial.println(volumesize);

  Serial.print("Volume size (Mb):  ");

  volumesize /= 1024;

  Serial.println(volumesize);

  Serial.print("Volume size (Gb):  ");

  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");

  root.openRoot(volume);

  // list all files in the card with date and size

  root.ls(LS_R | LS_DATE | LS_SIZE);

  digitalWrite(chipSelect,HIGH); //disable device

 

}

void loop(void) {

 digitalWrite(MAX30003_CS_PIN,LOW); //disable device

  max30003.getEcgSamples();   //It reads the ecg sample and stores it to max30003.ecgdata .

    Serial.println(max30003.ecgdata);

     digitalWrite(MAX30003_CS_PIN,HIGH); //disable device

    delay(8);

}

issue is that both are initalized correctly but i am getting 0 values from max30003 ecg sensor. when i run max30003 alone, it gives correct value. can you please tell whats the issue? Any help would be much appriciated. @msfujino

Hi kushal_patel,
I have some questions.

  1. Which pin of XIAO is connected to the chip select pin of the SD card?
  2. Which pin of XIAO is connected to the chip select pin of the MAX30003 board?
  3. Where is the definition of “MAX30003_CS_PIN”?
  4. Please explain the connection between the SD card, MAX30003 board and XIAO_nRF52840 using pin names.
  5. Please show us the sketch of MAX30003 when it is executed alone.
  6. Please show a sketch of the SD card when it is executed alone.
  7. Show us the link to the MAX30003 board you are using
  8. The Library is “ProtoCentral MAX30003 EGC AFE Sensor Library 1.0.2”, right?
  9. Is the BSP you are using “mbed” or “non-mbed”?
  1. Which pin of XIAO is connected to the chip select pin of the SD card?
    pin 0
  2. Which pin of XIAO is connected to the chip select pin of the MAX30003 board?
    pin 7
  3. Where is the definition of “MAX30003_CS_PIN”?
    it is in header file of max30003
  4. Please explain the connection between the SD card, MAX30003 board and XIAO_nRF52840 using pin names.
    i am using 8 as sclk, 9 as miso and 10 as mosi. these 3 pins are common between sd card and max30003.
  5. Please show us the sketch of MAX30003 when it is executed alone.
#include<SPI.h>
#include "protocentral_Max30003.h"

MAX30003 max30003;


void setup()
{
    Serial.begin(57600); //Serial begin

    pinMode(MAX30003_CS_PIN,OUTPUT);
    digitalWrite(MAX30003_CS_PIN,HIGH); //disable device

    SPI.begin();
    SPI.setBitOrder(MSBFIRST);
    SPI.setDataMode(SPI_MODE0);

    bool ret = max30003.max30003ReadInfo();
    if(ret){
      Serial.println("Max30003 read ID Success");
    }else{

      while(!ret){
        //stay here untill the issue is fixed.
        ret = max30003.max30003ReadInfo();
        Serial.println("Failed to read ID, please make sure all the pins are connected");
        delay(10000);
      }
    }

    Serial.println("Initialising the chip ...");
    max30003.max30003Begin();   // initialize MAX30003
}

void loop()
{
    max30003.getEcgSamples();   //It reads the ecg sample and stores it to max30003.ecgdata .

    Serial.println(max30003.ecgdata);
    delay(8);
}

  1. Please show a sketch of the SD card when it is executed alone.
#include <SPI.h>
#include <SD.h>

const int chipSelect = 0;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  // wait for Serial Monitor to connect. Needed for native USB port boards only:
  while (!Serial);

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

  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("1. is a card inserted?");
    Serial.println("2. is your wiring correct?");
    Serial.println("3. did you change the chipSelect pin to match your shield or module?");
    Serial.println("Note: press reset button on the board and reopen this Serial Monitor after fixing your issue!");
    while (true);
  }

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

void loop() {
  // make a string for assembling the data to log:
  String dataString = "";

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}

  1. Show us the link to the MAX30003 board you are using
    https://protocentral.com/product/protocentral-max30003-single-lead-ecg-breakout-board-v2/?srsltid=AfmBOooeXbCt88_YA4xOoxUgckKJVQ7EFWmpijH6yA84YmBGVkFaio1m

  2. The Library is “ProtoCentral MAX30003 EGC AFE Sensor Library 1.0.2”, right?
    correct

  3. Is the BSP you are using “mbed” or “non-mbed”?
    mbed

const int chipSelect = 0 ;

// read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

Is there a conflict between chipselect = 0 and analogpin = 0?

Where are the power pins on the SD card and the MAX30003 board connected? 5V pin or 3V3 pin?

1 Like

actually my max30003 and sd card initilisation done ok but the value i am getting from sensor is wrong. when i disconnect sd card value comes right.

power pins for sd card and max30003 are connected to 3.3V as it is operated from 3.7v battery.

Compiling with mbed causes an error; compiling with non-mbed compiles it. Please tell me the exact name of the board you have selected.

1 Like

I guess that SD.open(), dataFile.println(), dataFile.close() and Serial.println(), which are executed each time in loop{}, take more than 10mS, Can max30003.getEcgSamples() return the desired data?

it is SEEED XIAO NRF52840 SENSE.

Ya. initialization is correct and give correct id as expected but samples output is not correct. I have done inialization of sd card after max… when its done. it gives odd result…

also i observe that if i initilise sd first then max initilisation failed.

now both initilaised ok but max gives 0 output always.

Are you sure the connections are as follows?

XIAO   SD     MAX
-----------------
3V3    3V3    VCC
GND    GND    GND
D0     CS             
D7            CSB
D8     SCK    SCK
D9     MISO   MISO
D10    MOSI   MOSI
              INT1
              INT2
              FCLK
1 Like

If the board name is “SEEED XIAO NRF52840 SENSE”, the BSP is non mbed.

actually i have changed non mbed board later to have same sd compitibility. and ya connection is same as you mentioned.

It seems to me that the SD process is taking too long and not reading the correct data from MAX.
Try to shorten the execution time by using open() in setup() and loop() only to write to the file, and close the file at an appropriate time. What will be the result?

What is the MAX data rate?
You must write to SD at a data rate of at least the MAX data rate.

actually i have tried that also. when i open file in setup then output will be as seen in attached schreenshot.

close() takes a long time.

i have also tested with closed() removed

also i have tested same circuit in xiao esp32c3 and it is working fine

Please show me a sketch that works properly with XIAO_ESP32C3.
I don’t think that is the cause, but the SPI configuration is different between nRF52 and ESP32.