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...

По приведенной ссылке конструктор выглядит так

01HardWire::HardWire(uint8 dev_sel, uint8 flags) {
02    if (dev_sel == 1) {
03        sel_hard = I2C1;
04    } else if (dev_sel == 2) {
05        sel_hard = I2C2;
06    } else {
07        ASSERT(1);
08    }
09    dev_flags = flags;
10}

Не трудно заметить, что может работать с двумя I2C

Winnie-The-Pooh
Offline
Зарегистрирован: 21.10.2016
01Умеет, но с трудом. Ниже работающий код, читающий данные с MPU5060 через второй I2C. Он обвешан тестовыми точками и генерирует стартовый импульс для лог анализатора - это я искал почему код, работающий по I2C1, не работает при переходе на I2C2.
02 
03ЗЫ Что надо нажать, чтобы код убрать под спойлер?
04 
05 
06 
07#include <stdint.h>
08#include <HardWire.h>
09 
10HardWire H2Wire(2, I2C_FAST_MODE); // I2c1
11 
12#define START PB0
13 
14int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
15 
16void setup()
17{
18    H2Wire.begin();
19    Serial.begin(115200);
20     
21    pinMode(PC13, OUTPUT);
22    digitalWrite(PC13, 1);
23   
24  long time = millis();
25  while (!Serial.available() and (millis()-time < 2000)) //ждем данных для приема не более 2 секунд
26    delay(20);
27     
28    digitalWrite(PC13, 0);
29     
30    pinMode(START, OUTPUT); //синхроимпульс для лог анализатора
31    digitalWrite(START,HIGH);
32    Serial.print("TP0 ");
33 
34    digitalWrite(START,LOW);
35 
36Serial.print(millis());
37 
38  Serial.print(" TP1 ");
39   
40  H2Wire.begin();
41  Serial.print(" TP2 ");
42 
43  H2Wire.beginTransmission(0x68); //77
44  Serial.print(" TP3 ");
45  
46  H2Wire.write(0x6B);
47  Serial.print(" TP4 ");
48   
49  H2Wire.write(0x00);
50  Serial.println("TP5 ");
51   
52  byte error=H2Wire.endTransmission();
53  Serial.print(error, HEX);
54 
55  Serial.println("TP6 ");
56  
57}
58 
59void loop()
60{
61 
62Serial.print(millis()); Serial.print(" ");
63 
64 
65///
66 
67H2Wire.beginTransmission(0x68);
68  H2Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
69  H2Wire.endTransmission();
70  H2Wire.requestFrom(0x68,14);  // request a total of 14 registers
71  AcX=H2Wire.read()<<8 | H2Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
72  AcY=H2Wire.read()<<8 | H2Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
73  AcZ=H2Wire.read()<<8|H2Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
74  Tmp=H2Wire.read()<<8|H2Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
75  GyX=H2Wire.read()<<8|H2Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
76  GyY=H2Wire.read()<<8|H2Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
77  GyZ=H2Wire.read()<<8|H2Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
78  Serial.print("AcX = "); Serial.print(AcX);
79  Serial.print(" | AcY = "); Serial.print(AcY);
80  Serial.print(" | AcZ = "); Serial.print(AcZ);
81  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
82  Serial.print(" | GyX = "); Serial.print(GyX);
83  Serial.print(" | GyY = "); Serial.print(GyY);
84  Serial.print(" | GyZ = "); Serial.print(GyZ);
85 
86///
87   
88 
89///
90 
91 
92  Serial.println();
93 
94   digitalWrite(START,HIGH);
95    digitalWrite(PC13, !digitalRead(PC13));
96   delay(300);
97}

 

 

 

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
Offline
Зарегистрирован: 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
Offline
Зарегистрирован: 26.05.2017

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