Elektroda.pl
Elektroda.pl
X
IGE-XAOIGE-XAO
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Dwa urządzenia I2C adresowanie

01 Sty 2018 19:23 1446 14
  • Poziom 13  
    Witam Noworocznie,
    Panowie, poległem niestety na szukaniu informacji o adresowaniu I2C.
    Podpowiecie lub podrzucicie jakiś link dla początkującego?

    Mam dwa urządzenia na I2C: DS1307 i Si7021.
    W jaki sposób adresować w programie te urządzenia?

    Skaner adresów podaje mi:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Aby nie mieszać w swoim programie złożyłem "na boku" z przykładów program:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jak się podaje adresy?
  • IGE-XAOIGE-XAO
  • Poziom 10  
    Z wykorzystaniem biblioteki Wire?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z kolei odczyt danych:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Więcej info tutaj:
    Wire.write
    Wire.read
  • IGE-XAOIGE-XAO
  • Poziom 38  
    Przecież adresy dla tych dwóch kości są stałe i zapewne zaszyte na sztywno w bibliotekach.
  • Poziom 13  
    gaskoin napisał:
    zapewne zaszyte na sztywno w bibliotekach.

    Może i są... kto to wie... ;)

    Mam problem, bo po starcie urządzenia skaner pokazuje tylko adresy z płytki RTC. Przy skanowaniu gdy wypnę na żywca RTC, to zaczyna pokazywać adres Si7021 i po wpięciu RTC jest już wszystko OK.
    Tak samo z odczytami spod programu. Po uruchomieniu odczytuje tylko poprawnie czas a temp. i wilgotność są z czapki. Po wypięciu RTC zaskakuje odczyt z Si7021 i po wpięciu RTC już dalej jest OK.

    Na oba piny A4 i A5 podałem przez rezystory 10k 5V, ale to sytuacji nie zmieniło.
  • Poziom 38  
    labo napisał:
    gaskoin napisał:
    zapewne zaszyte na sztywno w bibliotekach.

    Może i są... kto to wie... ;)


    Zajrzyj do dokumentacji, programowanie to nie jest zgadywanka.

    labo napisał:

    Na oba piny A4 i A5 podałem przez rezystory 10k 5V, ale to sytuacji nie zmieniło.


    Za duże, wrzuć schemat jak to podłączyłeś. Poczytaj https://learn.sparkfun.com/tutorials/i2c
  • Poziom 36  
    Przecież ten Si7021 powinien być zasilany i sterowany od 1.9 do 3.6V!
  • Poziom 10  
    @tmf zobacz:
    Si7021 Humidity and Temperature Sensor Hookup Guide

    Cytat:
    3.3V sensor - use inline logic level converters or 10kΩ resistors to limit 5V signals


    Cytat:
    This breakout board has built-in 4.7KΩ pull up resistors for I2C communications. If you’re hooking up multiple I2C devices on the same bus, you may want to disable/enable the pull-up resistors for one or more boards. On the Si7021, the pull-ups are enabled by default. To disable them, simply use some solder wick to remove the solder on the jumper labeled PU. This will disconnect the resistors from VCC and from the I2C bus.


    Cytat:
    This board runs at 3.3V. Be sure to power the board from the 3.3V pin! Because I2C is an open drain signal, there’s no need to worry about level shifting the signal; the 3.3V signal will be adequate to communicate with the Arduino and the signal will never reach a dangerous level for the pins on the Si7021.
  • Poziom 38  
    Zauważ liczbę mnogą w tym zdaniu. Zapewne chodziło o dzielnik na dwóch rezystorach, albo konwerter na dwóch rezystorach 10k i mosfecie

    Dwa urządzenia I2C adresowanie

    Idąc Twoją logiką to równie dobrze mogę podłączyć układ do 500V przez rezystor 10M ?
  • Moderator Mikrokontrolery Projektowanie
    @alienHater Nie patrz na bajdurzenia twórcy jakiejś płytki tylko bezpośrednio do tego co pisze producent układu. Układ tak jak napisał kol. @andrzej55 może być zasilany max 3,6V, a powinien max 3,3V, z rezystorami podciągającymi 10 k do 3,3V. Jeśli chcesz go łączyć z układami 5V to potrzebujesz:
    a) stabilizatora 3,3V do zasilania modułu,
    b) konwerterów poziomów logicznych, np. takich jak pokazał kol. @gaskoin
  • Poziom 36  
    tmf napisał:
    @alienHater Nie patrz na bajdurzenia twórcy jakiejś płytki tylko bezpośrednio do tego co pisze producent układu. Układ tak jak napisał kol. @andrzej55 może być zasilany max 3,6V, a powinien max 3,3V, z rezystorami podciągającymi 10 k do 3,3V. Jeśli chcesz go łączyć z układami 5V to potrzebujesz:
    a) stabilizatora 3,3V do zasilania modułu,
    b) konwerterów poziomów logicznych, np. takich jak pokazał kol. @gaskoin


    Opinia ta wydaje się byc zbyt pochopna i nie dokładna...
    Z lakonicznego opisu autora można domniemac, że te dwa układy podłączane do I2C bus są jednak na płytkach (break-out boards) a nie jak by to wynikało z sugestii prof. tmf.
    Zatem pewne szczegóły wymagają troche więcej uwagi i omówienia.

    Układ Si7021 jest tak mały że nie spodziewałbym się że autor ma w swoim projekcie ’goły’układ , a raczej jest on na jakiejś handlowej płytce (moduł). Niemal wszyscy producenci tych modułow umieszczają na nich rezystory podciągające dla I2C, a na niektórych jest też zabudowany V-reg dla obnizenia napięcia z 5V do 3.3V a także zawierają level shifters . Wobec czego zależnie od produktu może nie byc już wymagane dopasowywanie poziomów napięc zarówno zasilania samego układu jak i dla I2C.
    Porównaj:
    https://www.sparkfun.com/products/13763
    albo:
    https://www.adafruit.com/product/3251
    oraz różne sprzedawane przez Aliexpress:
    https://www.aliexpress.com/wholesale?catId=0&...iative_id=SB_20180102090749&SearchText=si7021
    albo też:
    https://www.dfrobot.com/wiki/index.php/SI7021_Temperature_and_humidity_sensor_SKU:TOY0054

    Wszystkie oznaczone Si7021 lecz każdy moduł inny (!?)

    Podobnie jest z modułem RTC./

    Wydawałoby się że nie powinno by żadnych problemów.
    Autor jednak doświadczył że te układy ‘nie chcą’ wspópłpracowac jednocześnie na wspólnej magistrali I2C, zapominając o wymogach jakie są przy tworzeniu takowej.

    Byłoby dla autora pomocne zapoznanie się z ogólnymi zasadami:
    https://www.i2c-bus.org/termination/
    Z tego krótkiego opisu winien wywnioskowac że wartości rezystorów podciągających I2C bus nie mogą miec wartości przypadkowych i mimo że nie jest tam wyraźnie sprecyzowane że termination (podciąganie ) stosuje się tylko jedno dla całej magistrali a nie przy każdym układzie, to ten aspekt musi byc uwzględniony przy podłączaniu więcej niż jeden układ/moduł zawierający już takie rezystory.
    W takiej sytuacji istniejące na płytkach rezystory podciągające sa podłączane do siebie równolegle obniżając sumaryczną rezystancję do tego stopnia żę przesyłane wartości ‘data’ mogą byc sfałszowane, lub ich brak w ogóle.
    Jezeli autor stosuje własne podciąganie magistrali o czym pisał wyżej (post #4 na końcu), to winien odłączyc takowe rezystory na obydwu płytkach.
    Mógłby ewentualnie korzystac z podciągania na jednej z nich, ale wystepuje możliwośc własnej pułapki: po pewnym czasie zapomni o takim rozwiązaniu i po odłaczeniu z różnych powodów tej płytki, I2C bus przestanie pracowac dla tej drugiej/pozostałych.

    Warto też prześledzic ten v-clip:
    https://www.youtube.com/watch?v=RPHP4fAisz8

    e marcus
  • Poziom 13  
    Dzień dobry, widzę dyskusja się wywiązała. ;)
    Moduł jaki posiadam, to taki jak tutaj: https://www.aliexpress.com/item/Temperature-H...d146-4ca6-9912-dee64ece617d&priceBeautifyAB=0
    Pytanie natomiast jest takie, układ który mam ma zasłonięte okienko. Należy zerwać tę osłonkę? (Osłona przy lutowaniu?) Mam tak zasłonięty: http://www.expkits.com/magaza/image/cache/data/Sensors/Si7021_02-500x500.jpg

    DS1307: [url=]http://hub360.com.ng/shop-2/ds1307-rtc-module/[/url]

    Panowie, babol jaki wykonałem (przynajmniej jeden znaleziony), to taki, że z rozmachu linie I2C z Si7021 dałem bezpośrednio na A4 i A5 razem z DSem. Zasilanie owszem podałem jako 3,3V, ale linie nie, a i tak mam w ukladzie level converter, bo używam go do RSa i sa jeszcze wolne nogi. Wywaliłem na razie rezystory podciągające i w tej chwili wszystko działa.

    Teraz jest tak: Arduino z niego I2C równolegle na DS i Level Converter, za Level Converterem Si7021.

    Nie wiem co z tymi rezystorami. Na płytce Si7021 z opisu tej aukcji znalazłem, że są tam, na płytce natomiast DS1307 nie mam pojęcia. Nie znam schematu płytki a sama płytka jest warstwowa.
    Działa to na Arduino Nano. próbowałem znaleźć schemat Nano aby sprawdzić czy tam już ich nie dali, ale nie widzę ich tam.
  • Poziom 38  
    emarcus napisał:
    tmf napisał:
    @alienHater Nie patrz na bajdurzenia twórcy jakiejś płytki tylko bezpośrednio do tego co pisze producent układu. Układ tak jak napisał kol. @andrzej55 może być zasilany max 3,6V, a powinien max 3,3V, z rezystorami podciągającymi 10 k do 3,3V. Jeśli chcesz go łączyć z układami 5V to potrzebujesz:
    a) stabilizatora 3,3V do zasilania modułu,
    b) konwerterów poziomów logicznych, np. takich jak pokazał kol. @gaskoin


    Opinia ta wydaje się byc zbyt pochopna i nie dokładna...


    Wszystko, co napisałeś to prawda. Bez schematu możemy sobie tak gdybać jeszcze i miesiąc.

    @labo Narysuj cokolwiek, jeśli nie schemat elektryczny to chociaż w paincie jak to wszystko masz podłączone bo super, że już chociaż wiemy jakie masz moduły, ale dalej nie wiemy jak to wszystko ze sobą powiązałeś :D
  • Pomocny post
    Poziom 36  
    labo napisał:


    Lepiej nie narysuję ;)
    Jak na razie działa...

    I to w zasadzie powinno byc konkluzją całego tematu.
    Dla wyjaśnienia pewnych wątpliwości należałoby uzupełnic:
    labo napisał:

    Nie wiem co z tymi rezystorami. Na płytce Si7021 z opisu tej aukcji znalazłem, że są tam, na płytce

    Tak, na twojej płytce są tylko dwa rezystory; to właśnie te podciągające IC2 bus do zasilania. Poza tym nie jest układ Si7021 jak referujesz, a układ zastępczy HTU21D o podobnej funkcjonalności.
    labo napisał:

    natomiast DS1307 nie mam pojęcia. Nie znam schematu płytki a sama płytka jest warstwowa.

    Na płytce Ds1307 rezystory R2 i R3 (3k3) sa to te podciągające, które w twojej obecnej konfiguracji są wykorzystywane.
    Praktycznie masz alternatywne rozwiązanie o którym wspomniałem w ostatnim zdaniu mojego poprzedniego postu (#10). Usuwając je pozostawisz magistralę bez termination i cały układ magistrali przestanie funkcjonowac, chyba że doinstalujesz je gdzieś w innym miejscu .
    labo napisał:

    Działa to na Arduino Nano. próbowałem znaleźć schemat Nano aby sprawdzić czy tam już ich nie dali, ale nie widzę ich tam.

    Płytki Arduino nie mają wbudowanych rezystorów podciągających dla I2C z kilku powodów.
    Fizycznie są to piny processora: PC.4 i PC.5, które mogą byc konfigurowane dla kilku alternatywnych funkcji oprócz I2C.
    Mogą to byc wejścia analogowe , lub we/wyjścia cyfrowe, mogą służyc też jako PCINT.
    Link do Nano:
    https://bigdanzblog.wordpress.com/2015/01/30/...work-on-an-arduino-nano-pinout-diagrams/#nano

    Na koniec jeszcze jedna uwaga odnośnie modułu DS1307:
    Jeżeli twój układ jest taki jak podałes link wyżej, to zauważ, że jest tam wbudowany układ ładowania baterii LIR 2032. Jeżeli masz taką, to nie potrzebujesz nic zmieniac. Natomiast jeżeli masz baterię zastępcza (zwykłą, alkaline, non-rechargeable na przykład CR2032), której nie możesz ładowac, to wymagane będzie odłączyc tą ładowarkę.

    e marcus
  • Poziom 13  
    emarcus napisał:
    Poza tym nie jest układ Si7021 jak referujesz, a układ zastępczy HTU21D o podobnej funkcjonalności.

    Troszkę namieszałem szukając w google jak moja płytka wygląda, i faktycznie nie podałem dokładnie tego co mam. Zwiódł mnie układ elementów na płytce.
    Mam dokładnie: https://www.ebay.com/itm/1PCS-Si7021-Industri...719345&hash=item23761f9de6:g:vc8AAOSwcUBYHIiu

    emarcus napisał:

    Na koniec jeszcze jedna uwaga odnośnie modułu DS1307:
    Jeżeli twój układ jest taki jak podałes link wyżej, to zauważ, że jest tam wbudowany układ ładowania baterii LIR 2032. Jeżeli masz taką, to nie potrzebujesz nic zmieniac. Natomiast jeżeli masz baterię zastępcza (zwykłą, alkaline, non-rechargeable na przykład CR2032), której nie możesz ładowac, to wymagane będzie odłączyc tą ładowarkę.

    To bardzo cenna uwaga. Dziękuję bardzo. Układ przyjechał z zasilaniem, muszę sprawdzić co tam siedzi.