Провод (i2c)

Rogerclark
Пт, 1 мая 2015 г., 7:48
Библиотека Wire (I2C) является частью загрузки файлов Arduino STM32, так как она является почти основной частью вкуса Arduino Libraries

Версия Wire, которая используется в настоящее время, - это программное обеспечение / «Big Bunged» и не использует аппаратные функции I2C STM32

Преимущество программного подхода состоит в том, что проволоки можно запускать на любых контактах GPIO на плате (которые не используются для других конкретных целей E.глин. Аппаратный сериал)

Недостаток - скорость. Скорость по умолчанию составляет 250 кбит / с, и самое быстрое, что может быть достигнуто за счет незначительных изменений в библиотеке проводов где -то до 400 Кбит / с. С прямым доступом к GPIO скорость может быть легко увеличена за пределами 400 кбит / с, однако в настоящее время никто не запросил это или не изучил ускорение провода.

Только одно изменение потребовалось для оригинальной версии Wire (написанная Leaflabs), которая должна была решить проблему, в которой она не будет работать со сканером I2C
Пример эскиза.


Пса.
Я не абсолютно уверен, почему Leaflabs (которые написали весь исходный код, для своих кленовых продуктов), решили пойти с программным решением (кто -то может дать нам окончательный ответ), но мое понимание было, что программирование для Аппаратный i2c проблематичен, и в самих чипах STM32 могут быть даже ошибки с аппаратными функциями I2C. Ошибки оборудования задокументированы STM, а также работы в документе, который можно загрузить с их сайта.

Мадиас
Солнце 3 мая 2015 г., 21:40
Короткие слова о проводе.час:
Программный режим (стандартный!), безусловно, странно написано: Все Команды используют «DigitalWrite» вместо прямых манипуляций с PIN, так что это наверняка одна из причин, почему больше нет скорости за пределами 250 кбит / с.
Я включил в свой порт библиотеки Adafruit OLED "Hardwire" в стандартной комплектации и не вижу проблем с ним. (Super Clean 400 кГц SCL с анализатором OSCI/Logic, оба (I2C1, I2C2) протестированы)
Так что имейте в виду, используя провод SW ".Версия H "замедлит ваш код, и я не знаю, как он будет реагировать во время критических вещей или много используемых таймеров.
Поэтому мои предложения (если вы можете использовать булавки I2C HW), чтобы попробовать Hardwire, прежде чем реализовать эту сырную версию SW.

Rogerclark
Солнце 3 мая 2015 г. 11:15
@madias

Спасибо.

Я никогда не пробовал хардфийр

Одна вещь, которую мы могли бы сделать относительно легко, это обновить программное обеспечение I2C, чтобы использовать прямой доступ в регистр, оно значительно ускорит его, а также по -прежнему позволит гибкость использования тех, которые вы хотите, вы хотите.

Я вспоминаю несколько человек на форуме Arduino, в которых говорилось, что они предпочитают реализацию, которая не связана с конкретными булавками.

Но хорошо иметь оба варианта, если они оба работают хорошо.

Кодировать материал GPIO не сложно, но я не уверен, что у меня есть время посмотреть на это сейчас

Mrburnette
Пн, 04 мая 2015 г., 2:31
Rogerclark написал:@madias
<...>
Я никогда не пробовал хардфийр

Rogerclark
Пн, 4 мая 2015 г., 3:09
Луча

Похоже, что форум можно изменить, чтобы открыть ссылки в новые вкладки или окна, но это не просто изменение настроек,
https: // www.PHPBB.com/support/docs/en/ ... W-Windows/

Пса. Сайт использует phpbb. Я попробовал MyBB, но, похоже, у него не было всей функции, которая была бы необходима, поэтому выбрал PHPBB - как старый стойкий

Клубника
Пт, 05 июня 2015 г., 18:12
Вы знаете, почему эскиз i2c-сканера не распознает устройства? // -------------------------------------- // i2c_scanner // // Version 1 // This program (or code that looks like it) // can be found in many places. // For example on the Arduino.cc forum. // The original author is not know. // Version 2, Juni 2012, Using Arduino 1.0.1 // Adapted to be as simple as possible by Arduino.cc user Krodal // Version 3, Feb 26 2013 // V3 by louarnold // Version 4, March 3, 2013, Using Arduino 1.0.3 // by Arduino.cc user Krodal. // Changes by louarnold removed. // Scanning addresses changed from 0...127 to 1...119, // according to the i2c scanner by Nick Gammon // http://www.gammon.com.au/forum/?id=10896 // Version 5, March 28, 2013 // As version 4, but address scans now to 127. // A sensor seems to use address 120. // // // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. // #include void setup() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan }

Нагисса
Пт, 05 июня 2015 г., 8:16 вечера
Клубберника писал:Вы знаете, почему эскиз i2c-сканера не распознает устройства? // -------------------------------------- // i2c_scanner // // Version 1 // This program (or code that looks like it) // can be found in many places. // For example on the Arduino.cc forum. // The original author is not know. // Version 2, Juni 2012, Using Arduino 1.0.1 // Adapted to be as simple as possible by Arduino.cc user Krodal // Version 3, Feb 26 2013 // V3 by louarnold // Version 4, March 3, 2013, Using Arduino 1.0.3 // by Arduino.cc user Krodal. // Changes by louarnold removed. // Scanning addresses changed from 0...127 to 1...119, // according to the i2c scanner by Nick Gammon // http://www.gammon.com.au/forum/?id=10896 // Version 5, March 28, 2013 // As version 4, but address scans now to 127. // A sensor seems to use address 120. // // // This sketch tests the standard 7-bit addresses // Devices with higher bit address might not be seen properly. // #include void setup() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan }

Rogerclark
Пт, 05 июня 2015 г., 21:02
Сканер I2C работал в последний раз, когда я попробовал это.

Возможно, некоторые недавние изменения что -то сломали.

Я протестирую и вернусь к вам

Клубника
Пт, 05 июня 2015 г., 21:37
Хорошо, теперь хорошо попробовал акселерометр, и кажется, что это обнаруживается (хотя я забыл подтягивания). Пусть я попробую еще раз.

~ Солома

Rogerclark
Пт, 05 июня 2015 г., 21:48
Хорошо

Я тестировал с помощью MPU9150 IMU и BMP085 Barometer, а также с некоторой памятью I2C

Скорость шины по умолчанию может быть слишком высокой, я думаю, что она около 250 кбит / с, но Arduino обычно составляет 100 кп / с, возможно, мне лучше изменить дефолт на нормальную скорость Arduino.

Примечание. Я не мог заставить I2C работать с камерой OV7670 на 250 кб / с / с / с / с / с / с.п.с

Рик Кимбалл
Пт, 05 июня 2015 г., 22:13
Rogerclark написал:Примечание. Я не мог заставить I2C работать с камерой OV7670 на 250 кб / с / с / с / с / с / с.п.с

Rogerclark
Пт, 05 июня 2015 г., 22:29
Я не могу вспомнить, какие подтягивания я использовал

Но другая проблема с OV7670 - это не технически i2c, его SCCB.

Они в основном тот же протокол, но на практике реализация в OV7670, похоже, не работает со многими хостами I2C.
Следовательно, многие люди в конечном итоге пишут битовые внедрения в области битовых вариантов I2C для использования с этим устройством.

К счастью, Wire in Libmaple немного ударена и работает с SCCB, но только на низких скоростях.
И поскольку это всего лишь автобусная шина для установки камеры, не стоит возиться с

Martinayotte
Пт, 05 июня 2015 г., 22:50
Если вы просите подтягивания автобусов I2C, они, как правило, около 4K7, иногда ниже, если сигнал на длинной длине и скорости высок (такие 400 кГц вместо 100 кГц).

Rogerclark
Пт, 05 июня 2015 г., 22:57
4.7K обычно работает для меня.

Я думаю, что у модуля OV7670 у меня есть 4.7 на доске (я не проверял их точное значение)

Спецификация OV7670 составляет SCCB до 400 кГц, а I2C дефолт на 250 тыс. В классе провода, хотя я, вероятно, должен уменьшить это до 100 тыс. Совместимо на периферийные устройства, которые не могут идти быстрее

Рик Кимбалл
Пт, 05 июня 2015 г., 23:20
Люди часто упускают из виду, что вы должны использовать резисторы с более низким уровнем подтягивания с более низким напряжением, чтобы поддерживать острые волны. У TI был довольно хороший доктор, описывающий, как рассчитать: http: // www.тип.com/lit/an/slva689/slva689.PDF

Для бега на 400 тыс. Вы можете уменьшить размер ваших подтягиваний, может быть, до 1.От 5K до 2.2K Ом

-рик

Rogerclark
SAT 06 июня 2015 12:42
Я думаю, что общее решение состоит в том, чтобы снизить скорость по умолчанию в библиотеке проводов, обратно до 100 тыс

Я думаю, что это было по умолчанию так быстро, как, возможно, бит, чтобы продемонстрировать скорость или процессор, но в ретроспективе было бы лучше отодвинуть ее на 100 тыс

Тедрование
Пн июня 08, 2015, 19:13
У меня есть работа Wire Libari.
Закрытие GND и PIN 15.
Теперь, когда работает эскиз сканера RTCLIB и I2C,
Интересно, как менять булавки, не меняя лигир. И как мне переключиться на Hardwire ?

Луимарма
Вт, 09 июня 2015 г., 15:03
Можете ли вы сказать, какой клон вы используете?
У меня проблемы с библиотекой проводов и сканером I2C также.
Кстати, я использую Olimexino STM32

С уважением,

Луис

Тедрование
Вт, 09 июня 2015 г., 18:08
Я использую мини -клон Baite Maple. На верхней части заголовка 15 подключено к GND.
В результате каждая адреса сообщается, обнаруженная с эскизом сканера I2C.
С острым булавом я очистил отступ. Все, что работает хорошо, сейчас.
Изображение

Нагисса
Чт 11 июня 2015 г., 14:22
Тединг написал:Я использую мини -клон Baite Maple. На верхней части заголовка 15 подключено к GND.
В результате каждая адреса сообщается, обнаруженная с эскизом сканера I2C.
С острым булавом я очистил отступ. Все, что работает хорошо, сейчас.
Изображение

Мадиас
Чт 11 июня 2015 г., 15:40
Я посмотрел с моими зеркальными очками на моем Baite Mini: GND «тарелка» действительно проклята рядом с 15 головой PIN. Так приятно знать это! (У меня есть около 10 из них, 2 работают 8 распакованы)

Mrburnette
Чт 11 июня 2015 г., 8:18 вечера
Мадиас написал:Я посмотрел с моими зеркальными очками на моем Baite Mini: GND «тарелка» действительно проклята рядом с 15 головой PIN. Так приятно знать это! (У меня есть около 10 из них, 2 работают 8 распакованы)

Тедрование
Пт 12 июня 2015 г., 5:03
Это хороший совет, с увеличением и светодиодным светом моего мобильного телефона в качестве подсветки, я вижу ошибку.
В следующий раз до того, как я припаю в Pinheader, я буду использовать эту инпекцию.
Оставив меня с вопросом. Когда я использую Wire Libary, могу ли я определить контакты SDA и SCL из эскиза или только в проводе.CPP // Declare the instance that the users of the library can use //TwoWire Wire(SCL, SDA, SOFT_FAST); TwoWire Wire(PB6, PB7, SOFT_FAST);

Rogerclark
Пт 12 июня 2015 г., 5:15 утра
@teding

Неспособность менять штифты - это подвес из AVR Arduino's, который может использовать I2C только на 2 конкретных контактах.

Это также биологический продукт глобального экземпляра провода (и это также относится к SPI)

Как только вы включите провод.H, это создает экземпляр TwoWire, называемый Wire

Вы можете создать еще один экземпляр TwoWire в своем эскизе и использовать разные контакты E.глин.

TwoWire Wire2 (PB4, PB5, Soft_Fast);

Но вы не можете избавиться от провода и всегда на PB6 и PB7

У нас есть аналогичная проблема с SPI, потому что даже Maple Mini имеет 2 порта SPI, но невозможно иметь «SPI» на порту 2 :-(

Единственное разумное решение, о котором я могу подумать, - это сделать (переименованные) дубликаты этих классов, который пропускает глобальную экземпляр.

эн.глин. #включать <Wire_noglobal.час>

Я думаю, что если мы полностью удалили глобальную экземпляр из провода (или SPI), многие другие библиотеки, которые используют проволоку (или SPI) :-(

Мы могли бы добавить вариант меню на каждую плату, которую вы выбираете, чтобы остановить глобальную экземпляров, но это не сработает так хорошо, потому что у вас могут быть некоторые наброски, которые вы хотите использовать для использования глобального экземпляра, а некоторые нет, и вам не нужно должно Установите меню каждый раз, когда вы загружаете другой эскиз, эскиз должен быть самостоятельно.

Я думаю, что вся эта проблема, возможно, что -то для Arduino.Форум программирования CC, но я не уверен, что они будут много использовать, потому что, когда я задавал вопросы в прошлом, они говорили, что это не ардуно вопросы (которые являются мусором, как я использую Arduino IDE)

Нагисса
Сб 13 июня 2015 г. 12:10
Rogerclark написал:@teding

Неспособность менять штифты - это подвес из AVR Arduino's, который может использовать I2C только на 2 конкретных контактах.

Это также биологический продукт глобального экземпляра провода (и это также относится к SPI)

Как только вы включите провод.H, это создает экземпляр TwoWire, называемый Wire

Вы можете создать еще один экземпляр TwoWire в своем эскизе и использовать разные контакты E.глин.

TwoWire Wire2 (PB4, PB5, Soft_Fast);

Но вы не можете избавиться от провода и всегда на PB6 и PB7

У нас есть аналогичная проблема с SPI, потому что даже Maple Mini имеет 2 порта SPI, но невозможно иметь «SPI» на порту 2 :-(

Единственное разумное решение, о котором я могу подумать, - это сделать (переименованные) дубликаты этих классов, который пропускает глобальную экземпляр.

эн.глин. #включать <Wire_noglobal.час>

Я думаю, что если мы полностью удалили глобальную экземпляр из провода (или SPI), многие другие библиотеки, которые используют проволоку (или SPI) :-(

Мы могли бы добавить вариант меню на каждую плату, которую вы выбираете, чтобы остановить глобальную экземпляров, но это не сработает так хорошо, потому что у вас могут быть некоторые наброски, которые вы хотите использовать для использования глобального экземпляра, а некоторые нет, и вам не нужно должно Установите меню каждый раз, когда вы загружаете другой эскиз, эскиз должен быть самостоятельно.

Я думаю, что вся эта проблема, возможно, что -то для Arduino.Форум программирования CC, но я не уверен, что они будут много использовать, потому что, когда я задавал вопросы в прошлом, они говорили, что это не ардуно вопросы (которые являются мусором, как я использую Arduino IDE)

Rogerclark
Сб 13 июня 2015 г., 21:18
Определяет в эскизе, не видят библиотеки.

Только ядро ​​определяет и те, которые настройка в заголовке библиотеки присутствуют в библиотеке

(Примечание. Я исследовал это как вариант, но это не работает)

Нагисса
Солнце 14 июня 2015 г. 11:19
Rogerclark написал:Определяет в эскизе, не видят библиотеки.

Только ядро ​​определяет и те, которые настройка в заголовке библиотеки присутствуют в библиотеке

(Примечание. Я исследовал это как вариант, но это не работает)

Rogerclark
Пн 15 июня 2015 г., 2:34
мммм

ХОРОШО.

Я не уверен, почему это, похоже, не сработало для меня раньше, или почему это работает сейчас, но я согласен, если у меня есть это в эскизе
#define NO_GLOBAL_INSTANTIATION #include

Martinayotte
Пн 15 июня 2015 г., 2:51
Х Роджер,

Я понимаю ваше нежелание #ifdef, но я думаю, что в некоторых случаях это действительно полезно ;)

Rogerclark
Пн 15 июня 2015 г., 3:45
Мартин

Я думаю, что нам нужен механизм для предотвращения автоматического / глобального экземпляра.

Это, возможно, выглядит как единственный способ.

Я думаю, нам просто нужно согласиться с тем, как назвать определение.

И мне лучше опубликовать это для «общей дискуссии», чтобы он получил более широкую аудиторию

Редактировать.

Кажется, это не делает то, что я думал, что это сделало. (Ну, я уверен, что посмотрел на это некоторое время назад и в конце концов пришел к выводу ниже.

Хотя в моих тестах, Global Global, кажется, не виден для эскиза, если вы установите это, это связано с тем, что он не объявляет об внешности в проводе.час

Однако как проволока.H напрямую включен проводом.CPP, затем провод.CPP не получает #define.

Так проводится.CPP по -прежнему объявляет переменную, называемую проводом, это просто эскиз не может видеть ее, потому что она не была внешней

Все, что делает #Define, это отключение видимости глобальной переменной провода изнутри эскиза.

Следовательно, вы не можете объявить свою собственную переменную провода в эскизе E.глин.
TwoWire Wire(PB8, PB9, SOFT_FAST);

Нагисса
Пн 15 июня 2015 г., 21:29
Rogerclark написал:Мартин

Я думаю, что нам нужен механизм для предотвращения автоматического / глобального экземпляра.

Это, возможно, выглядит как единственный способ.

Я думаю, нам просто нужно согласиться с тем, как назвать определение.

И мне лучше опубликовать это для «общей дискуссии», чтобы он получил более широкую аудиторию

Редактировать.

Кажется, это не делает то, что я думал, что это сделало. (Ну, я уверен, что посмотрел на это некоторое время назад и в конце концов пришел к выводу ниже.

Хотя в моих тестах, Global Global, кажется, не виден для эскиза, если вы установите это, это связано с тем, что он не объявляет об внешности в проводе.час

Однако как проволока.H напрямую включен проводом.CPP, затем провод.CPP не получает #define.

Так проводится.CPP по -прежнему объявляет переменную, называемую проводом, это просто эскиз не может видеть ее, потому что она не была внешней

Все, что делает #Define, это отключение видимости глобальной переменной провода изнутри эскиза.

Следовательно, вы не можете объявить свою собственную переменную провода в эскизе E.глин.
TwoWire Wire(PB8, PB9, SOFT_FAST);

Нагисса
Пн 15 июня 2015 г., 21:34
На точке 2 дополнительное определение определяется на C:

#define mylib__c

И проверял на H, чтобы не компилировать код в зависимости от определения, как Global, например, Global. Если Noglobal не определена, глобальная переменная провода будет определена при составлении всего эскиза, но не доступна для использования на C (pp).


Да, это очень грязные хакеры, но они должны были выявить это.


Ах! Только для использования на ICS, никогда для мощной машины!

Rogerclark
Пн 15 июня 2015 г., 21:54
Можете ли вы опубликовать какой -нибудь пример кода того, как вы избегали глобального экземпляра ?
Я до сих пор не вижу, как вам удалось контролировать экземпляр в проводе.CPP

Нагисса
Пн 15 июня 2015 г., 22:00
Rogerclark написал:Можете ли вы опубликовать какой -нибудь пример кода того, как вы избегали глобального экземпляра ?
Я до сих пор не вижу, как вам удалось контролировать экземпляр в проводе.CPP

Rogerclark
Пн 15 июня 2015 г., 22:01
Спасибо

Martinayotte
Вт 16 июня 2015 г. 12:51
Rogerclark написал:И мне лучше опубликовать это для «общей дискуссии», чтобы он получил более широкую аудиторию

Нагисса
Вт 16 июня 2015 г., 4:53
Rogerclark написал:Можете ли вы опубликовать какой -нибудь пример кода того, как вы избегали глобального экземпляра ?
Я до сих пор не вижу, как вам удалось контролировать экземпляр в проводе.CPP

Rogerclark
Вт 16 июня 2015 г., 5:03
Хорошо. Таким образом, основное изменение состоит в том, что вы создали создание глобальной переменной провода в проводе.H вместо провода.CPP

Этот метод тоже пришел в голову, но я не пробовал его.

И

_Wire_c_

действительно означает, что Wire Global был определен


Нагисса написала: Проблема? Если провод включен в любой другой библиотечный глобальный провод, будет определен, но это логично, так как библиотека включена для использования, и обычно с этой переменной.

Нагисса
Вт 16 июня 2015 г. 5:18 утра
Rogerclark написал:Хорошо. Таким образом, основное изменение состоит в том, что вы создали создание глобальной переменной провода в проводе.H вместо провода.CPP

Этот метод тоже пришел в голову, но я не пробовал его.

И

_Wire_c_

действительно означает, что Wire Global был определен


Нагисса написала: Проблема? Если провод включен в любой другой библиотечный глобальный провод, будет определен, но это логично, так как библиотека включена для использования, и обычно с этой переменной.

Mrburnette
Вт 16 июня 2015 12:05
... мысль...

Раньше я работал в корпоративной среде. Я слишком хорошо помню, что эти диаграммы размером с стены, созданные командой графических муравьев, показывающих системные зависимости. Они никогда не были правы, потому что системы изменились быстрее, чем муравьи, могли анализировать журналы изменений, обновить диаграммы и перепечатать. Бесполезный.

Идя по пути, где #includes глобально взаимоисключающие кажется очень скользким склоном... Я предлагаю новую переменную среды,
Slippery_when_wet


Луча

Нагисса
Вт 16 июня 2015 г., 19:38
Mrburnette написал:... мысль...

Раньше я работал в корпоративной среде. Я слишком хорошо помню, что эти диаграммы размером с стены, созданные командой графических муравьев, показывающих системные зависимости. Они никогда не были правы, потому что системы изменились быстрее, чем муравьи, могли анализировать журналы изменений, обновить диаграммы и перепечатать. Бесполезный.

Идя по пути, где #includes глобально взаимоисключающие кажется очень скользким склоном... Я предлагаю новую переменную среды,
Slippery_when_wet


Луча

Mrburnette
Вт 16 июня 2015 г., 8:50 вечера
Альтернативой является одна библиотека на конфигурацию или включает ее в каждую программу. Другая альтернатива - написать больше функций и меньше библиотек. Если нет истинной необходимости наследовать от библиотеки, многие приграмм легче понять как библиотеки.

У библиотек Классе есть свое место (в Arduino, простое повторное использование кода), но они могут быть переоценены Eastiiy. Занятия могут легко построить прямо в редакторе.

Луча

Нагисса
Вт 16 июня 2015 г., 21:36
Mrburnette написал: Альтернативой является одна библиотека на конфигурацию или включает ее в каждую программу. Другая альтернатива - написать больше функций и меньше библиотек. Если нет истинной необходимости наследовать от библиотеки, многие приграмм легче понять как библиотеки.

У библиотек Классе есть свое место (в Arduino, простое повторное использование кода), но они могут быть переоценены Eastiiy. Занятия могут легко построить прямо в редакторе.

Луча

Mrburnette
Вт 16 июня 2015 г. 22:42
Нагисса написала: <...>
Мой случай-это несколько датчиков, доступных для чтения статуса и журналов, поэтому RTC, Wi-Fi, SD и STM32 являются базой, а обработка датчиков и приводы являются различиями, поэтому я стараюсь обойти такую ​​же базу кодовой каждое устройство.