29 char name[DEVICE_NAME_LENGTH],
42 memcpy(gyro->
axes, axes, A3G4250D_DATA_COUNT);
43 memcpy(gyro->
sign, sign, A3G4250D_DATA_COUNT);
45 const uint32_t superDelay = 0xFFFF;
46 volatile uint8_t counter = 0;
49 for (uint32_t i = 0; i < superDelay; i++) {
53 A3G4250D_writeRegister(gyro, A3G4250D_CTRL_REG1, A3G4250D_CTRL_REG1_ODR_800Hz | A3G4250D_CTRL_REG1_AXIS_ENABLE | A3G4250D_CTRL_REG1_PD_ENABLE);
56 strcpy(handle.name, name);
73 uint8_t bytes[A3G4250D_DATA_TOTAL];
102 out[0] = gyro->
sign[0] * gyro->
sensitivity * (int16_t)(((uint16_t)bytes[0] << 8) | bytes[1]);
103 out[1] = gyro->
sign[1] * gyro->
sensitivity * (int16_t)(((uint16_t)bytes[2] << 8) | bytes[3]);
104 out[2] = gyro->
sign[2] * gyro->
sensitivity * (int16_t)(((uint16_t)bytes[4] << 8) | bytes[5]);
117#define INDEX_AXES(index, byte) 2 * gyro->axes[index] + byte
118 out[INDEX_AXES(0, 0)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_X_H);
119 out[INDEX_AXES(0, 1)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_X_L);
120 out[INDEX_AXES(1, 0)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_Y_H);
121 out[INDEX_AXES(1, 1)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_Y_L);
122 out[INDEX_AXES(2, 0)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_Z_H);
123 out[INDEX_AXES(2, 1)] = A3G4250D_readRegister(gyro, A3G4250D_OUT_Z_L);
129void A3G4250D_writeRegister(
A3G4250D *gyro, uint8_t address, uint8_t data) {
132 spi.
port->ODR &= ~spi.cs;
135 uint8_t payload = address & 0x7F;
142uint8_t A3G4250D_readRegister(
A3G4250D *gyro, uint8_t address) {
143 uint8_t response = 0;
146 spi.
port->ODR &= ~spi.cs;
149 uint8_t payload = address | 0x80;
150 response = spi.
transmit(&spi, payload);
151 response = spi.
transmit(&spi, 0xFF);
void A3G4250D_processRawBytes(A3G4250D *, uint8_t *, float *)
Process raw 3-axis data to floating point gyro rates.
void A3G4250D_readGyro(A3G4250D *, float *)
Read 3-axis floating point gyro rates.
void A3G4250D_readRawBytes(A3G4250D *, uint8_t *)
Read raw 3-axis data.
DeviceHandle_t A3G4250D_init(A3G4250D *gyro, char name[DEVICE_NAME_LENGTH], GPIO_TypeDef *port, unsigned long cs, float sensitivity, const uint8_t *axes, const int8_t *sign)
Initialiser for a A3G4250D gyroscope.
void A3G4250D_update(A3G4250D *)
Updates internally stored gyro readings.
void SPI_init(SPI *, DeviceType, SPI_TypeDef *, DataFormat, GPIO_TypeDef *, unsigned long)
Initialiser for an SPI device interface.
uint8_t rawGyroData[A3G4250D_DATA_TOTAL]
Raw gyro rates array.
SPI base
Parent SPI interface.
void(* readRawBytes)(struct A3G4250D *, uint8_t *)
Raw gyro read method.
int8_t sign[A3G4250D_DATA_COUNT]
Array defining sign of axes.
uint8_t axes[A3G4250D_DATA_COUNT]
Array defining axes of mounting.
void(* readGyro)(struct A3G4250D *, float *)
Gyro read method.
float sensitivity
Gyroscope sensitivity.
void(* processRawBytes)(struct A3G4250D *, uint8_t *, float *)
Process raw gyro method.
void(* update)(struct A3G4250D *)
Gyro update method.
float gyroData[A3G4250D_DATA_COUNT]
Processed gyro rates array.
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
GPIO_TypeDef * port
Pointer to GPIO port struct.
unsigned long cs
Device chip select address.