Capitolul11 - SPI

8

Click here to load reader

description

SPI

Transcript of Capitolul11 - SPI

  • Capitolul 11

    88

    BBLLOOCCUULL SSPPII

    11.1. Introducere Interfaa SPI (Serial Peripheral Interface) este o interfa serial introdus de firma Motorola. n cadrul microcontrolerelor HCS12 este implementat un bloc ce permite conectarea acestora la interfaa SPI. Blocul SPI permite: comunicaia sincron i bidirecional, operarea n modul Master sau Slave, operarea n modul testare de bit (polling) sau n ntrerupere, rat de transfer programabil, funcionarea n modul de ateptare (wait) etc. Registrele utilizate de blocul SPI: SPIBR registru de fixare a ratei de transfer, SPICR1 i SPICR2 registre de control, SPISR registru de stare i SPIDR registru de date. Conexiunile externe utilizate de blocul SPI:

    - MOSI/PM4, n modul Master este ieire de date iar n modul Slave este intrare de date;

    - MISO/PM2, n modul Master este intrare de date iar n modul Slave este ieire de date;

    - SS /PM3, n modul Slave este intrare de selecie. n modul Master acest pin poate fi neutilizat, utilizat ca ieire de selecie Slave sau ca intrare de supraveghere a traficului de pe interfa;

    - SCK/PM5, n modul Master este ieire de tact iar n modul Slave este intrare de tact.

    Exist dou configuraii de funcionare a interfeei SPI, configuraia paralel i configuraia serie. Cea mai utilizat configuraie este cea paralel, structura acestei configuraii este dat n figura 11.1. Se consider c dispozitivul Master este un microcontroler HCS12 iar cele n dispozitive Slave pot fi de tipuri diferite, eventual i un microcontroler HCS12. Conexiunile de acelai tip MOSI, MISO i SCK, de la dispozitivul Master i dispozitivele Slave, se conecteaz mpreun. Tactul este generat prin conexiunea SCK de dispozitivul Master i este recepionat de dispozitivele Slave. Dispozitivul Master genereaz datele prin pinul MOSI i recepioneaz datele prin pinul MISO. Dispozitivele Slave recepioneaz datele prin pinul MOSI i genereaz datele prin pinul MISO. Datele se vehiculeaz n serie i pe octei. Iniiativa unui transfer de date este luat de dispozitivul Master care valideaz un dispozitiv Slave prin selectarea acestuia adic trecerea la nivel cobort a intrrii de selecie /SS. n acest scop dispozitivul Master poate utiliza pinul dedicat /SS sau alt pin de port de intrare i ieire (Sel 2, , Sel n-1). Configuraia paralel are avantajul ratei mari de transfer de date dar are dezavantajul utilizrii unui numr mare de pini ai dispozitivului Master (n+3 pini n cazul existenei a n dispozitive Slave).

  • 11.1. Introducere

    89

    Structura serie cunoscut i sub denumirea daisy chain SPI, prezentat n figura 11.2, utilizeaz numai patru pini ai dispozitivului Master. Reducerea numrului de pini se realizeaz prin utilizarea unei singure linii de selecie i deci toate dispozitivele Slave vor fi selectate simultan. Aceast configuraie este mai lent dect configuraia paralel. De exemplu: dac se dorete citirea dispozitivului Slave i (1i

  • BLOCUL SPI

    90

    11.2. Descrierea blocului SPI Activarea blocului SPI se realizeaz prin setarea bitului SPICR1_SPE (SPICR1_SPE = 0/1 dezactivare/activare bloc SPI), caz n care blocul controleaz pinii dedicai interfeei. Blocul SPI poate lucra n modul Master sau n modul Slave (SPICR1_MSTR = 1/0 modul Master/Slave). Iniiativa unui transfer de date cade n sarcina dispozitivului Master care va genera i tactul de sincronizare prin pinul SCK. Frecvena tactului care stabilete rata de transfer (RataSPI) se obine prin divizarea frecvenei de magistral fBUS. Rata de transfer este dat de relaia (11.1), unde (SPPR) este valoarea exprimat n binar a biilor SPIBR_[SPPR2SPPR0] iar (SPR) este valoarea exprimat n binar a biilor SPIBR_[SPR2SPR0].

    1)(2)1)(( ++= SPR

    BUSSPI

    SPPR

    fRata (11.1)

    n modul Master rata de transfer este cuprins n domeniul fBUS/2048 fBUS/2 iar n modul Slave rata de transfer admis este cuprins n domeniul 0 fBUS/4. De exemplu: pentru fBUS = 8MHz, n modul Master rata este cuprins n domeniul 4KHz 4MHz iar n modul Slave rata este cuprins n domeniul 0 2 MHz. Exist dou moduri de funcionare ale interfeei, modul normal i modul bidirecional. Programarea modului se face cu ajutorul bitului SPICR2_SPC0 (SPICR2_SPC0=0/1 mod normal/bidirecional). n modul normal emisia are loc simultan cu recepia (comunicaie duplex), datele circul prin pinii MOSI i MISO, primul bit care se transfer poate fi bitul MSB sau LSB (SPICR1_LSBFE = 0/1 primul bit care se transfer este bitul MSB/LSB). n figura 11.3 sunt prezentate conexiunile tipice i programarea modului normal de comunicaie. Dispozitivul Master genereaz datele prin MOSI, recepioneaz datele prin MISO, genereaz tactul prin SCK i controleaz linia SS de ieire i selecie Slave. Dispozitivul Slave genereaz datele prin MISO, recepioneaz datele prin MOSI, recepioneaz tactul prin SCK i este controlat prin linia de intrare SS .

    Registru de deplasare

    Registru de deplasare

    Generator de rat

    MISO MISO

    MOSI MOSI

    SCK SCK

    /SS /SS

    Master SPI Slave SPI

    SPICR1_SPE=1 validare SPI SPICR1_MSTR=1- Master SPI SPICR1_MODFEN=1 /SS la SPI SPICR1_SSOE=1-/SS ieire sel. Slave SPICR2_SPC0=0 mod normal

    SPICR1_SPE=1 validare SPI SPICR1_MSTR=0 Slave SPI SPICR2_SPC0=0 mod normal

    Figura 11.3. Modul normal de conectare i control a interfeei SPI.

  • 11.2. Descrierea blocului SPI

    91

    Registru de deplasare

    Registru de deplasare

    Generator de rat

    MOSI MISO MOMI SISO

    SCK

    /SS

    Master SPI Slave SPI

    /SS

    SCK

    SPICR1_SPE=1 validare SPI SPICR1_MSTR=1- Master SPI SPICR1_MODFEN=1 /SS la SPI SPICR1_SSOE=1 /SS ieire sel. Slave SPICR2_SPC0=1 mod bidirecional SPICR2_BIDIROE=0/1 MOMI este intrare /intrare i ieire

    SPICR1_SPE=1 validare SPI SPICR1_MSTR=0 Slave SPI SPICR2_SPC0=1 mod bidirectional SPICR2_BIDIROE=0/1 SISO este intrare/ intrare i ieire

    BIDIROE=0/1

    BIDIROE=1/0

    Figura 11.4. Modul bidirecional de conectare i control a interfeei SPI.

    n figura 11.4 sunt prezentate conexiunile tipice i programarea modului bidirecional de comunicaie. n acest mod exist dou faze de comunicaie (comunicaie semiduplex). n una din faze, dispozitivul Master genereaz datele prin MOMI/MOSI (SPICR2_BIDIROE=1), genereaz tactul prin SCK i controleaz linia SS de ieire i selecie Slave. n acest timp dispozitivul Slave recepioneaz datele prin SISO/MISO (SPICR2_BIDIROE=0), recepioneaz tactul prin SCK i este controlat prin linia de intrare SS . n cealalt faz, dispozitivul Master recepioneaz datele prin MOMI/MOSI (SPICR2_BIDIROE=0), genereaz tactul prin SCK i controleaz linia SS de ieire i selecie Slave. n acest timp dispozitivul Slave genereaz datele prin SISO/MISO (SPICR2_BIDIROE=1), recepioneaz tactul prin SCK i este controlat prin linia de intrare SS . Att n cazul transferului normal ct i n cazul transferului bidirecional de date, a fost utilizat linia de selecie SS a dispozitivului Slave. Dup trecerea de ctre Master a liniei SS n 0 logic, dispozitivul Slave recunoate tactul de la intrarea SCK, accept datele de la intrarea de date, genereaz datele la ieirea de date i deplaseaz datele n registrul su de deplasare. La trecerea liniei SS n 1 logic, dispozitivul Slave ignor impulsurile de tact de la intrarea SCK i pune ieirea sa n nalt impedan. n cazurile n care comunicaia se face numai ntre un dispozitiv Master i un dispozitiv Slave exist posibilitatea ca linia de intrare SS a dispozitivului Slave s fie pus permanent la mas. Linia SS a dispozitivului Master este disponibil. La fel sunt situaii cnd selecia dispozitivelor Slave se face cu ajutorul liniilor porturilor generale de intrare i ieire. Modurile de utilizare a liniei SS , n regimurile Master i Slave i biii de control sunt prezentate n tabelul 11.1.

  • BLOCUL SPI

    92

    Tabelul 11.1. Modurile de utilizare a liniei SS . SPICR2_MODFEN SPICR1_SSOE Modul Master Modul Slave

    0 0 Linia SS este neutilizat Linia SS este intrare de selecie

    0 1 Linia SS este neutilizat Linia SS este intrare de selecie

    1 0 Linia SS este intrare MODF

    Linia SS este intrare de selecie

    1 1 Linia SS este ieire de selecie Slave

    Linia SS este intrare de selecie

    O situaie aparte apare n cazul n care SPICR2_MODFEN=1 i SPICR1_SSOE=0 iar portul SPI este programat ca Master (SPICR1_MSTR = 1). n acest caz pinul SS devine intrare i supravegheaz linia general SS a interfeei SPI. Dac la aceast intrare apare un nivel logic 0 asta nseamn c alt dispozitiv Master ncearc s acceseze interfaa SPI ceea ce constituie o eroare. Acest aspect este indicat de setarea bitului SPISR_MODF i trecerea automat n modul Slave. n timpul unui transfer de date, emisia are loc simultan cu recepia att la dispozitivul Master ct i la dispozitivul Slave. Pentru transferul corect de date, trebuie s existe o anumit sincronizare ntre momentul activrii unui dispozitiv Slave (trecerea liniei SS n 0 logic) i momentele de eantionare a intrrilor i de tranziie a biilor de date din registrele de deplasare. Aceste aspecte sunt precizate de biii SPICR1_CPOL i SPICR1_CPHA care selecteaz patru combinaii n ceea ce privete polaritatea iniial i faza tactului SCK generat de Master. Polaritatea iniial a tactului poate fi 0 sau 1, aspect mai puin important. Important este faza tactului care stabilete unul dintre cele dou formate de transfer de date. Modul de transfer este dictat de dispozitivul Slave, dispozitivul Master poate lucra n orice mod. n figura 11.5 este prezentat formatul 0 de transfer corespunztor valorii SPICR1_CPHA=0. Acest format este utilizat la transferul de date cu dispozitivele Slave care imediat ce sunt selectate (linia SS trecut n 0 logic) genereaz primul bit la ieire i accept primul bit la intrare. Astfel c la primul front de tact (frontul nr. 1) se eantioneaz (se achiziioneaz) primul bit de la intrrile de date. La urmtorul front de tact (frontul nr. 2) se realizeaz deplasarea biilor din registrele de deplasare i se stabilesc noii bii la ieiri. Aceti bii vor fi eantionai cu frontul urmtor al tactului (frontul nr. 3) etc. Ultimul bit este eantionat cu frontul 15 al tactului. Dup frontul 16 al tactului ieirea MOSI trece n 1 logic iar la ieirea MISO este transferat primul bit din octetul urmtor. La transmisii succesive n modul Slave, linia SS trebuie trecut pentru un timp scurt n 1 logic ntre octei, altfel se va recepiona numai ultimul octet.

  • 11.2. Descrierea blocului SPI

    93

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Nr. front SCK SCK pentru CPOL=0

    Eantionare MOSI/MISO

    Tranziia de la ieirea MOSI

    Tranziia de la ieirea MISO

    Pin /SS nceput transfer Sfrit transfer Un nou transfer

    CPHA=0

    SCK pentru CPOL=1

    Figura 11.5. Formatul de transfer 0 (SPICR1_CPHA=0).

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Nr. front SCK SCK pentru CPOL=0

    Eantionare MOSI/MISO

    Tranziia de la ieirea MOSI

    Tranziia de la ieirea MISO

    Pin /SS nceput transfer Sfrit transfer Un nou transfer

    CPHA=1

    SCK pentru CPOL=1

    Figura 11.6. Formatul de transfer 1 (SPICR1_CPHA=1).

    n figura 11.6 este prezentat formatul 1 de transfer corespunztor valorii SPICR1_CPHA=1. Acest caz corespunde dispozitivelor SPI Slave care necesit un front activ de tact pentru a depune la ieirea MISO primul bit. Deplasarea primului bit la ieirea MISO se realizeaz cu primul front al tactului (frontul 1). La urmtorul front al tactului (frontul 2) se realizeaz eantionarea intrrilor. Cu frontul urmtor al tactului (frontul 3) se realizeaz deplasarea biilor din registrele

  • BLOCUL SPI

    94

    de deplasare i se stabilesc noii bii la ieiri. Aceti bii vor fi eantionai cu frontul urmtor al tactului (frontul nr. 4) etc. Ultimul bit este eantionat cu frontul 16 al tactului. Datele de emisie i recepie se vehiculeaz prin registrul de date SPIDR. Pentru emisia i recepia corect trebuie analizai indicatorii de ntrerupere sau trebuie de rspuns la ntreruperile generate. Indicatorii de ntrerupere i biii de validare sunt prezentai n tabelul 11.2.

    Tabelul 11.2. Indicatorii i biii de validare a ntreruperilor. Indicatorii de ntrerupere

    Biii de validare Observaii

    SPISR_SPIF SPICR1_SPIE ntrerupere generat la recepia complet a unui caracter i transferul acestuia n registrul de date SPIDR. Se terge la citirea registrului SPISR (a bitului SPISR_SPIF) urmat de citirea registrului de date SPIDR.

    SPISR_MODF ntrerupere generat la detectarea nivelului 0 pe linia de intrare /SS n modul Master cu bitul SPICR2_MODFEN =1.

    SPISR_SPTEF SPICR1_SPTIE ntrerupere generat la transferul datei de emisie n registrul de deplasare. tergerea bitului se realizeaz prin citirea registrului SPISR (a bitului SPISR_SPTEF) urmat de ncrcarea registrului de date SPIDR.

    11.3. Registrele ataate blocului SPI SPICR1 SPIE0 SPE0 SPTIE0 MSTR0 CPOL0 CPHA1 SSOE0 LSBFE0

    SPICR2 x0 x0 x0 MODFEN0 BIDIROE0 x0 SPISWAI0 SPCO0

    SPIBR x0 SPPR20 SPPR10 SPPR00 x0 SPR20 SPR10 SPR00

    SPISR SPIF0R x0 SPTEF1R MODF0R x0 x0 x0 x0

    SPIDR BIT70 BIT60 BIT50 BIT40 BIT30 BIT20 BIT10 BIT00

    Legend: - notaia biilor Bita din registre: Bit numele bitului, x bit neimplementat (se citete 0 iar

    scrierea nu are efect); a valoare de reset, R bit de tip read only.

    11.4. Programarea blocului SPI Programarea blocului SPI depinde foarte mult de configuraia n care acesta va funciona (mod normal, mod bidirecional, funcionare sau nu n ntreruperi, dac se utilizeaz i emisia i recepia sau numai una dintre acestea, dac se utilizeaz legtura SS , funcionarea n modul de detectarea erorilor etc.). Aceste aspecte se selecteaz din registrele SPICR1 i SPICR2. n modul Master mai trebuie programat i rata de transfer (se va utiliza relaia 11.1 i registrul SPIBR). Scrierea i citirea registrului de date SPIDR se va face n urma testrii indicatorilor de ntrerupere SPISR_SPTEF i SPISR_SPIF. Dm un exemplu de programare a blocului SPI pentru urmtoarea configuraie: mod normal de funcionare, fr ntreruperi, Master, se utilizeaz legtura /SS, primul bit care se transmite este MSB, formatul de transfer al datelor

  • 11.4. Programarea blocului SPI

    95

    este formatul 1 cu polaritatea iniial 1 a tactului, funcionare normal n modul de ateptare, rat de transfer 1 Mbit/s (pentru fBUS = 8 MHz).

    void SPIInit(void) { SPICR1=0b01011110; //SPIE=0, SPE=1, SPTIE=0, MSTR=1, CPOL-CPHA=11, SSOE=1, LSBFE=0 SPICR2=0b00010000; //X, X, X, MODFEN=1, BIDIROE=0, X, SPIWAI=0, SPCO=0 SPIBR=0x02; //X,SPPR2=0,SPPR1=0,SPPR0=0, X,SPR2=0, SPR1=1, SPR0=0, divizare prin 8 }

    Scrierea unui caracter n vederea emisiei se face cu secvena: while(!SPISR_SPTEF); //ateapt ca registrul de date SPIDR s fie disponibil SPIDR=char; //ncarc char n registrul de date ..................................

    Citirea unui caracter recepionat se va face cu secvena: while(!SPISR_SPIF); //ateapt ca registrul de date SPIDR s recepioneze un caracter char=SPIDR; //ncarc registrul SPIDR n char ..................................

    Note bibliografice [1] MC9S12C Family/MC9S12GC Family Reference Manual (Chapter 14 Serial Peripheral Interface (SPIV3) Block Description) Block Description), Rev 01.24, 05/2010, Freescale Semiconductors.