FULL-C: I2C functions

Verze z 17. 11. 2022, 20:47, kterou vytvořil Adamn (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. 
Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.

Funkce pro komunikaci s rozšiřující (sandwich) deskou, pomocí sběrnice I2C

Zařízení SDS-BIG lze osadit doplňující/rozšiřující (sandwich) deskou. Většina těchto desek komunikuje přes COM3 respektive TOPB protokol; nicméně některé naopak využívají I2C sběrnici.

Desky které komunikují přes TOPB protokol totiž obsahují svůj vlastní mikroprocesor, který se stará o nějakou složitou funkci (např. obsluhu displaye, nebo nějaké komunikační sběrnice). Nicméně desky, u kterých není tato dodatečná inteligence potřebná, se do SDS-BIG připojují přes interní I2C sběrnici (konektor SC-2).

Pro zajištění naprosté univerzálnosti, je umožněno FULL-C programu bez omezení komunikovat po této I2C sběrnici. Tato sběrnice je sdílena s dalšími prvky uvnitř SDS, což nevadí, protože firmware v SDS-BIG to hlídá a správné časuje svou komunikaci versus komunikaci od FULL-C programu.

Program může použít tyto funkce:

          int SDS_I2C_rw(unsigned int address, char *WrPtr, unsigned int WrLen, char *RdPtr, unsigned int RdLen);


Základní popis

K dispozi jsou dvě funkce, jedna čistě pro zápis datových bajtů po I2C sběrnici, druhá pro čtení (se zápisem jednoho bajtu hned na začátku). Tyto funkce by měli pokrýt většinu běžných I2C periférií.

Výrobce SDS nabízí vlastní sandwich desky, které komunikují přes I2C. Nic však nebrání tomu, aby jste si mohli připojit své desky či vlastní I2C periférii (za předpokladu dodržení návrhových a provozních omezení) - kontaktujte výrobce pro detaily.


Zápis do periférie na I2C sběrnici

Pomocí funkce SDS_I2C_rw(). Zadejte I2C adresu do "adr" (0bAAAAAAAx, kde A jsou adresní bity, a x je v zadání nepoužit - interně bude nastaven na READ BIT respektive WRITE BIT).

Data pro zápis vložte do pole na které předáte ukazatel do "WrPtr", a do "WrLen" dejte délku dat (minimum 0, maximum 255).

Data pro čtení budou zapsána do pole, na které předáte ukazatel do "RdPtr", a do "RdLen" dejte délku dat (minimum 0, maximum 255).

Pokud chcete:

  • jen zapsat a nic nečíst: WrLen = délka dat k zápisu, RdLen = nula
  • nic nezapisovat a jen číst: WrLen = nula, RdLen = délka dat ke čtení
  • zapsat a pak číst : WrLen = délka dat k zápisu, RdLen = délka dat ke čtení

Funkce v případě zápisu nerozlišuje co jednotlivé bajty "znamenají" - protože z hlediska I2C sběrnice je to nepodstatné - v dokumentaci k perifériím je ale často provedeno rozdělení na "registr" a "data". Zde to jednoduše dejte vše dohromady, do pole pro zápis, pěkně hned za sebe.

Funkce vždy nejprve provede zápis (je-li co zapsat, jinak přeskakuje rovnou na čtení), a potom eventuálně čtení.

Funkce se vrátí FULL-C programu po úplném provedení. V případě úspěchu vrací funkce počet zapsaných (když je jen zápis) resp. přečtených bajtů (když je jakékoliv čtení), v případě neúspěchu chybu (-1).

Prioritu k přístupu na I2C sběrnici má obsluha OneWire rozhraní (které se provádí přes jiné chipy interně připojené na I2C sběrnici, uvnitř SDS). Tato obsluha je vám zcela skryta a nemusí se o ni nijak starat, firmware v SDS se o to postará trvale automaticky samo. Nicméně, pokud budete chtít neustále masivně přistupovat ze svého FULL-C programu na sběrnici I2C, bude občas volání neúspěšné, protože prioritu si vezme SDS samo pro svou obsluhu I2C. Toto je však extrémní případ, který nastane jen někdy když pokud budete opravdu neustále ve smyčce ve svém programu na I2C přistupovat. Ve firmware je přístup ošetřen mutexy, takže nedojde ke kolizi, ale může teoreticky dojít k timeoutu, který je indikován do vašeho programu chybovou hodnotou - je potřeba tedy všechny chybové hodnoty správně ošetřit a eventuálně příkaz opakovat.

Podpora PMBUS/SMBUS kdy periférie sama určí délku zápisu není implementována.

Hodnoty vrácené funkcí SDS_i2c_rw():

  • v případě úspěchu (vše zapsáno či přečteno) vrací funkce (0)
  • v případě NACK vrací funkce (-1)
  • v případě obecné chyby vrací funkce (-2)
  • v případě že je I2C sběrnice právě využívána nadřazeným systémem, vrací funkce (-3)

Chyba -3 je informativní, nejedná se o chybu o komunikace, ale o informaci, že sběrnice I2C je právě zablokována jiným uživatelem (interní činnost v rámci SDS samotného, neboť I2C sběrnice je sdílena). V případě návratové hodnoty -3 je potřeba pokud o přístup k I2C sběrnici zopakovat (a jakmile je I2C sběrnice uvolněna k použití, komunikace z této funkce bude provedena).


Deska SW-RELE6

Jedna z oficiálních I2C rozšiřujících bloků pro SDS-BIG je deska SW-RELE6. Z hlediska I2C sběrnice je realizována pomocí dvou 8-bit expandérů (TCA9554A). Pomocí uvedených dvou FULL-C funkcí lze s touto deskou plně komunikovat a plně obsloužit všechny vstupní i výstupní periférii, které tam jsou osazeny.

Veškerý popis obsluhy desky SW-RELE6 je na odkazované stránce.

Deska SW-RTC-COM-O6

Další oficiální rozšiřující blok je SW-RTC-COM-O6.


UPOZORNĚNÍ

POZOR: podpora pro I2C komunikaci ve FULL-C je k dispozici až s verzí FULL-C 0x0C !