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...
По приведенной ссылке конструктор выглядит так
01
HardWire::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
01
Умеет, но с трудом. Ниже работающий код, читающий данные с MPU5060 через второй I2C. Он обвешан тестовыми точками и генерирует стартовый импульс для лог анализатора - это я искал почему код, работающий по I2C1, не работает при переходе на I2C2.
02
03
ЗЫ Что надо нажать, чтобы код убрать под спойлер?
04
05
06
07
#include <stdint.h>
08
#include <HardWire.h>
09
10
HardWire H2Wire(2, I2C_FAST_MODE);
// I2c1
11
12
#define START PB0
13
14
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
15
16
void
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
36
Serial
.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
59
void
loop
()
60
{
61
62
Serial
.print(millis());
Serial
.print(
" "
);
63
64
65
///
66
67
H2Wire.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
}
Winnie-The-Pooh,
сделал на основе вашего кода (с аппаратным i2c) прогу для чтения с 2х датчиков. Все работет быстро, но при возникновении ошибки в шине, виснет. С программным i2c все очень медленно, но ничего не виснет. Как сделать код с аппаратным чтоб не висло?
Виснет предположительно из-за неответа устройства и бесконечного таймаута.
Я бы полез на stm32duino.com и поискал бы там как управляется (задается) таймаут при инициализации объекта I2C. Смутно помню, что где-то там этот вопрос обсуждался.
Добрый день.
Если я вас правильно понял,то можно одновременно можно использовать 2 интерфейса IIC
Внизу моя программа.
Спасибо.
Если я правильно Вас понял, то внизу приведен текст программы
инициализации 2х микросхем по 2 м IIC.
Правильно?
послушайте, это уже которое сообщение на форуме. где вы неправильно вставляете код? - неужели так трудно научится?
Что касается второго канала I2C -ну не ленитесь, поищите в англоязычном гугле ссылки на его использование - наверняка есть.
Когда искал похожее по второму каналу SPI на СТМ-ке - я нашел очень много полезного на форуме stm32duino
Добрый день.
Спасибо за сообщение, но хотелось бы узнать в чем собственно неправильность кода?
модераторы, прошу забанить участника gisli79 за злонамеренное игнорирование правил