mplabX + SPI

Miroslav Draxal evik na volny.cz
Neděle Březen 24 12:45:49 CET 2013


Dobrý den,

Od včerejška ladím jeden soft pro 18f2620 v mplabX, fyzicky board ještě
nemám, nedaří se mi rozběhnout spi v přerušení. Nezkoušel někdo z Vás,
jestli mplabX 1.70 korektně simuluje SPI? Tváří se mi to, jako by nic
neodesílal. Prostě naplním SSPBUF a následně mi to neskočí do přerušení (nic
se neděje). Míra

 

ps. Trochu jsem to osekal proto tak nelogické nastavování TRIS. atd,
předělávám z softSPI na hwSPI

 

void initSPI (void)

{

#ifdef SPI_HW

    SPI_STROBO = 0;

    SPI_STROBO_TRIS = 0;

    SPI_DATA_IN_TRIS = 1;

 

    CKP = 0; //klidový stav LO

    CKE = 1;

    SMP = 1; //vstupní data jsou snímána po odeslání výstupních dat

    SSPCON1bits.SSPM = 0; //SPI Master mode, clock = FOSC/4

 

    PEIE = 1; // enable peripheral interrupts

    IPEN = 1; // Interrupt priorities enabled

    SSPIP = 0; // low priority interrupt

    //    SSPIF = 0;

    //    SSPIE = 1;

    GIEL = 1; // povol low-level přerušení

    GIE = 1; // povol všechna přerušení

 

#endif

    SPIout_bity.value[0] = 0xff;

    SPIout_bity.value[1] = 0xff;

    SPIout_bity.value[2] = 0xff;

 

    SPIout_bity_old.bitOut.PowerLed = 1; //pro inicializaci SPI (musí se
odeslast do IO samé nuly)

    SPIout ();

}

//__________________________________________________________________________
____________________________________________

#ifdef SPI_HW

 

void SPIint (void)

// u HW SPI se hned zkopírude do SPIout_bity_old, protože se čeká, až se
odešle info do IO po SPI

// v době odesílání po SPI si již může používat SPIout_bity

{

    if (SSPIE && SSPIF)

    {

               //sem skočí pouze 1 a to po SPIout

               //až odešle vše, zakáže SSPIE

    }

}

 

#endif

//__________________________________________________________________________
____________________________________________

 

char SPIout (void)

#ifdef SPI_HW

//HW_SPI

{

    char SPItmp = SPI_vyslanychBytu;

    while (SSPIE); //pokud je povolené přerušení od SPI, potom čekej až to
odešle

    do

    {

               if (SPIout_bity.value[SPItmp - 1] !=
SPIout_bity_old.value[SPItmp - 1])//pokud se změnilo něco v bufru, odešli

               {

                   SPIoutByt = SPI_vyslanychBytu;

                   SPIerrorRepeat = SPI_errorRepeat;

                   SPImode = SPIsave;

                   SPIout_bity_old = SPIout_bity; // zkopíruj pole

 

                   SPI_DATA_OUT = 0;

                   SPI_DATA_OUT_TRIS = 0;

                   SPI_CLK = 0;

                   SPI_CLK_TRIS = 0;

 

                   SSPEN = 1; //povol SPI modul

                   SSPIF = 1; //příznak přerušení

                   SSPIE = 1; //povol přerušení od SPI

                   break;

               }

    }

    while (--SPItmp);

    return 0;

}



__________ Informace od ESET NOD32 Antivirus, verze databaze 8156 (20130324)
__________

Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130324/47083d16/attachment.htm>


Další informace o konferenci Hw-list