12static uint8_t IAM_20380_readRegister(
IAM_20380_t *, uint8_t);
13static void IAM_20380_writeRegister(
IAM_20380_t *, uint8_t, uint8_t);
37 gyro->
base.sensitivity = sensitivity;
48 memcpy(gyro->
base.
axes, axes, IAM_20380_DATA_COUNT);
49 memcpy(gyro->
base.
sign, sign, IAM_20380_DATA_COUNT);
56 IAM_20380_writeRegister(
59 (IAM_20380_PWR_MGMT_1_RESET
60 | IAM_20380_PWR_MGMT_1_CLKSEL)
65 for (uint32_t i = 0; i < 0x1FFFF; i++);
68 IAM_20380_writeRegister(gyro, IAM_20380_SMPLRT_DIV, 0x07);
71 IAM_20380_writeRegister(gyro, IAM_20380_GYRO_CONFIG, IAM_20380_CONFIG_FS_SEL500);
74 IAM_20380_writeRegister(gyro, IAM_20380_CONFIG, 6);
91 uint8_t bytes[IAM_20380_DATA_TOTAL];
120 for (
int i = 0; i < IAM_20380_DATA_COUNT; i++) {
121 out[i] = (int16_t)(((uint16_t)bytes[i * 2] << 8) | bytes[i * 2 + 1]);
122 out[i] = (out[i] * gyro->
sign[i] * gyro->sensitivity) - gyro->
bias[i];
136#define INDEX_AXES(index, byte) 2 * gyro->axes[index] + byte
137 out[INDEX_AXES(0, 0)] = IAM_20380_readRegister((
IAM_20380_t *)gyro, IAM_20380_XOUT_H);
138 out[INDEX_AXES(0, 1)] = IAM_20380_readRegister((
IAM_20380_t *)gyro, IAM_20380_XOUT_L);
139 out[INDEX_AXES(1, 0)] = IAM_20380_readRegister((
IAM_20380_t *)gyro, IAM_20380_YOUT_H);
140 out[INDEX_AXES(1, 1)] = IAM_20380_readRegister((
IAM_20380_t *)gyro, IAM_20380_YOUT_L);
141 out[INDEX_AXES(2, 0)] = IAM_20380_readRegister((
IAM_20380_t *)gyro, IAM_20380_ZOUT_H);
142 out[INDEX_AXES(2, 1)] = IAM_20380_readRegister((
IAM_20380_t *)gyro, IAM_20380_ZOUT_L);
148void IAM_20380_writeRegister(
IAM_20380_t *gyro, uint8_t address, uint8_t data) {
155 uint8_t payload = address & 0x7F;
162uint8_t IAM_20380_readRegister(
IAM_20380_t *gyro, uint8_t address) {
163 uint8_t response = 0;
170 uint8_t payload = address | 0x80;
171 response = spi->
transmit(spi, payload);
172 response = spi->
transmit(spi, 0xFF);
uint8_t * axes
Array defining axes of mounting.
int8_t * sign
Array defining sign of axes.
void(* readRawBytes)(struct Gyro *, uint8_t *)
Pointer to readRawBytes method.
float * gyroData
Processed angular rates array.
uint8_t * rawGyroData
Raw angular rates array.
void(* update)(struct Gyro *gyro)
Pointer to update method.
float * bias
Bias offset array.
uint8_t dataSize
Total data size.
void(* processRawBytes)(struct Gyro *, uint8_t *, float *)
Pointer to processRawBytes method.
void(* readGyro)(struct Gyro *gyro, float *out)
Pointer to readGyro method.
void(* set)(struct GPIOpin *)
void(* reset)(struct GPIOpin *)
Struct definition for a GPIO pin.
void IAM_20380_processRawBytes(Gyro_t *, uint8_t *, float *)
Process raw 3-axis data to floating point gyro rates.
IAM_20380_t IAM_20380_init(IAM_20380_t *gyro, SPI_t *spi, GPIOpin_t cs, float sensitivity, const uint8_t *axes, const int8_t *sign)
Initialiser for a IAM_20380 gyroscope.
void IAM_20380_readRawBytes(Gyro_t *, uint8_t *)
Read raw 3-axis data.
void IAM_20380_readGyro(Gyro_t *, float *)
Read 3-axis floating point gyro rates.
void IAM_20380_update(Gyro_t *)
Updates internally stored gyro readings.
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...
uint8_t rawGyroData[IAM_20380_DATA_TOTAL]
Raw gyro rates array.
float gyroData[IAM_20380_DATA_COUNT]
Processed gyro rates array.
float bias[IAM_20380_DATA_COUNT]
Bias offset array.
GPIOpin_t cs
Chip select GPIO.
Gyro_t base
Base gyroscope API.
uint8_t axes[IAM_20380_DATA_COUNT]
Array defining axes of mounting.
int8_t sign[IAM_20380_DATA_COUNT]
Array defining sign of axes.
SPI_t * spi
Parent SPI interface.