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