MCP2221A je velmi zajímavý "multifunkční" integrovaný obvod. Zprostředkovává roli převodníku USB-MasterI2C, USB-UART, AD převodníku, DA převodníku a má ještě čtyři konfigurovatelné piny - takže i roli expandéru. K sehnání je za celkem rozumné peníze (od 70kč s DPH) v různých pouzdrech včetně DIL. Díky tomu může sloužit i méně zdatným bastlířům, kterým pájení SMD činí potíže. Microchip poskytuje DLL knihovny pro ovládání obvodu počítačovým programem, drivery pro Windows, Linux, Mac a dokonce terminál i pro android. Co je pro nás hlavní, stejně jako u SPI brášky MCP2210" dává Microchip k dispozici i grafický "Terminál". Ten umožňuje docela přehledně ovládat všechny funkce a dává nám tak do rukou docela dobrý nástroj na vývoj aplikací s I2C. Pojďme si tedy ve stručnosti představit terminál a jednotlivé funkce.
DA převodník je hodně nadnesený název pro to co v MCP2221 najdeme. Má totiž jen 5bit rozlišení a je tedy schopen realizovat pouhých 32 hladin. Zda něco takového najde využití netuším. Jeho výstup můžeme vyvést buď na piny GP2 a GP3 a jako referenci může sloužit VDD (napájení obvodu) a nebo jedna ze tří vnitřních referencí (1.024V, 2.048V, 4.096V). Vyzkoušel jsem různé konfigurace s různým nastavením a chyba nikdy nepřekročila 0.8%. Výstup převodníku se jeví jako rail to rail.
AD převodník má rozlišení 10bitů, může používat stejné reference jako DAC (tedy VDD, 1.024V, 2.048V a 4.096V). Měřit lze napětí na třech pinech (GP1,GP2 a GP3). Letmý test měření polohy 1k potenciometru s referencí VDD vracel stabilní výsledek s šumem +-0.5LSB.
Pro účely USB-UART převodníku je obvod vybaven 64byte bufferem na vysílací straně a 384byte bufferem na přijímací straně, což více než bohatě postačuje pro klasickou terminálovou komunikaci. S přijímáním delších sekvencí než oněch 384byte může vzniknout problém, neboť obvod neobsahuje žádnou funkci řízení toku. Dosažitelné přenosové rychlosti pokrývají oblíbené varianty jako 115200 či 38400b/s.
Terminál je docela komplexní program, který zpřístupňuje většinu funkcí počínaje konfigurací pinů, přes ovládání ADC a DAC až po samotnou I2C komunikaci na kterou se zaměřím nejprve. V okně Commands zadáváme příkazy, které lze vykonávat jednorázově (kliknutí na Send) a nebo jako sekvenci. V takovém případě se kliknutím na Send All postupně provedou všechny "zašrtnuté" příkazy. Na obrázku vidíte sekvenci která má z DS3231 vyčíst stav Control registru. Po kliknutí na Send All zapíše aplikace do slave s I2C adresou 0x68 hodnotu 0x0E čímž DS3231 sdělí že bude pracovat s registrem na této adrese (Control register). V druhém kroku aplikace přečte z DS3231 1 bajt. Výsledek akce se vypisuje v dolní části okna Received/Sent Data. Vidíme že zápis i čtení proběhlo v pořádku a že slave vrátil hodnotu 0x1C. Což je výchozí stav Control registru v DS3231. Tím jsme si tedy ověřili že akce proběhal správně. Všimněte si že všechny hodnoty jsem zadával v hexa podobě. V pravé části okna lze přepnout do desítkového zápisu a také zde lze měnit komunikační rychlost.
Jistě jste si všimli že příkazy pro zápis i čtení jsou od sebe oddělené.Nejprve se provede a skončí (Stop bitem) zápis a pak se zahájí naprosto samostatné čtení. Tento postup není běžný, běžný a bezpečnější (detaily třeba zde) je podržet si kontrolu nad sběrnicí po celou dobu a využít "restart" (znovu-vygenerování Startbitu). To umí i naše terminálová aplikace, zvolíme-li protokol SMBus. Po zvolení tohoto protokolu se odkryje políčko "Register Index", do nějž můžeme vyplnit jeden byte, který se odešle vždy v úvodu sekvence. To je kompatibilní se způsobem komunikace s valnou většinou I2C slave obvodů. Stejná operace jako v prvním případě může vypadat i takto:
Prodleva která je patrná na oscilogramu z komunikace pomocí SMBus, je stejná i při použití I2C a činí přibližně 24ms. Prodlevy mezi jednotlivými příkazy se dají zvětšit a slouží k tomu políčko Delay k jehož hodnotě se vždy přičte oněch "základních" 24ms. Tento jev je docela nepříjemný a časové prodlení se blíží k maximálním povoleným limitům SMBus komunikace.
Další užitečnou funkci najdete po rozkliknutí tlačítka Advanced settings. Zpřístupní vám I2C scanner, kde si můžete zvolit rozsah prohledávaných adres. Ukátzkový scan na modulku obsahujícím DS3231 a EEPROM 24C32N vrací v přehledném zápisu přítomnost slave se 7bit adresou 0x57 (EEPROM) a adresou 0x68 (DS3231).
Jak již bylo řečeno, krom I2C komunikace umí terminál operovat se všemi ostatními funkcemi obvodu. Dovolím si to demonstrovat na následující sekvenci.
Během testů jsem narazil na celou řadu ne úplně příjemných bugů. Dlouhou prodlevu mezi jednotlivými příkazy jsme již zaznamenali, ale to není všechno. Pokud sekvence obsahuje I2C příkazy i příkazy pro čtení ADC vygeneruje obvod na sběrnici "sračku" (jak jinak to co vidíte na oscilogramu níže nazvat). Netestoval jsem tuto chybu hlouběji, ale je možné že podobné nepříjemnosti vzniknou i v jiných situacích než jen při AD převodu.
Dalším bugem je funkce Clock Reference Output, která má umožňovat vypustit ze zařízení clock různých frekvencí. Ten je odvozený od interního 48MHz clocku potřebného pro USB komunikaci a je ho frekvence se jeví docela přesná. Bohužel clock je katastrofálním způsobem zaplevelen 140ns pulzy, které se každou ms přimíchají k výstupnímu signálu. Výsledkem je pak prakticky naprosto nepoužitelný signál, který vidíte na oscilogramu. Je to velká škoda, protože jak si můžete všimnout clock na snímku drží krásných 11.998MHz.
I přes zmíněné bugy se MCP2221 může stát užitečným pomocníkem. Například při psaní aplikací kde mikrokontrolér vystupuje v roli I2C slave, nebo při ověřování funkce různých čidel, senzorů a jiných slave I2C zařízení. Někdy se vyplatí si vyzkoušet příslušné funkce, než se člověk rozhodne je zapracovat do programu pro mikrokontrolér, aby tak odhalil případné komplikace zavčas.
Home
| V1.00 9.7.2020 /
| By Michal Dudka (m.dudka@seznam.cz) /