Recapturé datos y dibujé la temperatura individualmente contra cada eje del magnetómetro. De los gráficos a continuación, es evidente que los datos de temperatura eran en realidad los datos del eje x.
CreoqueestosedebeaqueelincrementoautomáticodeladirecciónSPInofuncionacomoseesperaba.Parecequese"envuelve" solo dentro de los registros mag x / y / z, y no va a los registros de temperatura adyacentes. Mi código original era:
#define OUT_X_L 0x28
#define OUT_X_H 0x29
#define OUT_Y_L 0x2A
#define OUT_Y_H 0x2B
#define OUT_Z_L 0x2C
#define OUT_Z_H 0x2D
#define TEMP_OUT_L 0x2E
#define TEMP_OUT_H 0x2F
#define SPI_READ_BURST_START OUT_X_L
uint8_t buf[8]; // xyz, temp
...
spiReadBurstLIS3MDL(SPI_READ_BURST_START, buf, sizeof(buf));
Serial.print(micros());
Serial.print("\t");
Serial.print((int16_t)((buf[1] << 8) | buf[0])); // x
Serial.print("\t");
Serial.print((int16_t)((buf[3] << 8) | buf[2])); // y
Serial.print("\t");
Serial.print((int16_t)((buf[5] << 8) | buf[4])); // z
Serial.print("\t");
Serial.print((((int16_t)((buf[7] << 8) | buf[6])) / 256.0) + 25.0); // temp
Serial.print("\n");
Pero después de cambiar a lo siguiente, la salida de temperatura es la esperada:
...
uint8_t buf[6]; // xyz
int16_t temp;
...
spiReadBurstLIS3MDL(SPI_READ_BURST_START, buf, sizeof(buf));
temp = 0xFF & spiReadLIS3MDL(TEMP_OUT_L);
temp |= spiReadLIS3MDL(TEMP_OUT_H) << 8;
Serial.print(micros());
Serial.print("\t");
Serial.print((int16_t)((buf[1] << 8) | buf[0])); // x
Serial.print("\t");
Serial.print((int16_t)((buf[3] << 8) | buf[2])); // y
Serial.print("\t");
Serial.print((int16_t)((buf[5] << 8) | buf[4])); // z
Serial.print("\t");
Serial.print((temp / 256.0) + 25.0); // temp
Serial.print("\n");
Gracias por toda la entrada. Era un problema tonto con las comunicaciones serie, después de todo, nada que ver con el sensor.