Lazarus - i2c sběrnice

Lazarus - i2c sběrnice
« kdy: 09. 12. 2020, 16:01:28 »
Zdravím Vás.
Nějak nemohu přijit na to, jak přes lazarus zjistit, zda je na určite adrese nejake zařizení.

Jsem to zkusil vypsat přes fpsystem.
fpsystem však vraci integer, takže to vypisuje v obou připadech tu první 0.
Label1.caption := IntToStr(c('sudo i2cdetect -y 1 0x22 0x22'));
Label2.caption := IntToStr(fpsystem('sudo i2cdetect -y 1 0x23 0x23')); 

« Poslední změna: 09. 12. 2020, 16:06:31 od BigSandy »


Re:Lazarus - i2c sběrnice
« Odpověď #1 kdy: 09. 12. 2020, 16:52:14 »
No fuj. Radeji wrapper, nebo knihovnu:

https://wiki.freepascal.org/Lazarus_on_Raspberry_Pi

Re:Lazarus - i2c sběrnice
« Odpověď #2 kdy: 09. 12. 2020, 17:04:47 »
Tam vidim par funkcí pro nastavovaní  i2c expanderu.

funkce i2c_bus_write (baseadr, reg: word; var data: databuf_t; lgt: byte; testnr: integer): integer;
funkce i2c_bus_read (baseadr, reg: word; var data: databuf_t; lgt: byte; testnr: integer): integer;
funkce i2c_string_read (baseadr, reg: word; var data: databuf_t; lgt: byte; testnr: integer): string;
funkce i2c_string_write (baseadr, reg: word; s: string; testnr: integer): integer;

Nevidim tam však řešení, jak zjistit jestli na te adrese ten expander je.

Re:Lazarus - i2c sběrnice
« Odpověď #3 kdy: 09. 12. 2020, 17:46:22 »
Co si pamatuju, u I2C neexistuje žádná obecná možnost, jak zjistit, že na nějaké adrese poslouchá zařízení či ne. Protože ale zařízení mají celkem napevno přiřazené adresy, tak prostě pro danou adresu zkusíte komunikovat, jako by tam dané zařízení bylo... a pokud správně odpovídá, tak tam je.

Re:Lazarus - i2c sběrnice
« Odpověď #4 kdy: 09. 12. 2020, 18:38:41 »
I2C slave odpoví na START se svojí adresou ACKem, podle toho jde obecně určit, jestli tam něco je. i2cdetect to dělá právě takto...

Ta pascalová i2c_bus_read vypadá, že by mohla vracet záporné číslo, když slave nepotvrdí adresu, což by mohlo být ono.


Re:Lazarus - i2c sběrnice
« Odpověď #5 kdy: 09. 12. 2020, 19:03:54 »
Dik moc ale už mám vyřešene.
To co radil Martin Dráb.

Jsem našel funkci
StavExpanderu('i2cget -y 1 0x22 0x12');
Když ji zavolam, mi vrati stav pinu třeba 0x7e.
Když tam expander není, vrati prazdy řetězec