Potřeboval jsem něco na přenastavení několika integračů s I2C rozhraním. A náhodou jsem se dozvěděl, že jeden můj kolega zrovna vyzkoušel docela zajímavý čip SC18IM700IPW a chtěl si postavět něco finálního. Tak jsem se k němu přidal.
Jak je vidět, není to přímo USB-I2C, ale UART-I2C převodník, ale když k němu přidáme ještě převodník USB-UART, dostaneme přesně to, co potřebujeme. Na jednu stranu vypadá takové řešení docela kostrbatě, na druhou stranu nic lepšího nás nenapadlo. Třeba Diolan nabízí DLN-2 USB-I2C, ale platit $19 za jeden čip se mi nechtělo. Pak existuje CY8C24894 za $6,5, ale zkuste ji sehnat. SC18IM700 stoji kolem $2, sehnat ji problém není, a I2C-master plus 8 programovatelných vstupů/výstupů rozhodně stoji za to i po přidání nesmrtelné FT232RL od FTDI. A ještě sem přidal pár blbosti na indikaci.
V podstatě, datasheetové zapojení. FT232 komunikuje s SC18IM700 prostřednictvím UARTu a napájí ji ze svého interního stabilizátoru +3,3V. Přes buffer 74HC541 jsou zapojení LEDky na GPIO. Na I2C – přes tranzistory, inverzně, čili blikají jenom při běhání zpráv.
Desky dorazili, osazuji.
Po osazení a vizuální kontrole připojíme k PC a zjistíme číselko vzniklého COM-portu. Pro komunikaci použiji RealTerm. V záložce "Port" nastavím parametry portu: BaudRate – 9600, parity – none, Data Bits – 8, Stop Bits – 1. Protože "Reset" SC18IM700 visí na RTSu FT232, v záložce "Pins" shodíme jej tlačítkem "Clear". Pokud všecko máme v pořádku, a v záložce "Display" zvolíme "ASCII", uvidíme odpověď čipu: "OK" (což je 0x4F 0x4B).
Defoltně piny GPIO-portu jsou nastavené jako vstupy a my můžeme vyčíst jejich stav příkazem. Takže po shození Resetu čip se nám ozve "4F 4B" (OK), a po obdržení zprávy "I" "P" (což v hexu je 49h 50h), pošle stav GPIO portu: 00h. Jelikož ale vstupy jsou vysokoimpedanční, reaguji i na dotek prstu, tím pádem vyčteme z nich i náhodnou blbost, třeba C8:
Piny portu GPIO se dá nastavit na vstup (počáteční stav), na push-pull vystup, na výstup s otevřeným kolektorem a kvazi obousměrný vystup. Pro poslední konfiguraci je třeba do registru 02h/03h nahrát 00h. Formát zpráv je "W" Reg_Data "P", takže pošleme je takto: 57h 02h 00h 50h, pak 57h 03h 00h 50h.
Anebo oba dva najednou: 57h 02h 00h 03h 00h 50h.
Pro nastavení vysoké úrovni, třeba, na lichých pinech portu musím do registru 04h zapsat číslo 01010101b, neboli 55h: 57h 04h 55h 50h
Anebo najednou s nastavením výstupu 57h 02h 00h 03h 00h 04h 55h 57h.
Změnit stav pinů se dá i pomoci zprávy "O" Data "P". Takže když budu chtít rozsvítit sudé LEDky, poslu tam 10101010b, neboli AAh: 4Fh AAh 50h. Samozřejmě, změní se stav jenom pinů, co byli předem nastavené na vystup.
Samozřejmě, je to především I2C převodník, ovšem I2C komunikace je ještě jednodušší, nemá cenu to moc rozepisovat. Používají se dva formáty zprav: "S" "R" Adr. Počet "P" pro čtení ze slave-zařízeni, a "S" "W" Adr. Počet Data "P" pro zápis.
Zbytek, jako power-done mode, nastavení rychlosti atd., najdete v datasheetu a application note AN10397.