- Mi az I2C kommunikációs protokoll?
- Hogyan működik az I2C kommunikáció?
- Hol használható az I2C kommunikáció?
- I2C a Nuvoton N76E003 készüléken - Hardverkövetelmény
- Az AT24LC64 összekapcsolása a Nuvoton N76E003-val - áramköri ábra
- I2C csapok a Nuvoton N76E003-on
- I2C kommunikáció az N76E003-ban
- N76E003 programozása az I2C kommunikációhoz
- A kód és a kimenet villogása
A beágyazott alkalmazások hatalmas rendszerében egyetlen mikrovezérlő sem képes az összes tevékenységet egyedül végrehajtani. Bizonyos szakaszokban kommunikálnia kell más eszközökkel az információk megosztása érdekében, sokféle kommunikációs protokoll létezik ezeknek az információknak a megosztására, de a leggyakrabban használtak az USART, IIC, SPI és CAN. Minden kommunikációs protokollnak megvan a maga előnye és hátránya. Koncentráljunk most az IIC részre, mivel ezt fogjuk megtanulni ebben az oktatóanyagban. Ha még új vagy itt, akkor nézd meg a Nuvoton oktatóanyagokat, ahol az N76E003 mikrovezérlő minden perifériáját a kezdeti oktatóanyagtól kezdve megvitattuk. Ha meg akarja tanulni az I2C használatát más mikrovezérlőkkel, akkor nézze meg az alábbi linkeket.
- Az I2C használata Arduinóban: Két Arduino tábla közötti kommunikáció
- I2C kommunikáció a PIC16F877 PIC mikrovezérlővel
- Összekötő 16X2 LCD és ESP32 I2C használatával
- I2C kommunikáció az MSP430 Launchpad-szal
- Összekötő LCD és NodeMCU az I2C használata nélkül
- A multi kommunikáció (I2C SPI UART) kezelése az Arduino egyetlen programjában
Az I2C egy fontos kommunikációs protokoll, amelyet a Philips (ma NXP) fejlesztett ki. Ezen I2C protokoll használatával az MCU több eszközzel is összekapcsolható, és elindíthatja a kommunikációt. Az I2C csak két vezetékkel működik, mégpedig az SDA-val és az SCL-mel. Ahol az SDA a soros adatokat, az SCL a soros órát jelenti. Ehhez a két csaphoz azonban szükség van a VCC feszültségszintig tartó ellenállásokra, és megfelelő felhúzási ellenállással a busz 127 egyedi címmel rendelkező eszközt támogathat.
Mi az I2C kommunikációs protokoll?
Az IIC kifejezés az „ Inter integrált áramköröket ” jelenti. Általában I2C vagy I négyzetként jelöljük, vagy helyenként 2 vezetékes interfész protokollként (TWI) jelöljük, de mindez ugyanazt jelenti. Az I2C egy szinkron kommunikációs protokoll, vagyis mindkét információt megosztó eszköznek közös órajelet kell használnia. Csak két vezetékkel rendelkezik az információk megosztásához, amelyek közül az egyiket az órajelhez, a másikat az adatok küldéséhez és fogadásához használják.
Hogyan működik az I2C kommunikáció?
Az I2C kommunikációt először Phillips vezette be. Mint korábban említettük, két vezetéke van, ezt a két vezetéket két eszközön fogják összekötni. Itt az egyik eszközt masternek , a másikat pedig slave-nek hívják. A kommunikációnak mindig kettő, egy mester és egy rabszolga között kell és mindig is meg kell történnie. Az I2C kommunikáció előnye, hogy egy masterhez több slave is csatlakoztatható.
A teljes kommunikáció ezen a két vezetéken, nevezetesen a soros órán (SCL) és a soros adaton (SDA) keresztül zajlik.
Soros óra (SCL): Megosztja a master által generált órajelet a slave-lel
Soros adatok (SDA): Az adatokat elküldi a Master és a Slave között és között.
Bármikor csak a mester tudja kezdeményezni a kommunikációt. Mivel egynél több slave van a buszon, a masternek minden egyes slave-re külön címet kell használnia. Ha megkérdezik, csak az adott címmel rendelkező salve válaszol vissza az információkkal, míg a többiek csendben maradnak. Így ugyanazt a buszt használhatjuk több eszközzel való kommunikációhoz.
Hol használható az I2C kommunikáció?
Az I2C kommunikációt csak rövid távú kommunikációra használják. Bizonyos mértékben megbízható, mivel szinkronizált impulzusokkal rendelkezik, hogy okos legyen. Ezt a protokollt főleg az érzékelővel vagy más eszközökkel való kommunikációra használják, amelyeknek információkat kell küldenie a masternek. Nagyon hasznos, ha a mikrovezérlőnek sok más szolga modullal kell kommunikálnia, minimum csak vezetékeket használva. Ha nagy hatótávolságú kommunikációra vágyik, próbálja ki az RS232-et, és ha megbízhatóbb kommunikációt szeretne, akkor próbálja ki az SPI protokollt.
I2C a Nuvoton N76E003 készüléken - Hardverkövetelmény
Mivel ennek a projektnek az a követelménye, hogy az I2C kommunikációt megtanulják az N76E003 használatával, egy EEPROM-ot fogunk használni, amely az I2C adatsorhoz fog kapcsolódni. Néhány adatot tárolunk az EEPROM-ban, és ezeket is elolvassuk, és az UART képernyőn megjelenítjük.
Mivel a tárolt érték az UART-ban lesz kinyomtatva, bármilyen USB-UART átalakítóra van szükség. Megtekintheti az UART Nuvoton használatával kapcsolatos oktatóanyagát is, ha még nem ismeri az N76E003 UART kommunikációját. Alkalmazásunkhoz a CP2102 UART – USB átalakítót fogjuk használni. A fentieken kívül a következő komponensekre is szükségünk van-
- EEPROM 24C02
- 2db 4.7k ellenállás
Nem is beszélve a fenti összetevőkön kívül szükségünk van egy N76E003 mikrokontroller alapú fejlesztőtáblára, valamint a Nu-Link programozóra. Ezenkívül az összes alkatrész csatlakoztatásához kenyérlemez és összekötő vezetékek is szükségesek.
Az AT24LC64 összekapcsolása a Nuvoton N76E003-val - áramköri ábra
Amint az alábbi vázlaton láthatjuk, az EEPROM az I2C vonalon két felhúzható ellenállással van összekötve. A bal szélső részen látható a programozási felület kapcsolata.
Kenyérlapot használtam az AT24LC64 IC-hez, és áthidaló vezetékek segítségével csatlakoztattam az IC-t a nuvoton programozó táblámhoz. Az alábbiakban bemutatom a hardver beállításomat és a nu-ink programozót.
I2C csapok a Nuvoton N76E003-on
Az N76E003 csapdiagramja látható az alábbi kép-
Mint láthatjuk, mindegyik tüskének különböző specifikációi vannak, és mindegyik csap többféle célra használható. Az 1.4-es tűt azonban I2C SDA-tűként használják, elveszíti a PWM-et és más funkciókat. De ez nem jelent problémát, mivel ehhez a projekthez nincs szükség más funkciókra. Ugyanez fog történni a P1.3 esetében, mint az I2C SCL csapja.
Mivel az I2C csapok GPIO-ként működnek, konfigurálni kell őket. Az összes GPIO láb konfigurálható az alábbiakban leírt módban.
Az adatlap szerint PxM1.n és PxM2. n két regiszter, amelyek az I / O port vezérlési működésének meghatározására szolgálnak. Az adatlapban az szerepel, hogy az I2C funkcionalitás használatához az I / O módokat nyílt lefolyóként kell használni az I2C-vel kapcsolatos kommunikációhoz.
I2C kommunikáció az N76E003-ban
Az I2C periféria fontos dolog minden mikrovezérlő egység számára, amely támogatja az I2C funkciókat. A különféle mikrovezérlők sok típusa beépített I2C perifériával rendelkezik. Bizonyos esetekben azonban az I2C manuálisan konfigurálható szoftvervezérléssel, ahol az I2C-hez kapcsolódó hardvertámogatás nem érhető el (például sok 8051 mikrokontroller). A nuvoton N76E003 azonban I2C perifériás támogatással rendelkezik.
Az M76E003 négyféle műveletet támogat I2C módokban - a fő adó, a fő vevő, a slave adó és a slave vevő. Támogatja az I2C vonal normál (100 kbps) és gyors (akár 400 kbps) sebességét is. Az I2C kevés általános szabállyal működik az SCL és az SDA jelvezetékekben.
Start és Stop feltétel:
Fontos dolog az I2C kommunikációban. Amikor az adatokat átviszik az I2C vonalon, azok kezdési feltételekkel kezdődnek és leállási feltételekkel végződnek.
A kiindulási feltétel az SDA magas-alacsony átmenet, amikor az SCL vonal magas, és a leállási állapot az SDA alacsony-magas átmenet, amikor az SCL vonal magas. Ezt a két feltételt a master generálja (az MCU vagy bármi, ami a többi slave eszközt vezérli). A buszvonal ebben az állapotban továbbra is elfoglalt állapotban van, amikor az indítási feltétel elindul, és a megállási állapot elindulásakor ismét szabad marad.
A Start és a Stop feltétel kiválóan látható a jel perspektívájában az N76E003 adatlap-
7 bites cím adatformátummal:
Az N76E003 támogatja a 7 bites címet és adatformátumot. Az indítási feltétel elindítása után a fő eszköznek el kell küldenie az adatokat az I2C vonalon. Az első adatok fontosak. Ha ezeket az adatokat nem megfelelően hozzák létre vagy továbbítják, a csatlakoztatott eszközt nem azonosítják, és további kommunikáció nem folytatható.
Az adatok egy 7 bites hosszú slave címből állnak, amelyet SLA-nak jelölünk. Ennek a 7 bites hosszú címnek egyedinek kell lennie minden eszköz esetében, ha a buszon több eszköz van csatlakoztatva. A 7 bites cím után a 8. bit az adatirányú bit. Ez azt jelenti, hogy a 8. bittől függően a master elküldi az információt a slave eszköznek arról, hogy adatokat írnak-e a slave eszközbe, vagy az adatokat leolvassák a slave eszközről. A 8. bit az R / W bit, amelyet olvasási vagy írási értesítőnek neveznek. Mint mindannyian tudjuk, a 8 bites információk 128 típusúak lehetnek, így 128 eszközt támogatnak, de az I2C 127 típusú eszközt támogat ugyanazon a buszon, de nem 128-at. Mivel a 0x00 cím fenntartott cím, amelyet általános hívási címnek hívnak. Ha a mester információkat akar küldeni minden eszközre,0x00 címet fog kapni, és minden eszköz ugyanúgy fog visszajátszani, mint az egyes szoftverkonfigurációk szerint.
Így az adatátvitel az alábbiak szerint néz ki:
Elismerni:
A fenti adatcímképen a 9. bitet, amelyet az R / W bit követ, nyugtázó bitnek nevezzük. Fontos, mert ennek a bitnek a használatával a master vagy a slave reagál az adatátadóra az SDA vonal alacsony lehúzásával. A nyugtabit megszerzéséhez az adónak ki kell engednie az SDA vonalat.
N76E003 programozása az I2C kommunikációhoz
Az oktatóanyagban használt teljes program az oldal alján található. A kód fontos szegmenseinek magyarázata a következő:
Állítsa be a csapokat nyitott vízelvezetésként, és konfigurálja azokat az I2C-hez:
Kezdjük először az I2C csapszakasszal. Az előzőekben leírtak szerint az I2C SCL és SDA portokat konfigurálni kell, és nyílt lefolyású konfigurációként kell beállítani. Ehhez egy I2C.h fejlécfájlt és egy I2C.c forrásfájlt használunk . A kódrészlet így néz ki:
do {P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while (0)
A fenti kód a P13 és a P14 opciót nyitott lefolyócsapként állítja be, és a clr_I2CPX segítségével a P13 és P14 kerül kiválasztásra SCL tűként a P1.3-on és az SDA csap a P1.4-en.
Ez az I2CPX az I2C vezérlőregiszter I2CON 0. bitje. Ha ezt az I2C_PX értéket 1-re állítjuk , akkor a csapok P0.2-re, SCL-re és P1.6-ra, mint SDA-ra váltanak. Ugyanakkor a P13-at és a P14-et fogjuk használni. Alternatív csapokat itt nem használunk.
I2C ellenőrzési nyilvántartás I2CON:
I2C vezérlő regiszter Az I2CON az I2C műveletek vezérlésére szolgál. Az első bit az I2C tűválasztó bit. A 0 beállítása az I2C tűt P13 és P14 konfigurálja.
Az AA bit az Acknowledge assert zászló, ha az AA flag be van állítva, akkor az ACK visszatér az SCL vonal nyugtázási óra impulzusának idején. Ha törlődik, akkor az NACK (magas szint az SDA-n) visszatér az SCL vonal nyugtázott óraimpulzusának ideje alatt.
A következő bit az SI, amely az I2C állapotmegszakítás. Ha az I2C állapot megszakítása engedélyezve van, akkor a felhasználónak ellenőriznie kell az I2STAT regisztert, hogy megállapítsa, melyik lépést hajtották végre, és meg kell tennie a műveletet.
Az STO az a STOP jelző, amelyet master módban állítanak be. Az STO-t a hardver automatikusan törli, miután a STOP állapotot észlelték.
A következő bit az STA bit. Ha ez a jelző be van állítva, akkor az I2C START feltételt generál, ha a busz szabad. Ha a busz foglalt, akkor az I2C megvárja a STOP állapotot, és a következõkben START állapotot generál. Ha az STA-t akkor állítják be, amikor az I2C már master módban van, és egy vagy több bájtot továbbítottak vagy fogadtak, az I2C megismétli a START feltételt. Az STA-t a szoftvernek manuálisan kell törölnie.
Az utolsó, az I2CEN az I2C busz engedélyező vagy letiltó bitje.
EEPROM 24C02:
Most jön a 24C02. Az N76E003 alaptámogatási csomagja rendelkezik a 24LC64 I2C kódjával, és könnyen módosítható. Az I2C függvény megértéséhez azonban egyszerű módszert fogunk használni.
Ha bárki részletes interfészt akar használni az EEPROM 24C02-vel, akkor a BSP-ben lévő EEPROM program használható.
A 24C02-t csak az I2C-ben fogjuk csatlakoztatni, ahol az N76E003 lesz a master, az EEPROM pedig egy slave. Így minden adatot beírunk az EEPROM címre, és ugyanezt olvassuk.
Az alábbiakban a 24C02 EEPROM csatlakozó látható
Az A0, A1 és A2 három címválasztó csap. A WP csapok írásvédő csapok, és csatlakozniuk kell a VSS-hez, hogy lehetővé tegyék az EEPROM-ba történő írást.
A bájtírási funkció az alábbi kép-
A teljes írási ciklus egy kezdő bittel történik. Ezt követően be kell nyújtani a Control bájtot. A vezérlő bájtban a következő dolgokra van szükség:
A kezdő bit után állítsa be a szolga címét. Az 1010 a statikus, az A0, A1 és A2 a hardver kapcsolaton alapuló cím. Ha a három érintkezõ GND vagy VSS tápellátással van összekötve, akkor 0-nak fog olvasni. Ellenkezõ esetben, ha VCC-hez csatlakozik, akkor ez 1.-nek felel meg. Esetünkben az összes A0, A1 és A2 csatlakozik a VSS-hez. Így mindez 0 lesz.
Költség az írási vagy írási feltételekre. A cím értéke az Olvasás vagy Írás bit segítségével - 0xA0 az Íráshoz és 0xA1 az olvasáshoz. A következő az Acknowledge bit, majd ezt követően egy 8 bites cím kerül továbbításra, ahol az adatokat tárolni kell, végül pedig az adatokat, amelyeket a megfelelő helyen tárolunk. Ezeket a lépéseket lépésről lépésre formázzák a fő funkcióban.
Fő funkció és hurok közben:
void main (void) {char c = 0x00; InitialUART0_Timer3 (115200); TI = 1; // Fontos, a prinft függvény használatának meg kell adnia a TI = 1 értéket; I2C_init (); míg (1) {EEPROM_write (1,0x55); c = EEPROM_olvasott (1); printf ("\ n Az olvasott érték% x", c & 0xff); }; }
A fő funkció egyszerű, folyamatosan ír értékeket az EEPROM-nak az 1. címben, és leolvassa az adatokat. Ezután az adatok kinyomtatásra kerülnek a printf funkció segítségével. A printf hexadecimálisan nyomtatja az értéket.
Az EEPROM írási funkció a következő dolgokból áll, amelyeket az EEPROM szakasz ismertetett.
void EEPROM_write (aláíratlan karakter cím, aláíratlan karakter értéke) {I2C_start (); I2C_write (0xA0); I2C_write (cím); I2C_write (érték); I2C_stop (); }
Az I2C start funkció a következő dolgokból áll:
void I2C_start (void) {jelzett int idő = időtúllépés; set_STA; clr_SI; while ((SI == 0) && (idő> 0)) {idő--; }; }
Ebben a funkcióban az SI státuszt ellenőrzik az előre definiált időtúllépési periódussal együtt (az I2C.h-ben definiálva, ahol az előre definiált idő 1000-re van állítva). A start funkció az STA beállításával és az SI törlésével kezdődik.
void I2C_stop (void) {jelzett int idő = időtúllépés; clr_SI; set_STO; while ((STO == 1) && (idő> 0)) {idő--; }; }
Ugyanaz, mint a Start, stop funkció. A leállítás funkció az STO beállításával, majd az SI törlésével indul. Az alábbi funkció az I2C olvasási funkció-
unsigned char I2C_read (unsigned char ack_mode) {jelzett int idő = időtúllépés; aláíratlan karakter értéke = 0x00; set_AA; clr_SI; míg ((SI == 0) && (t> 0)) {idő--; }; érték = I2DAT; if (ack_mode == I2C_NACK) {t = timeout_count; clr_AA; clr_SI; míg ((SI == 0) && (t> 0)) {idő--; }; } visszatérési érték; }
Az ack_mode és az I2C_NACK az I2C fejlécfájlban egyaránt 0 és 1.
Ehhez hasonlóan létrejön az írási függvény-
void I2C_write (unsigned char value) {jelzett int idő = időtúllépés; I2DAT = érték; clr_STA; clr_SI; while ((SI == 0) && (idő> 0)) {idő--; }; }
A kód és a kimenet villogása
A kód 0 figyelmeztetést és 0 hibát adott vissza, és az alapértelmezett villogó módszerrel villant a Keil. Ha új vagy, nézd meg a nuvoton oktatóanyag kezdő lépéseit, hogy megértsd a kód feltöltését. A kód összeállító információi alább találhatók.
Az 'I2C_EEPROM' cél létrehozása, az I2C_EEPROM.c fordítása… az I2C.c fordítása… összekapcsolás… Programméret: adatok = 59,2 xdata = 0 kód = 2409 hex fájl létrehozása a ". \ Output \ I2C_EEPROM"… ". \ Output \ I2C_EEPROM "- 0 hiba, 0 figyelmeztetés. Összeállítás ideje: 00:00:04 Kötegelt összeállítás összefoglalása: 1 sikeres, 0 sikertelen, 0 kihagyott - Eltelt idő: 00:00:04
A hardvert kenyérlapon állítják fel, és a várakozásoknak megfelelően működik. Amint az alábbi képen látható, tudtunk írni egy értéket az EEPROM-ra, és visszaolvasni a memóriából, és megjeleníteni a soros monitoron.
Nézze meg az alábbi videót, hogy teljes körűen bemutassa, hogyan működik a tábla ehhez a kódhoz. Remélem, hogy tetszett az oktatóanyag, és valami hasznosat tanult, ha bármilyen kérdése van, hagyja őket az alábbi megjegyzés részben. Fórumunkat felhasználhatja egyéb technikai kérdések feltöltésére is.