mplabX + SPI

Miroslav Draxal evik na volny.cz
Pondělí Březen 25 10:25:23 CET 2013


Asi nepochopeno.

Nejprve init SPI

               (zde se nastaví priorita přerušení, povolí přerušení od periferii, povolí globálně prerušení)

               Nakonec zde skáče na SPIout

SPIout

               Pokud je povolený SPIIE, čekej, protože nedokončil předchozí relaci SPI

               Povol přerušení od SPI (SPIIE), soft.simulace přerušení od SPI(SPPIF), následně okamžitě skočí do přerušení od SPI

SPIint     

               No a sem to právě skočí pouze při soft.simulaci přerušení, čili přerušení je OK.Pokud by odeslal celou SPI, potom by zakázal SPPIE. jenom to jaksi nic neodesílá (v mplabX), otázka je, jestli MPLAB správně simuluje, nebo je chyba mezi klávesnicí a židlí. 

Předpokládám že ta klávesnice a židle. 

Včera jsem si to napsal do mplab 8.88 a taky to nechodí. Inicializuju to podle datasetu, ale nic. Nějak se mi nechce věřit, že by to byla chyba simulace. 

 

#include <htc.h>

//#pragma config CONFIG1H = 0x8

__CONFIG (1, OSC_INTIO67 & FCMEN_OFF & IESO_OFF);

//#pragma config CONFIG2L = 0x1E

__CONFIG (2, PWRT_ON & BOREN_SBORDIS & BORV_3);

//#pragma config CONFIG2H = 0x1E

__CONFIG (3, WDT_OFF & WDTPS_32768);

//#pragma config CONFIG3H = 0x81

__CONFIG (4, CCP2MX_PORTC & PBADEN_OFF & LPT1OSC_OFF & MCLRE_ON);

//#pragma config CONFIG4L = 0x81

__CONFIG (5, STVREN_ON & LVP_OFF & XINST_OFF);

//#pragma config CONFIG5L = 0xF

__CONFIG (6, CP0_OFF & CP1_OFF & CP2_OFF & CP3_OFF);

//#pragma config CONFIG5H = 0xC0

__CONFIG (7, CPB_OFF & CPD_OFF);

//#pragma config CONFIG6L = 0xF

__CONFIG (8, WRT0_OFF & WRT1_OFF & WRT2_OFF & WRT3_OFF);

//#pragma config CONFIG6H = 0xE0

__CONFIG (9, WRTC_OFF & WRTB_OFF & WRTD_OFF);

//#pragma config CONFIG7L = 0xF

__CONFIG (10, EBTR0_OFF & EBTR1_OFF & EBTR2_OFF & EBTR3_OFF);

//#pragma config CONFIG7H = 0x40

__CONFIG (11, EBTRB_OFF);

 

void main(void)

{

#define SPI_DATA_OUT LATC5

#define SPI_DATA_OUT_TRIS      TRISC5

#define SPI_CLK               LATC3

#define SPI_CLK_TRIS     TRISC3

#define SPI_STROBO       LATA4

#define SPI_STROBO_TRIS           TRISA4

#define SPI_DATA_IN     PORTCbits.RC4

#define SPI_DATA_IN_TRIS          TRISC4

               

    OSCCON = 0b01110011;

    ADCON1 = 0b00001111; //RA0-RA3 IO (no AD)

    CMCON = 0b00000111; //RA0-RA2 IO (comparators off)

 

    SPI_STROBO = 0;

    SPI_STROBO_TRIS = 0;

    SPI_DATA_IN_TRIS = 1;

 

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

    CKE = 1;

    CKP = 0; //klidový stav LO

    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í

    

    SPI_DATA_OUT = 0;

               SPI_DATA_OUT_TRIS = 0;

               SPI_CLK = 0;

               SPI_CLK_TRIS = 0;

                   

               SSPEN = 1; //povol SPI modul

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

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

               do

               {}

               while (1);

}

void interrupt low_priority interrupt_low (void)

{

    if (SSPIE && SSPIF)

    {

                              SSPBUF = 0xff;

                              SSPIF = 0;

    }

 

}

 

From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Milan Baša
Sent: Monday, March 25, 2013 8:26 AM
To: HW-news
Subject: Re: mplabX + SPI

 

Dňa 24.03.2013 12:45, Miroslav Draxal  wrote / napísal(a):
> 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;
Tu ste zakazal prerusenie od SPI (defaultne nastavene na 0)
>
>      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 proc neskoci lebo mate zakazane prerusenie a este navyse testujete
zakazane prerusenie na 1
>
>      {
>
>                 //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
Tu by ste mal testovat asi SSPIF - kym sa odosle buffer
>
>      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;
Nastavene CLK na nulu a nikde ho nenastavujete na 1 - ak HW tak sa asi
musite postarat aj o CLK
>
>                     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
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>

Milan
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



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

Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz



__________ Informace od ESET NOD32 Antivirus, verze databaze 8158 (20130325) __________

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/20130325/4c3fd89c/attachment-0001.htm>


Další informace o konferenci Hw-list