Guida in materia di programmazione SPI (C) per PIC16F877!

R

reddster

Guest
Ciao a tutti!

Sono uno studente in fase di un progetto che coinvolge l'interfacciamento
del PIC16F877 ad un Phase Locked loop device (ADF4360 -

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Fresco" border="0" />

utilizzando la SPI.

Fondamentalmente, ho bisogno di inviare, via SDO, 3 partite di 24 bit per
il dispositivo per inizializzare esso.Sono preoccupato che io possa perdere poche righe
di codice, perché non ho potuto rilevare il segnale SCK dal pin SCK (RC3).
Inoltre, sto facendo in modo corretto per l'inizializzazione del SSPSTAT, SSPCON
e la parte di invio?

Mi rendo perfettamente conto del vostro aiuto!

Questo è il mio codice in linguaggio C:# include <pic1687x.h>
# include "delay.c"void main () (PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;

TRISC = 0b00010000; / / RC4 = dati SPI In
TRISD = 0x00;
TRISB = 0b00000001; / / input = RB0
TRISA = 0x00;
TRISE = 0x00;/ / PLL inizializzazione
/ / Contatore R = 0011 0000 0000 0000 0111 1001
/ / Control latch = 0000 1111 1111 0001 0000 0100
/ / Contatore N = 0000 0000 1011 0100 0000 0010SSPSTAT = 0b01000000;
SSPCON = 0b00100010;

SSPBUF = 0b00110000; / / contatore R
SSPBUF = 0b00000000;
SSPBUF = 0b01111001;
RA5 = 1; / / LE alta per trasferire i dati dal registro a scorrimento a scrocco
RA5 = 0;

SSPBUF = 0b00001111; / / Control
SSPBUF = 0b11110001;
SSPBUF = 0b00000100;
RA5 = 1; / / LE alta per trasferire i dati dal registro a scorrimento a scrocco
RA5 = 0;

DelayMs (20); / / Delay tra controllo e N Counter

SSPBUF = 0b00000000; / / N Counter
SSPBUF = 0b10110100;
SSPBUF = 0b00000010;
RA5 = 1; / / LE alta per trasferire i dati dal registro a scorrimento a scrocco
RA5 = 0;while (1) (

if (RB0 == 1) / / Quando RB0 è alta, tirare CE pin alta per accendere il PLL
RC1 = 1;
if (RB0 == 0) / / Quando RB0 è bassa, tirare CE ridotto di pin per disattivare PLL
RC1 = 0;

)
) / / Fine del mainGrazie ancora!

 
Io non ho usato la MMSP 877s, ma penso che devi controllare che SSPBUF che ha svuotato prima di scrivere il byte successivo.Il apnote dice qualcosa circa il controllo dei WCOL.
[modifica] appena trovato questo tutorial decente sul http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf sito microchip si dice che si deve controllare il flag buffer pieno e leggere il buffer anche se solo la scrittura dei dati .[/ edit]

la velocità è il dispositivo PLL?Hai impostato l'orologio SPI a Fosc/64 a 20 MHz di clock, si esegue esso a 20/65 mhz.o 3.2 uS per bit.Potrebbe essere necessario bang po SPI se è troppo veloce.Bitbanged SPI è molto molto semplice.A meno che non avete bisogno della velocità del dispositivo di MSSP, avrei po 'bang SPI comunque dato che) il suo un protocollo molto semplice e b), io preferisco salvare il MSSP per impieghi ad alte prestazioni (come I / O seriale o I2C).

Phil

 
Oh .. grazie mille per la risposta e il link .. Quindi, in fondo, ho bisogno di fare una lettura fittizia per azzerare il SSPBUFF prima che io possa fare la prossima trasmissione?Inoltre, per quanto riguarda la necessità di verificare lo stato del buffer prima trnsmitting il byte successivo, mi sono confuso su quale i bit bisogno di controllare.È WCOL o SSPOV.

-------------------------------------------------- -------------------------------------
Ecco un estratto dal datasheet PIC16F877 per quanto riguarda la 2 bit:

WCOL: (Master Mode) 1 = A scrivere a SSPBUF è stata tentata anche se le condizioni non erano validi I2C
0 = Nessuna collisione

SSPOV: (SPI Mode) 1 = A new byte viene ricevuto, mentre il SSPUF contiene i dati precedenti.Dati in SSPSR si perde in overflow.In modalità slave, l'utente deve leggere il SSPBUF, anche se solo trasmissione dei dati, al fine di evitare overflow.In modalità Master, il bit di overflow non è impostato, in quanto ogni operazione è avviata da iscritto al registro SSPBUF.(Devono essere abilitati nel software).
0 = No overflow
-------------------------------------------------- -------------------------------------

Dal link dato da Phil, capisco la necessità di fare una lettura fittizia dopo ogni trasmissione.Ma come faccio a sapere se la trasmissione è fatta prima che io possa effettivamente svolgere il manichino di leggere?

Grazie per il vostro gentile aiuto!

 
no, devi loop in attesa per il buffer di bandiera pieno, quindi effettuare la lettura.

 
Grazie per le informazioni!

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />

Quindi, sto facendo bene il seguente codice?# include <pic1687x.h>
# include "delay.c"

char dummy_read_byte;

void spi_send (char);

void main () (PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
PORTD = 0x00;
PORTE = 0x00;

TRISC = 0b00010000; / / RC4 = dati SPI In
TRISD = 0x00;
TRISB = 0b00000001; / / input = RB0
TRISA = 0x00;
TRISE = 0x00;SSPSTAT = 0b01000000;
SSPCON = 0b00100010;

dummy_read_byte = SSPBUF; / / do una lettura fittizia

spi_send (0b00110000);
spi_send (0b00111110);
spi_send (0b10100011);

)
) / / Fine del mainspi_send void (char) (

int i = 0;
char dummy_read;
char bf_status;

SSPBUF data = / / invia bytewhile (i! = 1) (/ / non uscire loop po 'meno BF = 0
bf_status = SSPSTAT & 0x01; / / controlla se il bit è 0 BF
if (bf_status == 0x00)
i = 1;
)

dummy_read = SSPBUF; / / read dummy

)Grazie in anticipo!

<img src="http://www.edaboard.com/images/smiles/icon_biggrin.gif" alt="Very Happy" border="0" />
 

Welcome to EDABoard.com

Sponsor

Back
Top