Создание собственной системы стабилизации
Хватит, и можно клон NAZE 32 сварганить, я просто хочу по SPI, после СС чёт I2C не вставляет, хотя на данный момент вроде без ошибок работает…
ну так ставте 6000 и будет SPI … правда они в отличии от 6050 пока в дефиците …
Первый запуск драйвера ничего не дал, не определилась LSMка 😦
аааа, а в автодетект кто править будет:)
Чёт я не могу въехать
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(ADXL345_ADDRESS, 0x00, 1, &sig); // вот тут немогу разобратся что вычитывается из акселя, я так понимаю что и ack и sig присваивается значение 0хЕ5 это id устройства, к чему привязатся в LSM?
if (!ack || sig != 0xE5) // но тут же неack
return false;
Аксель определился, но читатся отказывается…
# statusshow
System Uptime: 863 seconds, Voltage: 0 * 0.1V (2S battery)
Detected sensors: ACC BARO MAG ACCHW: lsm330acc
Cycle Time: 1150, I2C Errors: 0
#
Беда с автоопределением, я подцепился к первому регистру (он единственный с ненулевыми показаниями) - определился, но что бы аксель заработал, этот регистр программировать надо, а так как я его щас запрограммировал, аксель уже не определяется, бядааа… 😦
да проверил свою догадку, надо искать другой способ автоопределения…
придумал, оси всегда включены, значит надо вычитать, только три младших байта из регистра, они будут всегда постоянны, вопрос как это сделать?
вычитать регистр, сместить <<5 получим число E0 его и примем за сигнатуру?
Можно ли так записать?
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A << 5, 1, &sig);
Что то у вас всё сложно. В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?
Умолчательное значение 00000111b
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(ADXL345_ADDRESS, 0x20, 1, &sig); // если я правильно понимаю параметры функции читаем аксель по адресу 0x20
if (!ack || sig != 0x07) // тут либо NACK, либо считанное занчение не равно 7
return false;
вот вроде так
ps точнее так
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A, 1, &sig);
сдвигать внутренний адрес акселя не нужно!
Решил проблему так:
bool LSM330ACCDetect(sensor_t *acc)
{
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
ack = ack <<5;
sig = sig <<5;
if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
acc->init = LSM330ACCInit;
acc->read = LSM330ACCRead;
acc->align = LSM330ACCAlign;
return true;
}
Я просто потом перезаписываю регистр как мне надо, и всё приплыли нет аксела на следующем старте, сейчас всё заработало 😃
Сгирой постораюсь обойтись проще, типа есть такой аксель значит и гира такая же…
В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?
у Таймкопа автоопределение датчиков написано - типа какие установлены, так вот я туда lsm-ку и пристраиваю
у переменной ack булевый тип, некрасиво его сдигать )
зато работает 😃 определяется аксель без проблем 😃
а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво
а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво
нее, не так. в ack функция выгружает наличие/отсутсвие ответа от ведмого устройства. Т.е. если ack = true, то устройство ответило, если false что ответа не было.
if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
тогда вот это загадка…
в таком случае надо
bool LSM330ACCDetect(sensor_t *acc)
{
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
sig = sig <<5;
if ( sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
acc->init = LSM330ACCInit;
acc->read = LSM330ACCRead;
acc->align = LSM330ACCAlign;
return true;
}
Вот что вышло
#include "board.h"
#define LSM330ACC_ADDRESS 0x19
#define LSM330ACC_DEVICE_SIGNATURE 0xE0
#define LSM330_CTRL_REG1_A 0x20 /* rw */
#define LSM330_CTRL_REG2_A 0x21 /*rw */
#define LSM330_CTRL_REG3_A 0x22 /*rw */
#define LSM330_CTRL_REG4_A 0x23 /*rw */
#define LSM330_CTRL_REG5_A 0x24 /*rw */
#define LSM330_CTRL_REG6_A 0x25 /*rw */
#define LSM330_REF_DCAPTURE_A 0x26 /*rw */
#define LSM330_STATUS_REG_A 0x27 /*r */
#define LSM330_OUT_X_L_A 0x28 /*r */
//#define LSM330_OUT_X_H_A 0x29 /*r */
//#define LSM330_OUT_Y_L_A 0x2A /*r */
//#define LSM330_OUT_Y_H_A 0x2B /*r */
//#define LSM330_OUT_Z_L_A 0x2C /*r */
//#define LSM330_OUT_Z_H_A 0x2D /*r */
#define LSM330_FIFO_CTRL_REG_A 0x2E /*rw */
#define LSM330_FIFO_SRC_REG_A 0x2F /*r */
#define LSM330_INT1_CFG_A 0x30 /*rw */
#define LSM330_INT1_SRC_A 0x31 /*r */
#define LSM330_INT1_THS_A 0x32 /*rw */
#define LSM330_INT1_DURATION_A 0x33 /*rw */
#define LSM330_INT2_CFG_A 0x34 /*rw */
#define LSM330_INT2_SOURCE_A 0x35 /*r */
#define LSM330_INT2_THS_A 0x36 /*rw */
#define LSM330_INT2_DURATION_A 0x37 /*rw */
#define LSM330_CLICK_CFG_A 0x38 /*rw */
#define LSM330_CLICK_SRC_A 0x39 /*rw */
#define LSM330_CLICK_THS_A 0x3A /*rw */
#define LSM330_TIME_LIMIT_A 0x3B /*rw */
#define LSM330_TIME_LATENCY_A 0x3C /*rw */
#define LSM330_TIME_WINDOW_A 0x3D /*rw */
/* LSM330_CTRL_REG1_A */
#define LSM330_A_ODR_PDN 0x0 /* Power-down mode */
#define LSM330_A_ODR_1 0x10 /* Normal / low-power mode (1 Hz) */
#define LSM330_A_ODR_10 0x20 /* Normal / low-power mode (10 Hz) */
#define LSM330_A_ODR_25 0x30 /* Normal / low-power mode (25 Hz) */
#define LSM330_A_ODR_50 0x40 /* Normal / low-power mode (50 Hz) */
#define LSM330_A_ODR_100 0x50 /* Normal / low-power mode (100 Hz) */
#define LSM330_A_ODR_200 0x60 /* Normal / low-power mode (200 Hz) */
#define LSM330_A_ODR_400 0x70 /* Normal / low-power mode (400 Hz) */
#define LSM330_A_ODR_LP162 0x80 /* Low-power mode (1.620 kHz) */
#define LSM330_A_ODR_HI 0x81 /* Normal (1.344 kHz) / low-power mode (5.376 kHz) */
#define LSM330_A_Acsis 0X7
/* CTRL_REG2_A */
#define LSM330_A_HPM0 0 /* Normal mode (reset reading HP_RESET_FILTER)*/
#define LSM330_A_HPM1 0x40 /* Reference signal for filtering */
#define LSM330_A_HPM2 0x80 /* Normal mode */
#define LSM330_A_HPM3 0xc0 /* Autoreset on interrupt event */
#define LSM330_A_HPCF0 0 /* High-pass filter cutoff frequency selection */
#define LSM330_A_HPCF1 0x10 /* High-pass filter cutoff frequency selection */
#define LSM330_A_HPCF2 0x20 /* High-pass filter cutoff frequency selection */
#define LSM330_A_HPCF3 0x30 /* High-pass filter cutoff frequency selection */
#define LSM330_A_FDS 0x08 /* Filtered data selection. Default value: 0 (0: internal filter bypassed; 1: data from internal filter sent to output register and FIFO) */
/* CTRL_REG3_A */
#define LSM330_A_I1_CLICK 0x80 /* CLICK interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
#define LSM330_A_I1_AOI1 0x40 /* AOI1 interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
#define LSM330_A_I1_DRDY1 0x10 /* DRDY1 interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable) */
#define LSM330_A_I1_DRDY2 0x08 /* DRDY2 interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable) */
#define LSM330_A_I1_WTM 0x04 /* FIFO watermark interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable)*/
#define LSM330_A_I1_OVERRUN 0x02 /* FIFO overrun interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
/*CTRL_REG4_A */
#define LSM330_BDU 0x80 /* Block data update. Default value: 0(0: continuous update; 1: output registers not updated until MSB and LSB reading) */
#define LSM330_BLE 0x40 /* Big/little endian data selection. Default value 0.(0: Data LSB at lower address; 1: Data MSB at lower address) */
/*FS1-FS0 Full-scale selection. default value: 00 (00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G) */
#define LSM330_A_FS2G 0
#define LSM330_A_FS4G 0x10
#define LSM330_A_FS8G 0x20
#define LSM330_A_FS16G 0x30
#define LSM330_A_HR 0x08 /*Normal mode: default value: 0(0: normal mode disable; 1: normal mode enable */
#define LSM330_SIM 0x01 /* SPI serial interface mode selection. Default value: 0(0: 4-wire interface; 1: 3-wire interface) */
/* CTRL_REG5_A */
#define LSM330_A_BOOT 0x80 /* Reboot memory content. Default value: 0 (0: normal mode; 1: reboot memory content) */
#define LSM330_A_FIFO_EN 0x40 /* FIFO enable. Default value: 0(0: FIFO disable; 1: FIFO enable) */
#define LSM330_A_LIR_INT1 0x08 /* Latch interrupt request on INT1_SRC_A register, with INT1_SRC_A register cleared by reading INT1_SRC_A itself. Default value: 0.(0: interrupt request not latched; 1: interrupt request latched) */
#define LSM330_A_D4D_INT1 0x04 /* 4D enable: 4D detection is enabled on INT1_A when 6D bit on INT1_CFG_A is set to 1. */
/* CTRL_REG6_A */
#define LSM330_A_I2_CLICKen 0x80 /* Click interrupt on INT2_A. Default value 0. */
#define LSM330_A_I2_INT1 0x40 /* Interrupt 1 function enabled on INT2_A. Default 0. */
#define LSM330_A_BOOT_I2 0x10 /* Boot on INT2_A. */
#define LSM330_A_H_LACTIVE 0x02 /* 0: interrupt active high; 1: interrupt active low. */
/* STATUS_REG_A */
#define LSM330_A_ZYXOR 0x80 /* X-, Y- and Z-axis data overwrite. Default value: 0 (0: no overwrite has occurred; 1: a new set of data has overwritten the previous ones) */
#define LSM330_A_ZOR 0x40 /* Z-axis data overwrite. Default value: 0(0: no overrun has occurred; 1: a new data for the Z-axis has overwritten the previous one) */
#define LSM330_A_YOR 0x20 /* Y-axis data overwrite. Default value: 0 (0: no overwrite has occurred;1: new data for the Y-axis has overwritten the previous data) */
#define LSM330_A_XOR 0x10 /* X-axis data overwrite. Default value: 0 (0: no overwrite has occurred;1: new data for the X-axis has overwritten the previous data) */
#define LSM330_A_ZYXDA 0x08 /* X-, Y- and Z-axis new data available. Default value: 0(0: a new set of data is not yet available; 1: a new set of data is available) */
#define LSM330_A_ZDA 0x04 /* Z-axis new data available. Default value: 0(0: new data for the Z-axis is not yet available;1: new data for the Z-axis is available) */
#define LSM330_A_YDA 0x02 /* Y-axis new data available. Default value: 0 (0: new data for the Y-axis is not yet available;1: new data for the Y-axis is available) */
#define LSM330_A_XDA 0x01 /* X-axis new data available. Default value: 0 (0: new data for the X-axis is not yet available;1: new data for the X-axis is available) */
extern uint16_t acc_1G;
static void LSM330ACCInit(void);
static void LSM330ACCRead(int16_t *accelData);
static void LSM330ACCAlign(int16_t *accelData);
bool LSM330ACCDetect(sensor_t *acc)
{
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
sig = sig <<5;
if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
acc->init = LSM330ACCInit;
acc->read = LSM330ACCRead;
acc->align = LSM330ACCAlign;
return true;
}
static void LSM330ACCInit(void)
{
i2cWrite(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A, LSM330_A_ODR_100 | LSM330_A_Acsis );
i2cWrite(LSM330ACC_ADDRESS, LSM330_CTRL_REG4_A, LSM330_A_FS4G );
acc_1G = 512;
}
static void LSM330ACCRead(int16_t *accelData)
{
uint8_t buf[6];
i2cRead(LSM330ACC_ADDRESS, LSM330_OUT_X_L_A, 6, buf);
accelData[0] = (buf[1] << 8) | buf[0];
accelData[1] = (buf[3] << 8) | buf[2];
accelData[2] = (buf[5] << 8) | buf[4];
accelData[0] >>= 2;
accelData[1] >>= 2;
accelData[2] >>= 2;
}
static void LSM330ACCAlign(int16_t *accelData)
{
int16_t temp[2];
temp[0] = accelData[0];
temp[1] = accelData[1];
// official direction is RPY
accelData[0] = temp[1] / 32;
accelData[1] = -temp[0] / 32;
accelData[2] = accelData[2] / 32;
}
но бяка полная 😦
#define LSM330ACC_ADDRESS 0x19
А почему именно такой адрес? Вроде,если верить инструкции на чтение либо 0Х30,либо 0Х32 в зависимости от подключения.
Семи биный, не восьми…
BMP085, Standard address 0x77
HMC5883L, default address 0x1E
ADXL345, Alternative address mode 0x53
#define LSM330_A_Acsis 0X7
А это за что отвечает?
addr = addr_ << 1;
reg = reg_;
writing = 1;
reading = 0;
write_p = my_data;
read_p = my_data;
bytes = len_;
busy = 1;
чтение и запись со cдвигом адреса уже прописаны в драйвере i2c
А это за что отвечает?
прописываю включение всех трёх осей…
ради экперимента можно в первый регистр число послать 0Х57 получится LSM330_A_ODR_100 0x50 /* Normal / low-power mode (100 Hz) */
- LSM330_A_Acsis 0X7
тьфу надо писать 0Х07 😦
завтра попробую обнулить все регистры акселя и ещё раз попробую…
Опять беда, решил гиру нарисовать ииии опа температура то восьмибитная - старая давно забытая проблема как знак не потерять, ладно предположим что можно записать в char, потом придумать делитель ну а дальше опять танцы с бубном…
меряем от -40 до +85, если -40 будет равно -178 а +85 равно 177😵
делитель 2 но надо ещё ноль сместить
Написал драйвер для гиры, на сколько могу судить определяется, так как, в родной паршивке нет такого понятия, пришлось для уверенности, что обращается к драйверу сделать ещё одну проверку акселя, по крайней мере раз аксель проверяет два раза значит цепляет и гиру, но бяка та-же что и с акселем, пока в растерянности…
надоест извращатся прямо в sensor.c пропишу датчики
Вот драйвер для гиры:
#include "board.h"
#define LSM330GYRO_ADDRESS 0x69
//#define LSM330GYRO_DEVICE_SIGNATURE 0xE0
#define LSM330ACC_ADDRESS 0x19
#define LSM330ACC_DEVICE_SIGNATURE 0xE0
#define LSM330_CTRL_REG1_A 0x20 /* rw */
/* адреса регистров гироскопа */
#define LSM330_CTRL_REG1_G 0x20 /*rw */
#define LSM330_CTRL_REG2_G 0x21 /*rw */
#define LSM330_CTRL_REG3_G 0x22 /*rw */
#define LSM330_CTRL_REG4_G 0x23 /*rw */
#define LSM330_CTRL_REG5_G 0x24 /*rw */
#define LSM330_REF_DCAPTURE_G 0x25 /*rw */
#define LSM330_OUT_TEMP_G 0x26 /*r */
#define LSM330_STATUS_REG_G 0x27 /*r */
#define LSM330_OUT_X_L_G 0x28 /*r */
#define LSM330_OUT_X_H_G 0x29 /*r */
#define LSM330_OUT_Y_L_G 0x2A /*r */
#define LSM330_OUT_Y_H_G 0x2B /*r */
#define LSM330_OUT_Z_L_G 0x2C /*r */
#define LSM330_OUT_Z_H_G 0x2D /*r */
#define LSM330_FIFO_CTRL_REG_G 0x2E /*rw */
#define LSM330_FIFO_SRC_REG_G 0x2F /*r */
#define LSM330_INT1_CFG_G 0x30 /*rw */
#define LSM330_INT1_SRC_G 0x31 /*r */
#define LSM330_INT1_THS_XH_G 0x32 /*rw */
#define LSM330_INT1_THS_XL_G 0x33 /*rw */
#define LSM330_INT1_THS_YH_G 0x34 /*rw */
#define LSM330_INT1_THS_YL_G 0x35 /*rw */
#define LSM330_INT1_THS_ZH_G 0x36 /*rw */
#define LSM330_INT1_THS_ZL_G 0x37 /*rw */
#define LSM330_INT1_DURATION_G 0x38 /*rw */
/* CTRL_REG1_G */
/* DR and BW configuration setting _ODR [Hz]_cutoff [Hz] */
#define LSM330_G_DR100BW12_5 0x00
#define LSM330_G_DR100BW25 0x30
#define LSM330_G_DR200BW12_5 0x40
#define LSM330_G_DR200BW25 0x50
#define LSM330_G_DR200BW50 0x60
#define LSM330_G_DR200BW70 0x70
#define LSM330_G_DR400BW20 0x80
#define LSM330_G_DR400BW25 0x90
#define LSM330_G_DR400BW50 0xA0
#define LSM330_G_DR400BW110 0xB0
#define LSM330_G_DR800BW30 0xC0
#define LSM330_G_DR800BW35 0xD0
#define LSM330_G_DR800BW50 0xE0
#define LSM330_G_DR800BW110 0xF0
#define LSM330_G_PD 0x08 /* Power-down mode enable. Default value: 0 (0: power-down mode, 1: normal mode or sleep mode) */
/* CTRL_REG2_G */
#define LSM330_G_HPM0 0 /* Normal mode (reset reading HP_RESET_FILTER)*/
#define LSM330_G_HPM1 0x10 /* Reference signal for filtering */
#define LSM330_G_HPM2 0x20 /* Normal mode */
#define LSM330_G_HPM3 0x30 /* Autoreset on interrupt event */
/* High-pass filter cutoff frequency configuration [Hz] */
/* HPCF3-0 ODR = 100 Hz ODR = 200 Hz ODR = 400 Hz ODR = 800 Hz */
#define LSM330_G_HPC0 0x00 /* 8 15 30 56 */
#define LSM330_G_HPC1 0x01 /* 4 8 15 30 */
#define LSM330_G_HPC2 0x02 /* 2 4 8 15 */
#define LSM330_G_HPC3 0x03 /* 1 2 4 8 */
#define LSM330_G_HPC4 0x04 /* 0.5 1 2 4 440 */
#define LSM330_G_HPC5 0x05 /* 0.2 0.5 1 2 220 */
#define LSM330_G_HPC6 0x06 /* 0.1 0.2 0.5 1 110 */
#define LSM330_G_HPC7 0x07 /* 0.05 0.1 0.2 0.5 55 */
#define LSM330_G_HPC8 0x08 /* 0.02 0.05 0.1 0.2 22 */
#define LSM330_G_HPC9 0x09 /* 0.01 0.02 0.05 0.1 11 */
/* CTRL_REG3_G */
#define LSM330_G_I1_Int1 0x80 /* Interrupt enable on INT1_G pin. Default value 0. (0: Disable; 1: Enable)*/
#define LSM330_G_I1_Boot 0x40 /* Boot status available on INT1_G. Default value 0. (0: Disable; 1: Enable) */
#define LSM330_G_H_Lactive 0x20 /* Interrupt active configuration on INT1_G. Default value 0. (0: High; 1:Low) */
#define LSM330_G_PP_OD 0x10 /* Push-Pull / Open drain. Default value: 0. (0: Push-Pull; 1: Open drain) */
#define LSM330_G_I2_DRDY 0x08 /* Date Ready on DRDY_G/INT2_G. Default value 0. (0: Disable; 1: Enable) */
#define LSM330_G_I2_WTM 0x04 /* FIFO watermark interrupt on DRDY_G/INT2_G. Default value: 0. (0: Disable; 1: Enable)*/
#define LSM330_G_I2_ORun 0x02 /* FIFO overrun interrupt on DRDY_G/INT2_G Default value: 0. (0: Disable; 1: Enable) */
#define LSM330_G_I2_Empty 0x01 /* FIFO empty interrupt on DRDY_G/INT2_G. Default value: 0. (0: Disable; 1: Enable) */
/* CTRL_REG4_G */
/* FS1-FS0 Full-scale selection. Default value: 00 (00: 250 dps; 01: 500 dps; 10: 2000 dps; 11: 2000 dps)*/
#define LSM330_G_FS250 0
#define LSM330_G_FS500 0x10
#define LSM330_G_FS2000 0x20
/* CTRL_REG5_G */
#define LSM330_G_BOOT 0x80 /* Reboot memory content. Default value: 0(0: normal mode; 1: reboot memory content) */
#define LSM330_G_FIFO_EN 0x40 /* FIFO enable. Default value: 0(0: FIFO disable; 1: FIFO Enable) */
#define LSM330_G_HPen 0x20 /* High-pass filter enable. Default value: 0(0: HPF disabled; 1: HPF enabled ) */
/* INT1_Sel1-INT1_Sel0 INT1 selection configuration. Default value: 0 */
#define LSM330_G_INT1_HPF 0x04 /* High-pass-filtered data are used for interrupt generation */
#define LSM330_G_INT1_LPF2 0x08 /* High-pass and low-pass-filtered data are used for interrupt generation */
/* Out selection configuration. Default value: 0 */
#define LSM330_G_OUT_HPF 0x01 /* Data in DataReg and FIFO are high-passfiltered */
#define LSM330_G_OUT_LPF2 0x02 /* Data in DataReg and FIFO are low-passfiltered by LPF2 */
/* STATUS_REG_G */
#define LSM330_G_ZYXOR 0x80 /* X-, Y-, Z-axis data overwrite. Default value: 0
(0: no overwrite has occurred; 1: new data has overwritten
the previous data before it wasread) */
#define LSM330_G_ZOR 0x40 /* Z-axis data overwrite. Default value: 0
(0: no overwrite has occurred; 1: new data for the Z-axis
has overwritten the previous data) */
#define LSM330_G_YOR 0x20 /* Y-axis data overwrite. Default value: 0(0: no overwrite has occurred;
1: new data for the Y-axis has overwritten the previous data) */
#define LSM330_G_XOR 0x10 /* X-axis data overwrite. Default value: 0 (0: no overwrite has occurred;
1: new data for the X-axis has overwritten the previous data) */
#define LSM330_G_ZYXDA 0x08 /*X-, Y-, Z-axis new data available. Default value: 0 (0: a new set of data is not yet available;
1: a new set of data is available) */
#define LSM330_G_ZDA 0x04 /* Z-axis new data available. Default value: 0 (0: new data for the Z-axis is not yet available;
1: new data for the Z-axis is available) */
#define LSM330_G_YDA 0x02 /* Y-axis new data available. Default value: 0 (0: new data for the Y-axis is not yet available;
1: new data for the Y-axis is available) */
#define LSM330_G_XDA 0x01 /* X-axis new data available. Default value: 0 (0: new data for the X-axis is not yet available;
1: new data for the X-axis is available) */
static void lsm330gyroInit(void);
static void lsm330gyroRead(int16_t *gyroData);
static void lsm330gyroAlign(int16_t *gyroData);
static uint8_t mpuLowPassFilter = LSM330_G_HPC7;
bool lsm330gyroDetect(sensor_t *gyro)
{
bool ack = false;
uint8_t sig = 0;
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
sig = sig <<5;
if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;
gyro->init = lsm330gyroInit;
gyro->read = lsm330gyroRead;
gyro->align = lsm330gyroAlign;
return true;
}
void lsm330gyroConfig(uint16_t lpf)
{
switch (lpf) {
case 256:
mpuLowPassFilter = LSM330_G_HPC4;
break;
case 188:
mpuLowPassFilter = LSM330_G_HPC5;
break;
case 98:
mpuLowPassFilter = LSM330_G_HPC6;
break;
case 42:
mpuLowPassFilter = LSM330_G_HPC7;
break;
case 20:
mpuLowPassFilter = LSM330_G_HPC8;
break;
case 10:
mpuLowPassFilter = LSM330_G_HPC9;
break;
}
i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG4_G, LSM330_G_FS2000);
i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG2_G, mpuLowPassFilter);
}
static void lsm330gyroInit(void)
{
delay(5);
i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG1_G, 0xBF);
//
}
static void lsm330gyroAlign(int16_t *gyroData)
{
// official direction is RPY
gyroData[0] = gyroData[0] / 4;
gyroData[1] = gyroData[1] / 4;
gyroData[2] = -gyroData[2] / 4;
}
// Read 3 gyro values into user-provided buffer. No overrun checking is done.
static void lsm330gyroRead(int16_t *gyroData)
{
uint8_t buf[6];
i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G, 6, buf);
gyroData[0] = (buf[1] << 8) | buf[0];
gyroData[1] = (buf[3] << 8) | buf[2];
gyroData[2] = (buf[5] << 8) | buf[4];
}
/*static int16_t lsm330gyroReadTemp(void)
{
char buf[1];
i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_TEMP_G, 1, buf);
return 35 + ((int32_t)(buf[0]) + 13200) / 280;
}*/
результат тотже что и с акселем, устройство обнаружено, а дальше полная бяка в показаниях, значит что-то не так делаю? если кто-то что заметит ткните носом пожалуйста…