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
- Los datos se entregan primero en MSB y en último LSB
- Los datos están bloqueados en el borde ascendente de SCLK
- Los datos deben ser transicionados en el borde descendente de SCLK
- La frecuencia máxima de SCLK es 1MHz
- 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:
Formato de dirección SPI
MSB LSB R/W A6 A5 A4 A3 A2 A1 A0Formato 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.