Arduino SPI connection WHO_AM_I register en IMU

0

Tengo un sensor de unidad de medida inercial (IMU) que se comunica a través de SPI. Yo uso Mega2560.

Quiero leer un simple WHO_AM_I register.

En la documentación:

  

Características operativas de SPI

     
  1. Los datos se entregan primero en MSB y en último LSB
  2.   
  3. Los datos están bloqueados en el borde ascendente de SCLK
  4.   
  5. Los datos deben ser transicionados en el borde descendente de SCLK
  6.   
  7. La frecuencia máxima de SCLK es 1MHz
  8.   
  9. Las operaciones de lectura y escritura de SPI se completan en 16 o más ciclos de reloj (dos o más bytes). El primer byte contiene la dirección SPI, y el siguiente (s) byte (s) contiene los datos SPI. El primer bit del primer byte contiene el bit de lectura / escritura e indica la operación de lectura (1) o escritura (0). Los siguientes 7 bits contienen la dirección de registro. En los casos de lectura / escritura de múltiples bytes, los datos son de dos o más bytes:
  10.   

Formato de dirección SPI

MSB              LSB
R/W  A6  A5  A4  A3  A2  A1  A0
     

Formato de datos SPI

MSB              LSB
D7  D6  D5  D4  D3  D2  D1  D0

En Registermap WHO_AM_I:

Hex Add / Dec Add /  Register Name / Serial I/F / bit7 / bit 6 ..... bit 0
75 / 117 / WHO_AM_I / R /  WHOAMI[7:0]

Asignaciones de pines:
51 > SDI
52 > SCLK
50 > SDO/ADO
53 > CS
#include <SPI.h> //add arduino SPI library;
//list of all registers binary addresses;
byte WHO_AM_I           = 0B01110101;


byte Read  = 0B10000000;
byte Write = 0B00000000;

//chip select pin on arduino;
const int CS = 53;
/*
SPI.h sets these for us in arduino
const int SDI = 11;
const int SDO = 12;
const int SCL = 13;
*/

void setup() {
  Serial.begin(57600);
  //start the SPI library;
  SPI.begin();
  //initalize the chip select pins;
  pinMode(CS, OUTPUT);

}

void loop() {

byte rValue = ReadRegister(WHO_AM_I);

Serial.print(Read | WHO_AM_I,BIN);
Serial.print(" > Value: ");
Serial.println(rValue);
delay(1000);

}

byte ReadRegister(byte Address){
  byte result = 0;
  digitalWrite(CS, LOW); 
  SPI.transfer(Read | Address);
  result = SPI.transfer(0x00);
  digitalWrite(CS, HIGH);
return(result);  
}

void WriteRegister(byte Address, byte Value){
  digitalWrite(CS, LOW);
  SPI.transfer(Write | Address);
  SPI.transfer(Value);
  digitalWrite(CS, HIGH);
}

Pero devolvió 0.

    
pregunta Rnomad

1 respuesta

1

Te estás perdiendo:

  • SPI.setClockDivider (SPI_CLOCK_DIV16); // 1MHZ MAX SPEED. Si está utilizando 16MHZ
  • SPI.setBitOrder (MSBFIRST);
  • SPI.setDataMode(SPI_MODE0 );

  • Desactivar el registro en modo I2C

respondido por el Luis Carlos

Lea otras preguntas en las etiquetas