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

Bylo vydáno Ubuntu 18.04.5 LTS, tj. páté opravné vydání Ubuntu 18.04 LTS s kódovým názvem Bionic Beaver (poznámky k vydání a přehled změn) a také Ubuntu 16.04.7 LTS, tj. sedmé opravné vydání Ubuntu 16.04 LTS s kódovým názvem Xenial Xerus (poznámky k vydání a přehled změn).

Ladislav Hagara | Komentářů: 0
dnes 06:00 | Nová verze

Byla vydána nová verze 1.48 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.48 bude vydáno také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

Ladislav Hagara | Komentářů: 0
včera 19:11 | Zajímavý projekt

Neziskové technologické konsorcium Linux Foundation a společnosti Grillo a IBM společně představili projekt OpenEEW (GitHub) neboli open source systém včasného varování před zemětřeseními (earthquake early-warning).

Ladislav Hagara | Komentářů: 0
včera 16:33 | Nová verze

Byla vydána nová verze 5.1.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 235 vývojářů. Provedeno bylo více než 2 500 commitů. Přehled úprav a nových vlastností v seznamu změn.

Ladislav Hagara | Komentářů: 1
včera 16:11 | Nová verze

Byla vydána nová verze 20.08.0 KDE Aplikací (KDE Applications). Přehled novinek i s náhledy v oficiálním oznámení (sk), v kompletním seznamu změn a na stránce s dalšími informacemi.

Ladislav Hagara | Komentářů: 0
12.8. 13:55 | Komunita

Nadace The Document Foundation (TDF) zastřešující vývoj svobodného kancelářského balíku LibreOffice zveřejnila čtyřiapadesátistránkovou výroční zprávu za rok 2019. K dispozici je v nízkém (6,4 MB) i vysokém (53,2 MB) rozlišení. Nadace také publikovala statistiky související s LibreOffice 7.0. Před týdnem vydaná verze byla z oficiálních stránek stažena již 423 tisíckrát.

Ladislav Hagara | Komentářů: 0
12.8. 13:33 | Zajímavý článek

Když se řekne „jmenný prostor“ hodně lidí si představí xmlns v XML nebo balíčky v Javě odvozené od internetových domén. Jmenné prostory jsou ale obecný koncept se kterým se setkáme prakticky všude a odvozovat je můžeme i jinak. Článek Jména a jmenné prostory dává toto téma do souvislostí a ukazuje různé způsoby tvorby jmenných prostorů. Nahlédneme i do zajímavého světa RDF a ukážeme si, jak vytvářet URI, která budou globálně unikátní jednou provždy.

xkucf03 | Komentářů: 5
12.8. 08:00 | Nová verze

Po více než čtyřech měsících vývoje od vydání verze 5.4 byla vydána nová verze 5.5 svobodného open source redakčního systému WordPress. Kódové označení Eckstine bylo vybráno na počest amerického jazzového zpěváka Billy Eckstine.

Ladislav Hagara | Komentářů: 0
12.8. 07:00 | Nová verze

Po půl roce vývoje od vydání verze 1.14 byla vydána nová verze 1.15 programovacího jazyka Go (Wikipedie). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
12.8. 01:10 | Nová verze
Vyšla nová verzia Firefox 79.0.3 pre android. Prináša zmenené rozhranie (práca s taby, vytváranie kolekcií stránok a možnosť mať hlavnú lištu už aj dole na obrazovke). V backhand zaujme používateľa, že odsek vie zalamovať podľa šírky obrazovky. (viac)
debian+ | Komentářů: 19
Dokážete si představit, že by váš hlavní počítač (desktop, notebook) byl v současné době založen na architektuře jiné než x86 (x86_64)? Například ARM, POWER, RISC-V,…
 (13%)
 (12%)
 (56%)
 (15%)
 (5%)
Celkem 255 hlasů
 Komentářů: 16, poslední dnes 04:55
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: 469×
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: 13
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: 76 | blog: Výlevníček | 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: 13
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: 13
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: 13
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.