STM32F103C +2 MPU6050 на 2 I2C

Nesenin
Offline
Зарегистрирован: 14.10.2016

Имеется STM32F103C 

Среда 1.61.12 установлено ядро Arduino Due 

установлена библиотека MPU6050

подключены 2 шт MPU6050 к 2м I2C 

с загруженным примером MPU6050_raw с одного датчика идут данные.

вопрос: как задействовать второй датчик на второй шине вместе с первым?

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

А библиотека Wire умеет 2 сразу использовать? Код библиотеки покажите. 

Nesenin
Offline
Зарегистрирован: 14.10.2016

Вот она. Похоже что не умеет( 

https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1...

a5021
Offline
Зарегистрирован: 07.07.2013

Nesenin пишет:
вопрос: как задействовать второй датчик на второй шине вместе с первым?

А что бы не задействовать их оба на одной шине? Есть какие-то жесткие требования по быстродействию?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Nesenin пишет:

Вот она. Похоже что не умеет( 

https://github.com/rogerclarkmelbourne/Arduino_STM32/tree/master/STM32F1...

на втором датчике меняете адрес на 0х69 и подключаете к этой же шине :)

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Nesenin пишет:

Вот она. Похоже что не умеет( 

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

Winnie-The-Pooh
Offline
Зарегистрирован: 21.10.2016
Умеет, но с трудом. Ниже работающий код, читающий данные с 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);
}

 

 

 

Nesenin
Offline
Зарегистрирован: 14.10.2016

Winnie-The-Pooh,

сделал на основе вашего кода (с аппаратным i2c) прогу для чтения с 2х датчиков. Все работет быстро, но при возникновении ошибки в шине, виснет. С программным i2c все очень медленно, но ничего не виснет. Как сделать код с аппаратным чтоб не висло?

Winnie-The-Pooh
Offline
Зарегистрирован: 21.10.2016

Виснет предположительно из-за неответа устройства и бесконечного таймаута.

Я бы полез на stm32duino.com и поискал бы там как управляется (задается) таймаут при инициализации объекта I2C. Смутно помню, что где-то там этот вопрос обсуждался.

 

gisli79
Offline
Зарегистрирован: 16.01.2019

Добрый день.

Если я вас правильно понял,то можно одновременно можно использовать 2 интерфейса IIC

Внизу моя программа.

Спасибо.

Если я правильно Вас понял, то внизу приведен текст программы

инициализации 2х микросхем по 2 м IIC.

Правильно?

 

#include <Wire.h>
 
TwoWire myi2c(2);
 
void setup()
{
//iic-1  
//м.схема с адресом 0х0
  Wire.beginTransmission(0x20);
  Wire.write(0x00);             // регистр-А
  Wire.write(0x00);             // вывод
  Wire.endTransmission();
 
//iic-2  
  //м.схема с адресом 0х3
  myi2c.beginTransmission(0x23);
  myi2c.write(0x00);             // регистр-А
  myi2c.write(0x00);             // вывод
  myi2c.endTransmission();
}
 
void loop()
{
 
}
 
т.е. я одновременно работаю с 2 мя IIc. Правильно?

 

b707
Онлайн
Зарегистрирован: 26.05.2017

послушайте, это уже которое сообщение на форуме. где вы неправильно вставляете код? - неужели так трудно научится?

Что касается второго канала I2C -ну не ленитесь, поищите в англоязычном гугле ссылки на его использование - наверняка есть.

Когда искал похожее по второму каналу SPI на СТМ-ке - я нашел очень много полезного на форуме stm32duino

 

gisli79
Offline
Зарегистрирован: 16.01.2019

Добрый день.

Спасибо за сообщение, но хотелось бы узнать в чем собственно неправильность кода?

gisli79
Offline
Зарегистрирован: 16.01.2019
Скажите, пожалуйста, а так верно?:
 
#include <Wire.h>
 
TwoWire Wire1 (1, I2C_FAST_MODE); //  I2C 1
 
TwoWire Wire2 (2, I2C_FAST_MODE); //  I2C 2
 
 
void setup()
{
 
  WIRE1.begin();
  WIRE2.begin();
 
  //м.схема с адресом 0х0
  WIRE1.beginTransmission(0x20);
  WIRE1.write(0x00);             // регистр-А
  WIRE1.write(0x00);             // вывод
  WIRE1.endTransmission();
 
  //м.схема с адресом 0х3
  WIRE2.beginTransmission(0x23);
  WIRE2.write(0x00);             // регистр-А
  WIRE2.write(0x00);             // вывод
  WIRE2.endTransmission();
}
void loop()
{
 
  delay(500);
 
}
 
b707
Онлайн
Зарегистрирован: 26.05.2017

модераторы, прошу забанить участника gisli79 за злонамеренное игнорирование правил