loader
Foto

I2C alkalmazása mastermódban a PIC32MX5xx/6xx/7xx családokban

Érintettük a korábbi cikkeinkben a PIC32MX családok eszközeiben is megtalálható SPI belső perifériát. Most egy másik soros protokollt, az I2C használatának az alapjait nézzük át. Felprogramozzuk a PIC32MX795F512L mikrovezérlő egyik belső I2C perifériát master módra, és különböző karaktereket, adatokat fogunk kiküldeni a fejlesztőpanelen található EEPROM-ba. A fejlesztés során a Mikroelectronika PIC Fusion V7-es tesztpaneljét fogjuk alkalmazni, ahol megtalálható egy olyan EEPROM, amelyet a most bemutatandó soros protokollal tudjuk elérni.

A cikk írásakor a MikroElektronika EasyPIC Fusion v7 fejlesztőpaneljét használtuk, amely tartalmaz egy I2C kommunikációt megvalósító áramkört is (1. ábra). Az SW14 kapcsolósor segítségével tudjuk kiválasztani azt, hogy a PIC32MX795F512L mikrovezérlő melyik belső I2C perifériáját használjuk fel.

kep
1. ábra   I2C kommunikációt megvalósító áramkör az EasyPIC Fusion v7 fejlesztőpanelen
 

A panelen az I2C kommunikációt használó 24AA01 EEPROM található, amelynek a panelen kialakított címe: 001. Ha mikrovezérlőből írni szeretnénk a memóriába, akkor a "Control Code"-nak 1010-et kell lennie, illetve az R/W bit értékét logikai 0-ba kell állítani (2. ábra). 

kep
2. ábra   Írás/olvasás beállítási lehetőségei a 24AA01 EEPROM-nál
 

Szeretnénk írni a mikrovezérlőből a 0x1 (001) címen található memóriába. De hogyan képezzük a címet? A következő ábrán látható az, hogy először kiadásra kerül a Start bit, azután 7 biten kell beállítani a slave eszköz címét. A felső 4 biten találjuk a Control Code-ot (1010), azután kell beírnunk a slave eszköz címét (001), majd a logikai 0 következik, mert írni szeretnénk adatot a memóriába.

kep
3. ábra   Az I2C címmezőjének felépítése a 24AA01 EEPROM-nál
 

Tehát az eszközünk "teljes" címe, amelyet majd ki kell adnunk ahhoz, hogy a slave eszközbe adatot tudjunk írni, az a következő lesz: 10100010 (1010 001 0).

Indítsuk el az MpLABX-et és hozzunk létre egy projektet, majd adjunk ehhez a projekthez egy "C" file-t, amelybe a következő programot másoljuk be.

#include <xc.h>

#define SCL1       LATAbits.LATA14
#define SDA1Out    LATAbits.LATA15

void i2cMasterIdle()
{
    while(I2C1CON & 0x1F);
    while(I2C1STATbits.TRSTAT);
}

void i2cMasterStart()
{
    i2cMasterIdle();
    I2C1CONbits.SEN = 1;
    while(I2C1CONbits.SEN);
}

void i2cMasterStop()
{
    i2cMasterIdle();
    I2C1CONbits.PEN = 1;
    while(I2C1CONbits.PEN);
}

void i2cMasterSend(unsigned char byte)
{
    I2C1TRN = byte;
    while(I2C1STATbits.TRSTAT);
}

void i2cMasterConfig()
{
    I2C1BRG = 0x01E7;
    I2C1CONbits.A10M = 0;
    I2C1CONbits.ON = 1;
}

main()
{
    TRISAbits.TRISA14 = 0;
    TRISAbits.TRISA15 = 0;
    
    i2cMasterConfig();
    
    while(1)
    {
        i2cMasterStart();
        i2cMasterSend(0xA2);
        i2cMasterStop();
    }
}

 

Úgy írtuk meg az alkalmazást, hogy a "Start" és a "Stop" biteket is egy-egy függvénnyel valósítottuk meg. Tehát, ha mi szeretnénk kiadni egy Start bitet, mert adatokat küldenénk az I2C buszon, akkor az "i2cMasterStart()" függvényt kell meghívnunk. A Start és a Stop bitek között tetszőleges számú karaktert tudunk kiküldeni az i2cMAsterSend() függvéény segítségével. Ezzel a függvénnyel egy karaktert tudunk egyszerre kiküldeni.
Fordítsuk le az alkalmazásunkat, és a kapott hexa file-t töltsük le a mikrovezérlőbe. A futási eredmény a következő ábrán látható.

kep
4. ábra   Futási eredmény, amikor az "0xA2"-t írjuk ki az I2C buszra
 

Módosítsuk most a "while(1)" végtelen ciklust a következő részlet szerint, mert az 0xA2 cím kiküldése után egy adatot (0x0A) is kiküldünk..

    while(1)
    {
        i2cMasterStart();
        i2cMasterSend(0xA2);
        i2cMasterSend(0xA);
        i2cMasterStop();
    }

 

Futtassuk újra az alkalmazásunkat, és a következő eredményt kapjuk (5. ábra).

kep
5. ábra   0xA2 és 0x0A értékek az I2C buszon
 

Végül módosítsuk újra a programunkat, további adatokat küldjünk ki az I2C buszon. Látható, hogy korlátlan adatokat tudunk kiküldeni a cím megadása után, a Start és a Stop biteket mi adjuk ki, amikor a hozzájuk tartozó függvényeket meghívjuk.

Adjunk hozzá a "while(1)" végtelen ciklusban további függvényhívásokat.

    while(1)
    {
        i2cMasterStart();
        i2cMasterSend(0xA2);
        i2cMasterSend(0x01);
        i2cMasterSend(0x09);
        i2cMasterSend(0xA);
        i2cMasterSend(0xF);
        i2cMasterStop();
    }

Futtassuk újra a lefordított alkalmazásunkat a tesztpanelen (6. ábra).

kep
6. ábra   Forgalom az I2C buszon
 

 



Egyéb cikkek

További cikkeink ebben a témakörben

Régebbi cikkeink

Október közepén elindítjuk az Atmel 8 bites mikrovezérlőkről szóló sorozatunkat. Ehhez használnunk kell természetesen egy fejlesztőkörnyezetet is. Több ilyen is létezik, például a WinAVR, vagy az Atmel Studio. Mi az Atmel Studio-t fogjuk használni, e. . . .

A PIC18F mikrovezérlők ma is népszerű a fejlesztők körében. Noha 8 bites architektúráról beszélünk, számos érdekes és hasznos alkalmazás megvalósítható vele. Elég csak az USB-re, vagy akár az Ethernetre gondolnunk. Ezért a Szerkesztőség egy sorozat k. . . .

A Microchip által javasolt fejlesztőkörnyezet az MPLABX, amely felváltja az MPlab-ot. Használata nehézkesnek tűnhet, ezért megnézzük ennek az IDE környezetnek a használatát, készítünk egy egyszerű projektet, amely egy PIC32 mikrovezérlőre épül.. . . .