STM32F103C +2 MPU6050 на 2 I2C
- Войдите на сайт для отправки комментариев
Пт, 14/10/2016 - 11:11
Имеется STM32F103C 
Среда 1.61.12 установлено ядро Arduino Due
установлена библиотека MPU6050
подключены 2 шт MPU6050 к 2м I2C
с загруженным примером MPU6050_raw с одного датчика идут данные.
вопрос: как задействовать второй датчик на второй шине вместе с первым?
А библиотека Wire умеет 2 сразу использовать? Код библиотеки покажите.
Вот она. Похоже что не умеет(
https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1...
А что бы не задействовать их оба на одной шине? Есть какие-то жесткие требования по быстродействию?
Вот она. Похоже что не умеет(
https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1...
на втором датчике меняете адрес на 0х69 и подключаете к этой же шине :)
Вот она. Похоже что не умеет(
https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1...
По приведенной ссылке конструктор выглядит так
HardWire::HardWire(uint8 dev_sel, uint8 flags) { if (dev_sel == 1) { sel_hard = I2C1; } else if (dev_sel == 2) { sel_hard = I2C2; } else { ASSERT(1); } dev_flags = flags; }Не трудно заметить, что может работать с двумя I2C
Умеет, но с трудом. Ниже работающий код, читающий данные с MPU5060 через второй I2C. Он обвешан тестовыми точками и генерирует стартовый импульс для лог анализатора - это я искал почему код, работающий по I2C1, не работает при переходе на I2C2. ЗЫ Что надо нажать, чтобы код убрать под спойлер? #include <stdint.h> #include <HardWire.h> HardWire H2Wire(2, I2C_FAST_MODE); // I2c1 #define START PB0 int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup() { H2Wire.begin(); Serial.begin(115200); pinMode(PC13, OUTPUT); digitalWrite(PC13, 1); long time = millis(); while (!Serial.available() and (millis()-time < 2000)) //ждем данных для приема не более 2 секунд delay(20); digitalWrite(PC13, 0); pinMode(START, OUTPUT); //синхроимпульс для лог анализатора digitalWrite(START,HIGH); Serial.print("TP0 "); digitalWrite(START,LOW); Serial.print(millis()); Serial.print(" TP1 "); H2Wire.begin(); Serial.print(" TP2 "); H2Wire.beginTransmission(0x68); //77 Serial.print(" TP3 "); H2Wire.write(0x6B); Serial.print(" TP4 "); H2Wire.write(0x00); Serial.println("TP5 "); byte error=H2Wire.endTransmission(); Serial.print(error, HEX); Serial.println("TP6 "); } void loop() { Serial.print(millis()); Serial.print(" "); /// H2Wire.beginTransmission(0x68); H2Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H) H2Wire.endTransmission(); H2Wire.requestFrom(0x68,14); // request a total of 14 registers AcX=H2Wire.read()<<8 | H2Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L) AcY=H2Wire.read()<<8 | H2Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L) AcZ=H2Wire.read()<<8|H2Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L) Tmp=H2Wire.read()<<8|H2Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L) GyX=H2Wire.read()<<8|H2Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L) GyY=H2Wire.read()<<8|H2Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L) GyZ=H2Wire.read()<<8|H2Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L) Serial.print("AcX = "); Serial.print(AcX); Serial.print(" | AcY = "); Serial.print(AcY); Serial.print(" | AcZ = "); Serial.print(AcZ); Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //equation for temperature in degrees C from datasheet Serial.print(" | GyX = "); Serial.print(GyX); Serial.print(" | GyY = "); Serial.print(GyY); Serial.print(" | GyZ = "); Serial.print(GyZ); /// /// Serial.println(); digitalWrite(START,HIGH); digitalWrite(PC13, !digitalRead(PC13)); delay(300); }Winnie-The-Pooh,
сделал на основе вашего кода (с аппаратным i2c) прогу для чтения с 2х датчиков. Все работет быстро, но при возникновении ошибки в шине, виснет. С программным i2c все очень медленно, но ничего не виснет. Как сделать код с аппаратным чтоб не висло?
Виснет предположительно из-за неответа устройства и бесконечного таймаута.
Я бы полез на stm32duino.com и поискал бы там как управляется (задается) таймаут при инициализации объекта I2C. Смутно помню, что где-то там этот вопрос обсуждался.
Добрый день.
Если я вас правильно понял,то можно одновременно можно использовать 2 интерфейса IIC
Внизу моя программа.
Спасибо.
Если я правильно Вас понял, то внизу приведен текст программы
инициализации 2х микросхем по 2 м IIC.
Правильно?
послушайте, это уже которое сообщение на форуме. где вы неправильно вставляете код? - неужели так трудно научится?
Что касается второго канала I2C -ну не ленитесь, поищите в англоязычном гугле ссылки на его использование - наверняка есть.
Когда искал похожее по второму каналу SPI на СТМ-ке - я нашел очень много полезного на форуме stm32duino
Добрый день.
Спасибо за сообщение, но хотелось бы узнать в чем собственно неправильность кода?
модераторы, прошу забанить участника gisli79 за злонамеренное игнорирование правил