loader
Foto

SPI kommunikáció a PIC32MX5XX/6XX/7XX családokban

Korábban már érintettük a PIC32MX5XX/6XX/7XX családban található SPI kommnikációt megvalósító belső perifériának a használatát. Most újra elővesszük ezt a témakört, de már részletes magyarázatot nem adunk, inkább csak a programot közöljük egy rövid magyarázattal.

Egy korábbi cikkben már érintettük az SPI használatának az alapjait. Most megnézzük azt, hogy hogyan tudjuk az SPI1 belső perifériát master módban alkalmazni. Célunk az, hogy egy karaktert tudjunk kiküldeni, ezért készítünk egy olyan függvényt, amely "char" típusú, hiszen az SPI kommunikáció sajátossága az, hogy "kétirányú". Azaz, amikor küldünk adatot a slave eszköz felé, akkor dummy adatot kapunk. Amikor olvasni szeretnénk a slave eszközről, akkor dummy adat kiküldésére kerül sor. Ezért elég egy olyan függvényt írni, amelynek a paramétere lesz a küldendő adat, a visszatérési típusra pedig az olvasás miatt van szükség.

Az SPI alkalmazásunkat a MikroElektronika által készített EasyPIC Fusion v7 fejlesztőpanelen teszteltük. Ezen a fejlesztőpanelen helyet kapott egy olyan Flash memória, amelyet az SPI protokollal érhetjük el (1. ábra).

kep
1. ábra   SPI áramkör a fejlesztőpanelen
 

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

#include <xc.h>

// SYSCLK = 40MHz, PBCLK = 40MHz
#pragma config POSCMOD = OFF, FSOSCEN = OFF
#pragma config FNOSC = FRCPLL, FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_2
#pragma config FPBDIV = DIV_1

#define SDI1    PORTCbits.RC4
#define SDO1    LATDbits.LATD0
#define SCK1    LATDbits.LATD10
#define SS1     LATDbits.LATD9

#define PortConfig()    { TRISCbits.TRISC4 = 1; TRISDbits.TRISD0 = 0; \
                          TRISDbits.TRISD10 = 0; TRISDbits.TRISD9 = 0; }

#define SPI1On()    { SPI1CONbits.ON = 1; }
#define SPI1Off()    { SPI1CONbits.ON = 0; }
#define SS1On()     { SS1 = 0; }
#define SS1Off()     { SS1 = 1; }

void SPI1_Config()
{
    SPI1CON = 0x0120;
    SPI1BRG = 0x0004;
}

char SPI1_Send(char ch)
{
    SPI1BUF = ch;
    while(!SPI1STATbits.SPIRBF);
    return (char)SPI1BUF;
}

// x41 -> 0100 0001
main()
{
    PortConfig();
    SPI1_Config();
    SS1Off();
    SPI1On();
    
    while(1)
    {
        SS1On();
        SPI1_Send('A');
        SS1Off();
        
        // egyéb kódrészlet
    }
}

 

Az SPI2_Send() függvény paraméterlistájába beírtuk az "A" karaktert (0x41), ezt szeretnénk kiírni a flash memóriába. Fordítsuk le a projektünket, és tölsük le a hexa file-t a fejlesztőpanelre. A futási eredmény a 2. ábrán látható.

kep
2. ábra   Mérési eredmény, 0x41 (0100 0001) látható
 

 



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.. . . .