Problemas con conexión SPI

Hola buenas estoy realizando un proyecto en el que estoy usando como host controlador un Arduino Nano ATMega 368 y un integrado MAX35101 que sera el esclavo para la conexion SPI.

Lo que quiero es sencillo (en teoría) es tomar el tiempo de vuelo (time of flight)… pero bueno primeramente quiero comprobar que la comunicación SPI funciona correctamente.

Viendo muchos tutoriales y ejemplos y basandome en general de estos:

Tutorial 1
Tutorial 2

He conseguido hacer mi programa, pero el problema es que no me funciona y no se si estoy haciendo algo mal en la parte de programar Arduino o tengo algo mal en la parte de Hardware.

Os dejo los datos que tengo:

CODIGO:

/*
 Circuit:
 MAX35101
 
 RST: pin 8 (should be (HIGH) to operate correctly and high to reset the value should be (low) )
 INT: pin 9 (is disbled (low) when the data is ready)
 CE: pin 10 (in order to select the max we have to put this pin low)
 
 These pins are controlled by arduino
 MOSI: pin 11
 
 MISO: pin 12
 SCK: pin 13

 created 22 February 20
 by Jose Reinoso Andrade
 */

// the sensor communicates using SPI, so include the library:
#include <SPI.h>


// pins used for the connection with the sensor
// the other you need are controlled by the SPI library):
const int RST= 8;
const int INT = 9;
const int CE = 10;

void setup() {
  
  Serial.begin(9600);
  
  //Start the SPI library:
  //Set the settings 
  SPI.begin();
  SPI.setBitOrder(MSBFIRST); 
  SPI.setDataMode(SPI_MODE1);
  
  // initalize the  data ready and chip select pins:
  pinMode(INT, INPUT);
  pinMode(CE, OUTPUT);
  pinMode(RST, OUTPUT);

  digitalWrite(RST,HIGH);
  
  delay(100);
    
}

void loop() {

  byte dato=0;
  byte dato2=0;
  delay(100);
  
  digitalWrite(CE,LOW);
  
  //Leemos los registros de control con READ OP CODE 0XC2
  dato=SPI.transfer(0b11000010);
  //dato=SPI.transfer(0);
  dato2=SPI.transfer(0);
      
  digitalWrite(CE,HIGH);

  delay(100);
  Serial.print("Primera pasada:" );
  Serial.print(dato);
  Serial.println(dato2);
  
  
  //Ahora vamos a escribir en estos registros de control la configuracion que deseamos 0x0235

  digitalWrite(CE,LOW);
  
  //Escribimos los registros de control con el opcode 0x42 y el valor 0x0235
  SPI.transfer(0x42);
  SPI.transfer16(0x0235);
  
  //SPI.transfer(0x02);
  //SPI.transfer(0x35);
      
  digitalWrite(CE,HIGH);

  delay(100);
  //Comprobamos que se haya echo bien

  digitalWrite(CE,LOW);
  
  //Leemos los registros de control con READ OP CODE 0XC2
  
  SPI.transfer(0b11000010);
  dato=SPI.transfer(0);
  dato2=SPI.transfer(0);
      
  digitalWrite(CE,HIGH);
  delay(100);
  Serial.print("Segunda pasada:" );
  Serial.print(dato);
  Serial.println(dato2);
  Serial.print("Deberia Salir el resultado: ");
  Serial.print(0x02);
  Serial.println(0x35);

 delay(3000);
}

Resultados:

Primera pasada:00
Segunda pasada:00
Deberia Salir el resultado: 253
Primera pasada:00
Segunda pasada:00
Deberia Salir el resultado: 253
Primera pasada:00
Segunda pasada:00
Deberia Salir el resultado: 253
Primera pasada:00
Segunda pasada:00
Deberia Salir el resultado: 253

Os dejo la documentacion del MAX35101:

MAX35101

De antemano muchísimas gracias por vuestro tiempo.

Por cada 100 novatos que llegan al foro creo que debes ser el 1% de los que se explican bien, ponen todas las referencias, usas los tags, hojas de datos, es decir, si no has leído las Normas del foro al menos te has dado cuenta de como manejarte

La verdad Felicitaciones y aplausos!!!

He revisado tu chip MAXIM y me he encontrado con esto que tal vez tu no hayas visto o simplemente lo pasaste por alto.
MAXREFDES70# Code Documentation V02.00
Hay muchísima información y entre ella no encuentro que usen el OPCODE 0xC2 que usas al comienzo de tu loop.
La tabla de definiciones de registros es enorme.
Si veo el opcode 0xC2 en la página 49 de la hoja de datos bajo la tabla Table 20. Calibration and Control Register
Por si acaso, te subo el archivo.

Pareciera que estos deberían ser los pasos iniciales

MAX35101_Send_Opcode(RESET);    //Blindly send the MAX35101 reset, in case it is currently running an Event Timing mode
Delay(100); //Blind wait
MAX35101_Send_Opcode(INITIALIZE);   //Send the initialization command, see datasheet
Delay(100); //Blind wait

MAX35101_Write_Register(MINS_HRS, 0x5923);  //Set the time
MAX35101_Write_Register(DAY_DATE, 0x0019);  //Set the Date
MAX35101_Write_Register(MONTH_YEAR, 0x0914);//Set the year

por supuesto que los procedimientos MAX3501_Send_Opcode y Write_Register estan indicados en el documento que te he subido e indicado antes.

Code_Documentation.zip (901 KB)

Perfecto muchas gracias me pongo ahora a revisarlo y a ver que puedo hacer, no sabia que eso estaba voy a probar cosas de lo que vea y os voy contando.

Si me leí las normas del foro antes de postear nada.

Saludos.

Te comento que esa librería es muy extensa. No se que arduino estas usando pero tal vez debas extractar lo necesario o considerar un DUE (por su capacidad de memoria).

Hola, surbyte analizando lo que me enviaste mas o menos ya tengo la secuencia para iniciar el MAX35101 y la he implementado en Arduino, sin embargo sigue sin darme ningua respuesta.

Se supone que en el datasheet dice que estableciendo los "Calibration and Control Registers" de la forma en la que los pongo se debería activar un pin INT (negado) que dará una salida a nivel bajo cuando el MAX35101 termina una operacion o algo en concreto que dice el datasheet.

También en el datasheet me dice que si se ejecuta la operación de Initialize Command (05h) se deberia activar ese INT pero no ocurre nada...
Sigue sin responder mi micro te dejo el código que he implementado esta vez.
¿Alguna idea de que puede estar mal?

/* TODAS LAS INICIALIZACIONES ECHAS DE LAS CONSTANTES*/

      boolean MAX35101_SendConfigs(void){
  
      MAX35101_Write_Register(0x38, 0x13F1);
      MAX35101_Write_Register(0x39, 0xA3F2);
      MAX35101_Write_Register(0x3A, 0x0809);
      MAX35101_Write_Register(0x3B, 0x0A0B);
      MAX35101_Write_Register(0x3C, 0x0C0D);
      MAX35101_Write_Register(0x3D, 0x0048);
      MAX35101_Write_Register(0x3E, 0x0048);
  
  
      MAX35101_Write_Register(0x3F, 0x0180);          // TOF_DIFF: 0.5s, 4 cycles, Temp: 1s, 2 cycles.
      MAX35101_Write_Register(0x40, 0x0FCF);          // Use calibration, at the beginning of TOF_DIFF and TEMP sequences.
                                                      // Measure T1, T2, T3. PRECYC = 3, PORTCYC = 512us.
  
  
      MAX35101_Write_Register(0x41, 0x0108);
      MAX35101_Write_Register(0x42, 0x0235);  // CMP_EN=0, CMP_SEL=0, INT_EN=1, ET_CONT=0, CONT_INT=0, clock settling=3.9ms, 4MHz calibration=6 32kHz cycles.
 
/*Tambien he probado con la configuracion del ejemplo pero nada
MAX35101_Write_Register(0x42, 0x0343);  // CMP_EN=0, CMP_SEL=0, INT_EN=1, ET_CONT=1, CONT_INT=0, clock settling=5.13ms, 4MHz calibration=4 32kHz cycles.
*/

  
      MAX35101_Write_Register(0x43, 0x0000);  // 32K_BP=0, 32K_EN=0(no 32KOUT), enable 32kHz, no alarm, no watch dog.
  
      sendOrder(TRANSFER_TO_FLASH);
      delay(1000);
      if (digitalRead(INT) == LOW) Serial.println("EXITO");
      return true;
 }
void setup() {
  
  Serial.begin(9600);
  //Start the SPI library:
  //Set the settings 
  SPI.begin();
  SPI.setBitOrder(MSBFIRST); 
  SPI.setDataMode(SPI_MODE1);
  
  // initalize the  data ready and chip select pins:
  pinMode(INT, INPUT);
  pinMode(CE, OUTPUT);
  pinMode(RST, OUTPUT);

 MAX35101_SendConfigs();

 sendOrder(RESET);    //Blindly send the MAX35101 reset, in case it is currently running an Event Timing mode
 delay(100); //Blind wait
 sendOrder(INITIALIZE);   //Send the initialization command, see datasheet
 delay(100); //Blind wait
}

void loop() {

  if (digitalRead(INT) == LOW) Serial.println("EXITO");

 }

void sendOrder(byte orden){
  //take the CE low to select the device
  digitalWrite(CE,LOW);

  SPI.transfer(orden);

  digitalWrite(CE,HIGH);
  
 
 
}

boolean MAX35101_Write_Register(byte reg,unsigned int data){

 byte valido=data>>8;
 byte valido2=data;
  digitalWrite(CE,LOW);

  SPI.transfer(reg);
  SPI.transfer(valido);
  SPI.transfer(valido2);
  
  digitalWrite(CE,HIGH);
}

No obtengo ningun mensaje de "EXITO"

También

En el datasheet dice que esto:
SCK Frequency tCLK VCC ≥ 3.0V (MIN) 20MHz(MAX)

Pienso que la frecuencia no es un problema ya que en Freqency mínima no pone NADA
¿O me equivoco yo y deberia ser 20Mhz (alimento el MAX35101 a 3.3 V del Arduino Nano)?

Una vez mas muchas gracias y saludos.

Cierto, como estas alimentando todo? 3,3V?

Sip a 3.3 V

No es facil responder a tu consulta. Dejame estudiarlo bien.

Vale muchas gracias yo voy a comprobar todo lo que viene siendo la circuiteria y demas, aver si algo estuviese mal.

Si no va volveré a reemplazar el MAX35101 por otro por si estuviese defectuoso (tengo tres y he probado con 2 y no va igualmente).

Gracias