SPI nei PIC - 6



Codice assembler per lo SLAVE

Esaminiamo in dettaglio il codice assembler relativo al MASTER. Il file completo può essere scaricato: SPItstS0.asm

Questo e' un semplice esempio che implementa la funzione di SLAVE.

Si nota subito che la verifica degli errori è stata omessa dal codice di esempio per facilitare il codice. 

; SPItstS0.asm
; SLAVE Rev 0
; Demonstrates SPI connection between 2 PICs
; Master sends data (a counter), Slave receives and outputs to LEDs
; on PORTB
La prima parte del programma comprende alcuni commenti sul programma e sulla sua  funzione. 
Avere un  codice ben documentato e commentato è buona pratica generale di scrittura.


list p=16F876
#include "p16F876.inc"
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF
& _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF_ & _XT_OSC
Segue la sezione in cui si fissa il processore utilizzato ( 16f876 nel nostro caso) e si fissa la configurazione del micro mediate la 
direttiva
CONFIG.

I bit della configurazione devono essere settati altrimenti resteranno i valori di default stabiliti nel file di supporto del micro incluso
nel programma ( P16F876.inc ). La configurazione del micro e' la stessa di quella vista per il MASTER
Di seguito la descrizione dei vari termini della direttiva
_CONFIG
_CP_OFF 			permette che la memoria di programma sia letta
_DEBUG_OFF
lascia il dispositivo funzionare senza il tool ICD
_WRT_ENABLE_OFF
disabilita la scrittura sulla memoria da programma
_CPD_OFF
disabilita la protezione dei dati su EEPROM
_LVP_OFF
disabilita la programmazione a bassa tensione permettendo l'uso della PORTB dopo la programmazione
_BODEN_OFF
Brownout di bassa tensione disabilitato
_PWRTE_ON
temporizzazione della partenza ( Power up timer)
_XT_OSC
oscillatore esterno quarzato
_WDT_OFF
watchdog disabilitato
#define SS 0x20 ; PORTA,5 (HW SS pin)
Si definisce quindi mediante una direttiva #define il bit 5 della porta A come segnale SS. 
Laddove si scriverà SS si intende dire PORTA, 5.
	ORG 0
nop ; FOR ICD
Finita la parte iniziale di settaggi del micro si passa al codice che inizia con la direttiva ORG 0 seguita da un nop 
che potrà essere sostituito con istruzioni di codice.
; Set up the SPI Support
BANKSEL TRISA ; BANK 1
movlw 0x20 ; PORTA,5 is SS and it is input
movwf TRISA ;
movlw 0x06 ; Turn Off A/D mode for at least the
movwf ADCON1 ; Chip Select pin (all Digital mode)
; Set up output port
BANKSEL TRISB ; BANK 1
movlw 0x00 ; Configure all PORTB pins
movwf TRISB ; to be in output mode
; Set up the SPI
BANKSEL TRISC ; BANK 1
movlw 0x18 ; SCK is input (Slave), SDI is input,
movwf TRISC ; SDO is output, all others output
Si settano le porte: la PORTA è una porta con funzioni analogiche e si deve avere cura di settarla come 
DIGITALE e non come ANALOGICA disabilitando il convertitore A/D. Si setta il bit 5 come input.
La PORTB è settata per avere tutti i bit come uscita ( TRISB=0x00).
La PORTC è settata in modo da avere in pin SCK come ingresso essendo il clock trasmesso dal MASTER. 
Tutti i altri bit sono configurati come uscite. La direttiva BANKSEL è usata per potere raggiungere i registri
TRISA,TRISB, TRISC e ADCON1 nei rispettivi banchi di memoria diversi ( es BANK1).
; Set up the SPI
movlw 0x40 ; Mode 1,1 SPI with
movwf SSPSTAT ; middle of output time sampling
BANKSEL SSPCON ; BANK 0
movlw 0x34 ; Mode 1,1 SPI Slave Mode, /SS Required
movwf SSPCON ; SSP is on Here is the SPI Slave Code.
Si setta il modulo SSP per essere uno SPI in modalità slave.
; Again, it looks complex, but it is a complete example and not just a 
; segment of code.
Chk4Dat 
	movlw 	SSPSTAT 	; Indirectly test
movwf FSR ; a register by loading FSR
btfss INDF,BF ; Here is the test
goto Skip_ND ; New data, do a transfer (below
RX_Data
	BANKSEL SSPBUF 		; BANK 0
movf SSPBUF,W ; put in SSPBUF into W
BANKSEL PORTB ; BANK 0
movwf PORTB ; Show the results on PORTB
DoAgain
; Optional customer code can go here
goto Chk4Dat ; Receive Next Byte
end

Il ciclo per la ricezione dei dati parte dalla etichetta Chk4Dat Si parte con il test sul bit BF del registro SSPSTAT.

Quando questo si setta, ovvero si e' riempito il buffer, la routine passa alla lettura del contenuto del SSPBUF (RX_Data ) che

rappresenta il dato trasmesso dal MASTER. Questo byte viene quindi caricato sulla PORTB che pilota gli 8 LED

che rappresenteranno visivamente  il valore del dato ricevuto ovvero il valore del contatore presente nel MASTER.

La routine si mette di ascolto sulla linea SDI  fino a che non arriva un dato che sarà poi visualizzato.