Problem with SPI comunication of a PIC
Posted: Mon Nov 06, 2006 4:06 pm
HI all
We tried to use SPI comunication mode to comunicate with a sensor called ADNS 2620. We want to receive a data from the sensor and we use the SPI. First we send the address of the register in which this data is,then we must wait 100 microsec.After that we should receive the data but the sensor doesn't transmit anything.
This is the code we are written in assembler for PIC16F877a.
We accept any suggest...also C code...
list p=16F877a
#include "p16F877a.inc"
errorlevel -302
;*****************
deltaX RES 1
;riservo due bytes per salvare i risultati
;********************************************
ORG 0 ; Begin Code at location 0
nop
;setto la USART
BANKSEL SPBRG
movlw B'10000001'
movwf SPBRG
BANKSEL TXSTA
movlw B'00100110'
movwf TXSTA
BANKSEL RCSTA
movlw B'10000000'
movwf RCSTA
;********************************************
; Set up the SPI Port
BANKSEL TRISC ; BANK 1
movlw B'10010000' ; SCK is output (Master), Sd is input,
movwf TRISC ; SDO is output, all others output
BANKSEL SSPSTAT
movlw B'00000000' ; Mode 1,1 SPI, middle of output
movwf SSPSTAT ; time sampling
BANKSEL SSPCON ; BANK 0
movlw B'00110001' ; Mode 1,1 SPI Master Mode, 1/16 Tosc bittime
movwf SSPCON ; SSP is on
;********************************************
;controllo se esco dal loop
movf B'00110010',w
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART8
btfss PIR1,TXIF
goto loopUSART8
;call delayPOW
lettura
BANKSEL SSPBUF
movf B'01000001',W ; chiedo status in lettura
movwf SSPBUF ; put in SSPBUF
BANKSEL SSPSTAT ; BANK 1
Char1 btfss SSPSTAT,BF ; Data transfer complete? (Buffer Full?)
goto Char1 ; if not, check again
BANKSEL TRISC
bsf TRISC,3
;leggere SSPBUF
BANKSEL SSPBUF ; BANK0
movf SSPBUF,W ; Get Data from SSPBUF
; ; Throw it away
;*******************************************
;bisogna ritardare il clock di almeno 100ns
BANKSEL TRISC ; BANK 1
movlw B'10111000' ; SCK is input (ritardo clock), Sd is input,
movwf TRISC ; SDO is input, all others output
;controllo se esco dal loop
movlw B'00110100'
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART4 btfss PIR1,TXIF
goto loopUSART4
call delayMA
;controllo se esco dal loop
movlw B'00110011'
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART5 btfss PIR1,TXIF
goto loopUSART5
;*******************************************
;riabilita clock
BANKSEL TRISC ; BANK 1
movlw B'10110000' ; SDO is input (per lettura) , Sd is input,
movwf TRISC ;
;comincio a ricevere delta_X
BANKSEL SSPSTAT ; BANK 1
loop1 btfss SSPSTAT,BF ; Data transfer complete? (Buffer Full?)
goto loop1 ; if not, check again
;devo ritardare il clock tra un op. di
;read e l’altra
;controllo se esco dal loop
movlw B'00110101'
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART6 btfss PIR1,TXIF
goto loopUSART6
;leggere SSPBUF
BANKSEL SSPBUF ; BANK0
movf SSPBUF,W ; Get Data from SSPBUF
BANKSEL deltaX
movwf deltaX ;salvo in deltaX
movlw D'48'
addwf deltaX,1
movf deltaX,w
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART
btfss PIR1,TXIF
goto loopUSART
;********************************************
BANKSEL TRISC ; BANK 1
movlw B'10010000' ; SCK is output (Master), Sd is input,
movwf TRISC ; SDO is output, all others output
;********************************************
goto lettura ;ritorno al loop
delayMA
cblock
count
endc
movlw 0x6A
BANKSEL count
movwf count
delayloop
decfsz count,f
goto delayloop
return
delayPOW
cblock
d1
endc
movlw 0xFF
BANKSEL d1
movwf d1
; movlw 0x28
; BANKSEL d2
; movwf d2
; movlw 0x02
; BANKSEL d3
; movwf d3
delayloop1
decfsz d1,f
; goto $+2
; decfsz d2,f
goto delayloop1
; decfsz d3,f
; goto delayloop1
return
END
We tried to use SPI comunication mode to comunicate with a sensor called ADNS 2620. We want to receive a data from the sensor and we use the SPI. First we send the address of the register in which this data is,then we must wait 100 microsec.After that we should receive the data but the sensor doesn't transmit anything.
This is the code we are written in assembler for PIC16F877a.
We accept any suggest...also C code...
list p=16F877a
#include "p16F877a.inc"
errorlevel -302
;*****************
deltaX RES 1
;riservo due bytes per salvare i risultati
;********************************************
ORG 0 ; Begin Code at location 0
nop
;setto la USART
BANKSEL SPBRG
movlw B'10000001'
movwf SPBRG
BANKSEL TXSTA
movlw B'00100110'
movwf TXSTA
BANKSEL RCSTA
movlw B'10000000'
movwf RCSTA
;********************************************
; Set up the SPI Port
BANKSEL TRISC ; BANK 1
movlw B'10010000' ; SCK is output (Master), Sd is input,
movwf TRISC ; SDO is output, all others output
BANKSEL SSPSTAT
movlw B'00000000' ; Mode 1,1 SPI, middle of output
movwf SSPSTAT ; time sampling
BANKSEL SSPCON ; BANK 0
movlw B'00110001' ; Mode 1,1 SPI Master Mode, 1/16 Tosc bittime
movwf SSPCON ; SSP is on
;********************************************
;controllo se esco dal loop
movf B'00110010',w
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART8
btfss PIR1,TXIF
goto loopUSART8
;call delayPOW
lettura
BANKSEL SSPBUF
movf B'01000001',W ; chiedo status in lettura
movwf SSPBUF ; put in SSPBUF
BANKSEL SSPSTAT ; BANK 1
Char1 btfss SSPSTAT,BF ; Data transfer complete? (Buffer Full?)
goto Char1 ; if not, check again
BANKSEL TRISC
bsf TRISC,3
;leggere SSPBUF
BANKSEL SSPBUF ; BANK0
movf SSPBUF,W ; Get Data from SSPBUF
; ; Throw it away
;*******************************************
;bisogna ritardare il clock di almeno 100ns
BANKSEL TRISC ; BANK 1
movlw B'10111000' ; SCK is input (ritardo clock), Sd is input,
movwf TRISC ; SDO is input, all others output
;controllo se esco dal loop
movlw B'00110100'
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART4 btfss PIR1,TXIF
goto loopUSART4
call delayMA
;controllo se esco dal loop
movlw B'00110011'
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART5 btfss PIR1,TXIF
goto loopUSART5
;*******************************************
;riabilita clock
BANKSEL TRISC ; BANK 1
movlw B'10110000' ; SDO is input (per lettura) , Sd is input,
movwf TRISC ;
;comincio a ricevere delta_X
BANKSEL SSPSTAT ; BANK 1
loop1 btfss SSPSTAT,BF ; Data transfer complete? (Buffer Full?)
goto loop1 ; if not, check again
;devo ritardare il clock tra un op. di
;read e l’altra
;controllo se esco dal loop
movlw B'00110101'
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART6 btfss PIR1,TXIF
goto loopUSART6
;leggere SSPBUF
BANKSEL SSPBUF ; BANK0
movf SSPBUF,W ; Get Data from SSPBUF
BANKSEL deltaX
movwf deltaX ;salvo in deltaX
movlw D'48'
addwf deltaX,1
movf deltaX,w
BANKSEL TXREG
movwf TXREG
BANKSEL PIR1
loopUSART
btfss PIR1,TXIF
goto loopUSART
;********************************************
BANKSEL TRISC ; BANK 1
movlw B'10010000' ; SCK is output (Master), Sd is input,
movwf TRISC ; SDO is output, all others output
;********************************************
goto lettura ;ritorno al loop
delayMA
cblock
count
endc
movlw 0x6A
BANKSEL count
movwf count
delayloop
decfsz count,f
goto delayloop
return
delayPOW
cblock
d1
endc
movlw 0xFF
BANKSEL d1
movwf d1
; movlw 0x28
; BANKSEL d2
; movwf d2
; movlw 0x02
; BANKSEL d3
; movwf d3
delayloop1
decfsz d1,f
; goto $+2
; decfsz d2,f
goto delayloop1
; decfsz d3,f
; goto delayloop1
return
END