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