abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 16:33 | Nová verze

    Byla vydána nová stabilní verze 3.20.0, tj. první z nové řady 3.20, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie) postavené na standardní knihovně jazyka C musl libc a BusyBoxu. Z novinek lze vypíchnou počáteční podporu 64bitové architektury RISC-V.

    Ladislav Hagara | Komentářů: 0
    dnes 14:11 | IT novinky

    Společnost Jolla na akci s názvem Jolla Love Day 2 - The Jolla comeback představila telefon se Sailfish OS 5.0 Jolla Community Phone (ve spolupráci se společností Reeder) a počítač Jolla Mind2 Community Edition AI Computer.

    Ladislav Hagara | Komentářů: 0
    dnes 12:33 | Nová verze

    LibreOffice 24.8 bude vydán jako finální v srpnu 2024, přičemž LibreOffice 24.8 Alpha1 je první předběžnou verzí od začátku vývoje verze 24.8 v prosinci 2023. Od té doby bylo do úložiště kódu odesláno 4448 commitů a více než 667 chyb bylo v Bugzille nastaveno jako opravené. Nové funkce obsažené v této verzi LibreOffice najdete v poznámkách k vydání.

    ZCR | Komentářů: 0
    včera 23:33 | Nová verze

    Nová čísla časopisů od nakladatelství Raspberry Pi: MagPi 141 (pdf) a HackSpace 78 (pdf).

    Ladislav Hagara | Komentářů: 0
    včera 21:22 | Nová verze

    Byla vydána verze 2.0.0 programovacího jazyka Kotlin (Wikipedie, GitHub). Oficiálně bude představena ve čtvrtek na konferenci KotlinConf 2024 v Kodani. Livestream bude možné sledovat na YouTube.

    Ladislav Hagara | Komentářů: 1
    včera 12:55 | Nová verze

    Byla vydána nová major verze 27.0 programovacího jazyka Erlang (Wikipedie) a související platformy OTP (Open Telecom Platform, Wikipedie). Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 01:11 | Nová verze

    Byla vydána nová verze 1.8.0 svobodného multiplatformního softwaru pro konverzi video formátů HandBrake (Wikipedie). Přehled novinek v poznámkách k vydání na GitHubu. Instalovat lze také z Flathubu.

    Ladislav Hagara | Komentářů: 0
    20.5. 21:55 | IT novinky

    Microsoft představil nové označení počítačů Copilot+. Dle oznámení se jedná se o počítače poskytující funkce umělé inteligence. Vedle CPU a GPU mají také NPU (Neural Processing Unit). Uvnitř představených Copilot+ notebooků běží ARM čipy Qualcomm Snapdragon X Elite nebo X Plus.

    Ladislav Hagara | Komentářů: 5
    20.5. 17:55 | Zajímavý článek

    Příspěvek na blogu Codean Labs rozebírá zranitelnost CVE-2024-4367 v PDF.js, tj. mj. prohlížeči PDF souborů ve Firefoxu. Při otevření útočníkem připraveného pdf souboru může být spuštěn libovolný kód v JavaScriptu. Vyřešeno ve Firefoxu 126.

    Ladislav Hagara | Komentářů: 1
    20.5. 12:55 | Nová verze

    Lazygit byl vydán ve verzi 0.42.0. Jedná se o TUI (Text User Interface) nadstavbu nad gitem.

    Ladislav Hagara | Komentářů: 0
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (81%)
     (5%)
     (8%)
     (7%)
    Celkem 454 hlasů
     Komentářů: 16, poslední 14.5. 11:05
    Rozcestník

    Dotaz: I2C přes wiringpi na RPI (2x slave)

    30.3.2019 14:14 milanc
    I2C přes wiringpi na RPI (2x slave)
    Přečteno: 550×
    Ahoj, chci se zeptat, jestli jste někdo neřešil na RPIčku komunikaci s více I2C zařízeními (v mém případě 2xADC převodník).

    Mám problém s tím, že když odpojím druhý převodník, je stále jakoby detekován. (v i2cdetect není), ale wiringpi ho asi nějak vidí, resp. inicializace nevrací -1. Tady je výňatek...
    int fd1 = wiringPiI2CSetup(0x48);
      printf("%d!\n", fd1);
      if (fd1 == -1) {
        printf("MCP3221 not found!\n");
        return EXIT_FAILURE;
      }
    
    int fd2 = wiringPiI2CSetup(0x68);
    printf("%d!\n", fd2);
      if (fd2 == -1) {
        printf("MCP3424 not found!\n");
        return EXIT_FAILURE;
      }
    První volání vrátí 4. (adc připojen) Druhé volání vrátí 5. (adc odpojen). Je to nějaký busy stav. Hledal jsem, jestli není nutné i2c nějak uvolnit (close,fclose...), ale nic moc jsem nenašel. Čekal bych, že v případě odpojení senzoru dostanu -1, ale možná jsem to jen blbě pochopil?

    "The return value is the standard Linux filehandle, or -1 if any error - in which case, you can consult errno as usual."

    Ještě doplnění. Když přidám po vyčtení hodnot close(handle), tak pak v druhém případě (stejně jako v prvním) mi wiringPiI2CSetup vrací 4. Takže otázka, mám dělat close()? Skoro v žádných příkladech to nedělají, ale tam věšinou pracují jen s jediným i2c zařízením a skript pak končí.

    2) -1 mi vrací případné čtení/zápis, pokud zařízení není. Sice nechápu, proč se při open nevrací -1, ale neměl bych to tedy řešit ošetřením čtení/zápisu? Jako pokud mi vrátí -1, pak vyhodit chybu device not found? Jak jsem pochopil z popisu I2C, tak tam nějaké potvrzování komunikace funguje...

    Milan

    Odpovědi

    30.3.2019 16:48 debian+
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Neresil, ale dalej pisem svoj nazor, najskor pravdivy.

    I2C je radit. To znamena, ze radic moze len s 1 zariadenym sucastne pracovat. Ak viacej, musi nastat prepisanie. Ukoncenie a spojenie s novym. Preto ak je jeden otvoreny, tak dalsie otvorenia chybou.

    Kedze casto dochadza k prepinaniu, zbernica pri pripojeny neoveruje, ci je realne pripojene. Pri castom prepisani je to zbytocna rezia, ak je tam skoro vzdy to zaradenie od prveho pouzivania. Tak Ti musis otvarat/zatvarat/prepinat zariadnenia (sme blizko LOW urovne ovadania). Ty musis zvlast overovat dostupne zariadenia na pripojenie (napr. i2cdetect). Zbernica ma aj zvycajne zvlast prikaz na vypis akt. zariadeni. On si len pameta posl. vypis od zistenia. Kludne mozu byt aj /dev subory pre HW sokety zariadeny ku zbernici na pripojenie, ale na tych nemusi byt nic. Ale su dostupne, tak ich v systeme vidis. Zalezi aj, ako inteligetne je spravena.

    Uzatvaranie. Uzatvaraj. Ak neuzavries, tak pri skonceni procesu sam OS pozatvara descriptory. Pri 2 zariadeniach, treba prepinat, ako som vyssie pisal. Napr. co viem, tak pri volani jadra o pristup suboru, treba vzdy nastavovat poziciu (on sa pozera, ze robi 1 vec na tom subore a globalny kontext nepozna (fopen, read 50MB, close)).

    Ak zapis skonci -1, vies urobit vypis akt. pripojenych a podla ozaj zistis, ze ci zariadenie je odpojene. Inac, je to len chybny zapis.

    Ojedine este kukni funkciu wiringPiI2CSetupInterface().

    Zdroje: http://wiringpi.com/reference/i2c-library/ https://projects.drogon.net/raspberry-pi/wiringpi/i2c-library/ https://github.com/WiringPi/WiringPi/blob/master/wiringPi/wiringPiI2C.h https://github.com/WiringPi/WiringPi/blob/master/wiringPi/wiringPiI2C.c https://www.kernel.org/doc/Documentation/i2c/dev-interface
    30.3.2019 17:08 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Ahoj, ke zdrojákům už jsem se také dopracoval, díky za připomínku. wiringPiI2CSetupInterface je stejné jako wiringPiI2CSetup, resp. wiringPiI2CSetup jej přetěžuje a přidává argument na /dev/i2c podle revize RPI, nic víc.

    Ještě jsem měl možná dodat, že to odpojené zařízení je odpojené trvale. Není to tak, že bych jej měl připojené, něco zkoušel, pak jej odpojil. Prostě tam delší čas není, RPI prošlo rebooty atd. i2cdetect jej samozřejmě na dané adrese nevidí, když tam není. Mě právě zaráží to, že jsem si celkem jistý, že mi to dříve fungovalo. Že když tam zařízení nebylo, vypsala se o tom hláška, tj. wiringPiI2CSetup musel vracet -1.
    Ak zapis skonci -1, vies urobit vypis akt. pripojenych a podla ozaj zistis, ze ci zariadenie je odpojene.
    A tohle by se dalo řešit jak?

    Když koukám, jak to řeší i2cdetect (https://kernel.googlesource.com/pub/scm/utils/i2c-tools/i2c-tools/+/i2c-tools-3.1/tools/i2cdetect.c), tak jestli to chápu správně, zkusí z toho zařízení/adresy přečíst popř. zapsat (podle nějakého intervalu adres) a když to failne, hodnotí zařízení jako odpojené.

    Z toho mi vychází, že mi stačí ošetřit mé první čtení/zápis a když se nezdaří, vyhodnotit to jako že zařízení je odpojené. Busy být nemůže, to mohou být jen zařízení, pro které je naloudován linuxový ovladač a v i2cdetect mají UU.

    Milan
    30.3.2019 18:34 debian+
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Ak zapis skonci -1, vies urobit vypis akt. pripojenych a podla ozaj zistis, ze ci zariadenie je odpojene.
    Napr. pustis cez popen i2cdetect. Precitas vystup a pokial dane zariadenie nie je v tom vystupe znaci ze je odpojene. A mas naisto (inac je to neznama chyba a niekam zaloguje, aby si sa na to pozrel + prida ak este dmesg). A pri preklade (pri ./configure) pridat zavislost na program i2cdetect. Externy program - snaz sa o univerzalnost a jeden fork nezaberie az tak vela pamete/vykonu, ked to bude raz za cas. A v programe si pripadne poznacis, ze nema pripojene a raz za cas overy ci nebolo pridane. Alebo pripadne to mozes osetrit, ze ked ti rucne pripojis k tomu pocitacu, tak poslel program SIGUSR2, ktory v programe zmeni, ze nepouzivane bude pouzivane. Alebo pri prijaty signalu, preskenuje pripojene zariadenia. A pripada opat pouzivane zariadenia.

    Osetri open zariadenia, ale vzdy by si mal osetrit aj zapis/citanie, moze zlyhat. Ak budes mat aj aj overene, tak kod tvojho programu je pripraveny na aj aj chybu a jedno kt. chyba nastane. Je viac univerzalny. Kniznica overuje stavy, pitaj sa lower vyvojarov - kniznice, jadra, HW.
    Jendа avatar 31.3.2019 20:30 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Taky jsem měl divné problémy s I2C na RPi (byla to teda nějaká knihovna pro Python), doporučuji pořídit logický analyzér (klon Saleae za ~150 Kč) a ladit to s ním.
    31.3.2019 21:52 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Ahoj, LA mám, ale spíše bude problém v mém nepochopení/implementaci zmiňovaných funkcí. Prostě v Cčku moc neumím, tak je to takové obojetné bádání. :)
    31.3.2019 22:19 debian+
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Ako tak pozeram Implementation details v https://www.kernel.org/doc/Documentation/i2c/dev-interface, tak je to ako pisem vyssie. Je to LOW-LEVEL - cize uz ovladanie radica z USER-SPACE (proste len funkcia z ovladacov vyvedene do user-space priestoru). A Ty sa sam musis stavat o prepinanie, OS sa nestara (zrejme nie je potreba). Mozes mat len 1 otvoreny. S nim pracovat. A pokial chces s dalsim pracovat, tak posledny musis zavriet. A otvorit novy.

    Mas pripojene v rezime SLAVE a zariadenie cez tu zbernicu nic nespravi, lebo zariadenie v rezime SLAVE nezahahuje komunikaciu, ale caka na radit (a vsetko logicky nad), kym s nim zacne komunikovat.

    Cecko s tym velmi nic nespravi (ak neratam overenie cez popen). Proste tu sa treba pozerat na nizkej HW urovne (asambler, C, kerner a jeho kernel-space a user-space). Mat predstavu alebo skusenosti. A mozno neznalost C prostredia ta trocha paralizuje.
    pepe_ avatar 30.3.2019 23:58 pepe_ | skóre: 48
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    31.3.2019 20:29 m
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Podle kódu funkce wiringPiI2CSetup dělá následující:
    1. Otevře handle na I2C sběrnici pomocí open (device, O_RDWR). Tahle část asi nemá důvod selhat => vrátí validní handle (kladné číslo). V tvém případě jsi viděl 4 nebo 5.
    2. Nastaví výchozí slave adresu pomocí ioctl (fd, I2C_SLAVE, devId), aby ji nebylo nuté ji nastavovat před každou transakcí. Otázka zní, zda tato funkce má kotrolovat fyzickou přítomnost I2C slave zařízení (tj. musela by jej adresovat a zkontrolovat ACK bit). Nepodařilo se mi rychle najít dostatečný popis této funkce/parametru.
    Jak se to chová, když odpojíš i první zařízení? Myslím si že inicializace opět proběhne OK (v obou případech).
    31.3.2019 21:56 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    To teď nezkusím, je napájené na PCB, ale v podstatě by se mělo chovat jako kterékoli jiné zařízení, které není připojené. Tj. zadám nějakou I2C adresu, která neexistuje. Open vrací zase 4. Tak jsem možná mystifikoval, že mi to dříve vracelo -1, ale možné to je. Hrál jsem si s tím někdy před 6 měsíci a od té doby se wiringPI/gpio updatlo.
    31.3.2019 22:03 MilanC | skóre: 16
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Jinak když zapisuji/čtu na neexistující adresu, pak funkce vrací -1. První číslo je return code fce open, druhé pak wiringPiI2CReadReg16/wiringPiI2CWrite
    4!
    IN: 22.73 V
    4!
    -1!
    Unable to write I2C device: Remote I/O error
    channel 1: 1102977.00 V
    -1!
    Unable to write I2C device: Remote I/O error
    channel 2: 1102977.00 V
    -1!
    Unable to write I2C device: Remote I/O error
    channel 3: 1102977.00 V
    -1!
    Unable to write I2C device: Remote I/O error
    channel 4: 1102977.00 V
    -1!
    
    31.3.2019 22:22 debian+
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Premenne pred pouzitim maz. Lebo ked sa nic nezapise, v cecku zostava predchadzajuca hodnota (v pamati). Pred pouzitim obsah premennych nemaze.
    1.4.2019 20:30 m
    Rozbalit Rozbalit vše Re: I2C přes wiringpi na RPI (2x slave)
    Že to vrací -1 při zápisu/čtení neexistujícího slave zařízení je OK. U inicializace nikdo neslibuje, že to má poznat, zda je zařízení přítomno ... nebo ano?

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.