Несколько библиотек I2C

Пять
Ср 13 декабря 2017 г. 10:46 утра
Привет,

У меня проблемы с несколькими библиотеками I2C в одном эскизе на STM32F103

Отдельно они работают:

Adafruit SSD1306
Adarfuit Vl6180
I2c все что -нибудь

Они работают вместе в Arduino Nano или Mega.

Почему это? Как это можно сделать?

Rogerclark
Ср 13 декабря 2017 г. 10:51
Какое ядро ​​вы используете ?

Пять
Ср 13 декабря 2017 г. 13:12
Последнее ядро ​​arduino_stm32

OLED начинается с логотипа Adafruit и остается там, после этого ничего не работает.

SSD1306 с кодом VL6180 здесь: #include #include #include #include #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif #include "Adafruit_VL6180X.h" Adafruit_VL6180X vl = Adafruit_VL6180X(); void setup() { Serial.begin(115200); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); delay(2000); vl.begin(); Serial.println("Sensor found!"); } void loop() { display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0, 0); display.println(vl.readRange()); display.display(); }

Стивестронг
Ср 13 декабря 2017 г. 13:18
Поместите несколько серийных выходных линий, чтобы обнаружить, что является линией, где висит эскиз.

Mrburnette
Ср 13 декабря 2017 г. 14:42
[Пять - Ср 13 декабря 2017 г. 10:46] - Привет, у меня проблемы с несколькими библиотеками I2C в одном эскизе на STM32F103
Отдельно они работают:

Adafruit SSD1306
Adarfuit Vl6180
I2c все что -нибудь

Они работают вместе в Arduino Nano или Mega. Почему это? Как это можно сделать?
Ядро STM32Duino не совпадает с официальным ядром AVR. Еще в прошлом году AVR Core все еще не выполняла программное обеспечение I2C, если моя память служит мне правильно. Таким образом, реализация I2C «блокирует» реализацией.

Реализация Leaflabs была также программным обеспечением i2c (блокировка), даже если в STM32F1XX есть выделенная периферийная машина I2C. Мне пришлось использовать Google, чтобы добраться до следующего уровня, но кажется, что ядро ​​STM32Duino F1 было изменено прошлым летом, а по умолчанию теперь есть оборудование i2c, то есть не блокировка.
Ссылка: ViewTopic.PHP?t = 2408
  • Поэтому вы можете настроить самое последнее ядро ​​для использования программного обеспечения I2C.
  • Или вы можете «регрессировать» код на GitHub, чтобы доставить изображение загрузки до изменения.
К сожалению, я не могу обещать, что выполнение любого из вышеперечисленного заставит ваш код работать, как и на 16-битном AVR UC; Тестирование будет вашей ответственностью. Мы все будем благодарны за то, что вы сообщаете в эту теме, если вы успешны или если вы не успешны. Этот форум не модерируется, но некоторые участники часто принимают ваш (полный) код и пытаются определить исправление - строго на волонтерской основе, поскольку для тестирования обычно требуются точно одинаковые аппаратные компоненты.

Для будущего справки, пожалуйста Не предполагайте, что ядро ​​STM32F1XX STM32DUINO будет работать так же, как и официальное ядро ​​(ы) Arduino Core (ы) ... Некоторые серьезные усилия поступили в то, чтобы переносить оригинальное ядро ​​Leaflabs, чтобы быть совместимым с нынешним ардуиноидом, и некоторые серьезные усилия пришли к манипулированию ядром STM32F1XX, чтобы соответствовать официальной совместимости Arduino. Тем не менее, два ядра очень разные в базовой кодовой базе. И этот форум оставляет за собой возможность изменить основную функциональность, чтобы лучше всего использовать более предварительный архитектурный дизайн устройств STM32FXXX.


Луча

Пять
Чт 14 декабря 2017 г. 9:22 утра
[Стивестронг - Ср 13 декабря 2017 г. 13:18] - Поместите несколько серийных выходных линий, чтобы обнаружить, что является линией, где висит эскиз.
Хорошо, я сделал это. Он не печатает в настройке или петле.

И миррнетте. Спасибо за ваш ответ, кодирование для меня вроде нового, и я постараюсь прочитать эту ветку.

Rogerclark
Чт 14 декабря 2017 г. 9:54 утра
Похоже, что код может сбояться перед настройкой ().

Это обычно вызвано конструкторами в библиотеках, пытающихся использовать GPIO или I2C или SPI и т. Д.

Стивестронг
Чт 14 декабря 2017 г. 12:25
Вы можете попробовать добавить аналогичные контрольные точки: void setup() { Serial.begin(115200); while (!Serial) ; // wait for a serial connection via USB delay(1000); Serial.println("SSD1306 begin"); // check point display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); delay(2000); Serial.println("VL begin"); // check point vl.begin(); Serial.println("Sensor found!"); }

Пять
Пт 15 декабря 2017 г. 8:40
При этом () он теперь печатает только «SSD1306 начинается» и «VL Begin». Не печатает датчик!"Или любые другие маркеры, которые я добавил в Loop.

Стивестронг
Пт 15 декабря 2017 г. 22:38
Таким образом, кажется, что он висит в функции vl6180 begin ().

Где ты взял библиотеку? Любая ссылка?

Пять
Сб 16 декабря 2017 г. 9:01
Adafruit Vl6180 - https: // github.com/adafruit/adafruit_vl6180x
Adafruit SSD1306 STM32 - https: // github.com/rogerclarkmelbourne/ ... it_ssd1306

и i2c все что -нибудь. Та же проблема. Повешивает с SSD1306 или VL6180
http: // www.Гаммон.компонент.Au/Forum/?ID = 10896&Ответить = 8#Ответ8

Каждый из них работает в одиночку.

Стивестронг
Сб, 16 декабря 2017 г. 9:23
Вы пробовали пример i2c_scanner, когда оба подключены?
Они связаны с теми же линиями I2C?

Вы протестировали пример Adafruit OLED? https: // github.com/adafruit/adafruit_vl ... x_oled.Ино
Кажется, что он использует те же ICS, что и вы.

Пять
Сб 16 декабря 2017 г. 13:06
Да. Сканер I2C находит 0x29 и 0x3c.

Да. Те же дорожки B6 и B7 на STM32F103 "Bluebill"

Да. Не работать с оригинальным SSD1306 или с той версией STM32.

Стивестронг
Сб 16 декабря 2017 г. 16:29
У вас есть 4K7 подтягивающие резисторы, подключенные к линиям I2C и 3.3В?

Эскиз примера Adafruit отличается от вашего, экземпляр VL объявляется перед OLED: https: // github.com/adafruit/adafruit_vl ... редакция.Ино#L16

Так что попробуйте этот пример и сообщите нам, где он висит.

Пять
Солнце 17 декабря 2017 г. 10:27 утра
Да, я попробовал. Но я попробовал еще раз, теперь с подтягивающими резисторами.

Оригинальный VL6180X_OLED.Ино:
Не было 4K7
Без - вешать после «Адафрут VL6180X тест!"
2K - висеть после "Adafruit Vl6180x теста!"
4K - висеть после "Adafruit Vl6180x теста!"
10K - висеть после "Adafruit Vl6180x теста!"

Модифицированный VL6180X_OLED.ino с adafruit_ssd1306_stm32.H (adafruit_ssd1306.H не работает):
С этим кодом:#include #include #include #include #include #include "Adafruit_VL6180X.h" Adafruit_VL6180X vl = Adafruit_VL6180X(); #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif void setup() { Serial.begin(115200); while (!Serial) ; // wait for a serial connection via USB delay(1000); Serial.println("SSD1306 begin"); // check point display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) // init done display.display(); delay(1000); Serial.println("Adafruit VL6180x test!"); if (! vl.begin()) { Serial.println("Failed to find sensor"); while (1); } Serial.println("Sensor found!"); // text display big! display.setTextSize(4); display.setTextColor(WHITE); } void loop() { Serial.println("In loop"); // check point float lux = vl.readLux(VL6180X_ALS_GAIN_5); Serial.print("Lux: "); Serial.println(lux); uint8_t range = vl.readRange(); uint8_t status = vl.readRangeStatus(); if (status == VL6180X_ERROR_NONE) { Serial.print("Range: "); Serial.println(range); display.clearDisplay(); display.setCursor(0, 0); display.print(range); display.print("mm"); display.display(); Serial.println(); } else { display.display(); display.clearDisplay(); return; } // Some error occurred, print it out! if ((status >= VL6180X_ERROR_SYSERR_1) && (status <= VL6180X_ERROR_SYSERR_5)) { Serial.println("System error"); } else if (status == VL6180X_ERROR_ECEFAIL) { Serial.println("ECE failure"); } else if (status == VL6180X_ERROR_NOCONVERGE) { Serial.println("No convergence"); } else if (status == VL6180X_ERROR_RANGEIGNORE) { Serial.println("Ignoring range"); } else if (status == VL6180X_ERROR_SNR) { Serial.println("Signal/Noise error"); } else if (status == VL6180X_ERROR_RAWUFLOW) { Serial.println("Raw reading underflow"); } else if (status == VL6180X_ERROR_RAWOFLOW) { Serial.println("Raw reading overflow"); } else if (status == VL6180X_ERROR_RANGEUFLOW) { Serial.println("Range reading underflow"); } else if (status == VL6180X_ERROR_RANGEOFLOW) { Serial.println("Range reading overflow"); } delay(10); }

ZMEMW16
Солнце 17 декабря 2017 г. 13:17
это проволока.H охраняется для нескольких включает ?

Что такое такта I2C ?

Есть ли у любого из оборудования регуляторы, вы кормите их 5 В или 3V3 ?

У вас есть автобусный анализатор ?

Стивен

Пять
Пн, 18 декабря 2017 г., 11:45
к ZMEMW16

1. Можно ли быть немного более конкретным?
2. Я ничего не менял. В каком файле я могу его посмотреть?
3. Да, у обоих есть 3.3 В до 5 В. Я использую 3.3V дополнительный источник питания с подключенными землями.
4. Нет, я не делаю.

ZMEMW16
Пн, 18 декабря 2017 г. 16:16
Обычно обернуть содержимое файла включения в IF-NDEF, чтобы предотвратить двойное включение #ifndef _TWOWIRE_H_ #define _TWOWIRE_H_ #include "utility/WireBase.h" #include "wirish.h" #include class TwoWire : public WireBase { private: i2c_dev* sel_hard; uint8 dev_flags; protected: /* * Processes the incoming I2C message defined by WireBase to the * hardware. If an error occured, restart the I2C device. */ uint8 process(uint8); uint8 process(); public: /* * Check if devsel is within range and enable selected I2C interface with * passed flags */ TwoWire(uint8, uint8 = 0); // blah blah blah rest of file etc #endif

Пять
Вторник 19 декабря 2017 г. 10:20 утра
Датчик и OLED до 5 В толерантны. Я использую 3.3 В постоянного питания на них. STM32F103 Bluebill использует USB -напряжение и основания между STM32F103 и 3.3V внешний источник питания.

Да, они работают вместе. Я проверил их вместе с Arduino Nano и Mega, без резисторов.
Да, они также работают отдельно на Nano и Mega, без резисторов.
Да, они работают отдельно на STM32F103, без резисторов.

Стивестронг
Вт 19 декабря 2017 г. 11:52 утра
Я думаю, что вам понадобится осциллограф или логический анализатор, чтобы узнать основную причину.

Вы должны удалить #include

ZMEMW16
Ср 20 декабря 2017 г. 16:05
Определенно Daft Medy Mode
Насколько медленно мы можем часы i2c ? Установить тайм -ауты за секунды?
Замените резисторы светодиодом и резистором, действительно, действительно замедляйте часы.
Записать видео, а затем воспроизводить кадр за кадром ;)
Недостаточно на самом деле в этой линии
Может быть, попробовать немного разбрызгивания i2c поможет замедлить его
Кевин у кого -то есть прекрасное видео на YouTube управления шаговым двигателем с переключателями.

Стивен

Tfried
Ср 20 декабря 2017 г., 21:39
Похватывает соломку, но...

Что происходит, если вы двигаетесь »VL.begin (); "(и связанные с ними линии отладки) выше" дисплей.начинать()"?

Стивестронг
Сб 23 декабря 2017 г., 17:29
Просто думать...

Вы начинаете первую библиотеку (скажем так) сначала.begin (), который будет вызывать проволоку.начинать().
Вы называете другие функции «первые»:
Первый.отображать();
Первый.blabla ();

Затем вы начинаете библиотеку «второй» (скажем так): второе.begin (), который также вызывает То же самое по умолчанию (!) Объектный провод.начинать();

Может ли это очистить (или конфликт) предыдущие переменные/экземпляры библиотеки и сбросить объект провода по умолчанию?