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