Portál AbcLinuxu, 8. května 2025 02:25
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
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
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.
A co Multiplexer ? http://astromik.org/malymenu/menuraspi.htm
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!
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.