neděle 14. prosince 2014

Další zařízení na I2C (teploměr + bezdrátová EEPROM + GPIO Expander)

K dnešnímu hraní stačilo pomocí propojky uzemnit reset procesoru STM8 na M24LR Discovery destičce.



Po vyhledání najdeme několik nových adres, první je 0x39, jedná se o teploměr STTS751-0W. Jeho adresu je možné nastavit pomocí hodnoty pull-up rezistoru na Addr vývodu. Teploměr zcela nečekaně měří teplotu a jako bonus má ještě jeden vývod pro autonomní ovládání. Chytře vymyšleno, do zařízení stačí jen osadit tento obvod a řídící mcu se nemusí starat o spínání ventilátoru, do registru obvodu je možné nakonfigurovat mez, při které se výstup aktivuje. Čidlo umožňuje nastavení minimální a maximálního prahu pro aktivaci tohoto pinu. Pin je s otevřeným kolektorem a je sdílen s již popsaným adresním pinem. Jedinou nevýhodnou z pohledu čtení pomocí i2cget je skutečnost, že registry s teplotou jsou proloženy status registrem, není je tedy možné číst jedním povelem čímž by se urychlilo zpracování hodnoty.

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- 19 -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- 53 -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- --
70: -- -- -- -- -- -- -- --

Tak zpět ke čtení teploty:

root@OpenWrt:/# i2cget -y 0 0x39 0x00 
0x17
root@OpenWrt:/# i2cget -y 0 0x39 0x02
0x80

Načetli jsme hodnoty 0x80 a 0x17 (0x8017) převedeme je tedy do desítkové soustavy, 32791 naměřená teplota je tedy 32,791 stupňů celsia. Z teploměru je možné taká vyčíst jeho ID, kód rodiny atd.



Popis registrů teploměru STTS751-0W.

Dalším obvodem je Dual Interface EEPROM, je tedy možné k ní přistupovat jak pomocí I2C, tak i NFC rozhraní například v mobilním telefonu.

Načtení obsahu EEPROM paměti pomocí I2C z OpenWRT.

Načtení ID paměti pomocí aplikace NFS Reader pro Android.

PCF8574

Dalším obvodem, se kterým budeme dnes komunikovat je GPIO expandér PCF8574. V porovnání s chytrostí dříve popisovaných zařízení s I2C je tento vlastně jen jeden registr. Do kterého buď data zapisujeme a nebo je jen čteme, předtím je nutné pro registr vstupních pinů nastavit do logické jedničky. Čtením získáme hodnotu na GPIO pinech a zápisem hodnotu na pinech nastavujeme.
Obvod má tři piny pro volbu adresy a jednu nohu indikující přerušení. V našem případě jsou všechny adresní vstupy připojeny na GND, adresa je tedy 0x20. Výhodou tohoto obvodu je možnost v rámci jednoho zápisu zapisovat sekvence dat na port. Každý zapsaný datový bajt je potvrzen a jeho hodnota je okamžitě vystavena na GPIO port. Díky tomu je možné pomocí tohoto expandéru jednoduše realizovat například převodník I2C na rozhraní pro LCD 1602 (v jeho poloviční variantě). Pro čtení je platí stejná možnost jako pro zápis sekvencí. Pomocí i2cdump můžeme periodicky číst stavy portu. Změny kratší než perioda čtení tedy logicky není možné zjistit. Tento problém je možné částečně eliminovat použitím vývodu INT, který je při každé změně (náběžná či sestupná hrana) nastaven do jedničky. Nulování se provádí buď zapsáním nebo vyčtením dat, není tedy nutné periodicky číst stav portu ale přečíst ho až po vyvolání přerušení (bohužel kratší událost než je doba přečtení jednoho cyklu nerozpoznáme).

i2cset -y 0 0x20 0x00 # zapisujeme samé nuly
i2cset -y 0 0x20 0x0f # zapisujeme samé jedničky
i2cget -y 0 0x20    # čteme stav na pinech obvodu


http://www.st.com/web/en/resource/technical/document/datasheet/DM00038059.pdf
http://www.st.com/web/en/resource/technical/document/datasheet/CD00252523.pdf
http://www.nxp.com/documents/data_sheet/PCF8574_PCF8574A.pdf

Žádné komentáře:

Okomentovat