mplabX + SPI

Milan Baša minkob na mail.t-com.sk
Pondělí Březen 25 08:26:09 CET 2013


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


Další informace o konferenci Hw-list