hi guys!

im using SPI between the two pics. here is my program for SPI master

Code:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 7/5/2008                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Include "Modedefs.Bas"

DEFINE HSER_RCSTA 90h 
DEFINE HSER_TXSTA 24h 
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRG 25

define OSC 4

' Set LCD Data port
DEFINE LCD_DREG PORTD
' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_DBIT 0
' Set LCD Register Select port
DEFINE LCD_RSREG PORTC
' Set LCD Register Select bit
DEFINE LCD_RSBIT 0
' Set LCD Enable port
DEFINE LCD_EREG PORTC
' Set LCD Enable bit
DEFINE LCD_EBIT 1
' Set LCD bus size (4 or 8 bits)
DEFINE LCD_BITS 8
' Set number of lines on LCD
DEFINE LCD_LINES 2
' Set command delay time in us
DEFINE LCD_COMMANDUS 2000
' Set data delay time in us
DEFINE LCD_DATAUS 50

SSPEN	VAR		SSPCON1.5	'SSP Enable bit
CKP		VAR		SSPCON1.4	'Clock Polarity Select
SMP		VAR		SSPSTAT.7	'Data input sample phase
CKE		VAR		SSPSTAT.6	'Clock Edge Select bit
SSPIF	VAR		PIR1.3		'SPI interrupt flag

i		VAR		BYTE
j var byte	
as var byte[5]	
com		VAR		byte[2]
sen     var     byte[6]	
teds1   var     byte[10]
teds2   var     byte[10]
teds3   var     byte[10]
op1     var     byte
teds_out var byte[25]
sen0    var     byte[10]
sen_all var     byte[20]
a var byte[10]

TRISC = %10010000	'set PORTC I/O


		
SSPEN = 1			'enable SPI pins
CKP = 0				'clock idle low
CKE = 0				'transmit on idle to active transition
SSPIF = 0			'clear buffer full status
SMP = 0				'sample in middle of data
SSPCON1.0 =  0
SSPCON1.1 =  0
SSPCON1.2 =  0
SSPCON1.3 =	 0

main:
pause 100
j=0
hserout["initialized....",13,10]
pause 1000
hserin [wait("x"),str com\2]
pause 100
hserout["you entered",str com\3,13,10]
pause 100
goto loop


loop:
if j>10 then main
high portB.0
pause 25
low portB.0
pause 25
		GoSub getdata		'initiate conversion and receive data
        LCDOut $fe, 1, STR a\5, DEC a[5]	'display received string
		Pause 100
		hserout [dec a[4]," ",dec a[5]," ",dec a[6],13,10]
		pause 100
		j=j+1
        goto loop			'do it forever
		

getdata:					
		
		SSPBUF = "?"					'send ? to start conversion
		GoSub letclear					'wait for buffer to clear
		IF SSPBUF<>"!" Then getdata		'wait for reply (!)

		For i = 0 to 5		'loop for 6 characters
			SSPBUF = 0		'write to SSPBUF to start clock
			GoSub letclear	'wait for receipt
			a[i] = SSPBUF	'store received character in array
		Next i				'get next character

		Return
		

letclear:

		IF SSPIF = 0 Then letclear	'wait for SPI interupt flag
		PauseUs 25					'25uS fudge factor
		SSPIF = 0					'reset flag
		Return

and here is my SPI slave code

Code:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 7/5/2008                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Include "Modedefs.Bas"

DEFINE HSER_RCSTA 90h 
DEFINE HSER_TXSTA 24h 
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRG 25

define osc 4

DEFINE ADC_BITS 8       
DEFINE ADC_CLOCK 8     
DEFINE ADC_SAMPLEUS 50 


' Set LCD Data port
DEFINE LCD_DREG PORTD
' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_DBIT 0
' Set LCD Register Select port
DEFINE LCD_RSREG PORTC
' Set LCD Register Select bit
DEFINE LCD_RSBIT 0
' Set LCD Enable port
DEFINE LCD_EREG PORTC
' Set LCD Enable bit
DEFINE LCD_EBIT 1
' Set LCD bus size (4 or 8 bits)
DEFINE LCD_BITS 8
' Set number of lines on LCD
DEFINE LCD_LINES 2
' Set command delay time in us
DEFINE LCD_COMMANDUS 2000
' Set data delay time in us
DEFINE LCD_DATAUS 50


out 	 VAR    BYTE[8]		
out2     var    byte[8]
out3     var    byte[8]
teds     var    byte[20]
teds_out var    byte[11]
sen0     var    byte[10]
sen_all  var    byte[20]

i        var    byte
j        var    byte
op1      var    byte

SSPEN	 VAR	SSPCON1.5		
CKP		 VAR	SSPCON1.4		
SMP		 VAR	SSPSTAT.7		
CKE		 VAR	SSPSTAT.6		
SSPIF	 VAR	PIR1.3			

SCL    	 Var    PortB.6         
SDA      Var    PortB.7         

      
TRISC = %11011111		'set PORTC I/O
SSPCON1 = %00000101		'configure SPI slave, no SS
		
CKP = 0					
CKE = 0					
SSPIF = 0				
SMP = 0					

ADCON1 = $00			


INTCON3.3=1
INTCON2.7=0
INTCON2.5=0
INTCON3.0=0
INTCON3.6=1

'***************************************

' PicBasic Pro SPI slave program (see SPImast.bas for connections)


' Allocate RAM
dataout	VAR     BYTE[8]			'Data out array



        'ADCON1 = $00			'PORTA.0 analog, rest PORTA and PORTE pins to digital

        dataout[0] = "A"		'Preset output data to "ADC= "
        dataout[1] = "D"
        dataout[2] = "C"
        dataout[3] = "="
        dataout[4] = " "

find:
if INTCON3.0=1 THEN loop

HIGH PORTC.1
PAUSE 100
LOW PORTC.1
PAUSE 100
goto find


loop:	

INTCON3.3=0
INTCON3.0=0

SSPEN = 0				'disable/enable SSP to reset port
		SSPEN = 1
		GoSub letclear			'wait for byte received
		IF (SSPBUF <> "?") Then loop	'wait for ? to start conversion
		
		ADCIN 1, dataout[5]		'Read ADC channel 0, store in 6th position of string
		pause 50
		GoSub senddata			'send "!" and string of data
		INTCON3.3=1
        pause 10		
		GoTo loop				'do it forever
		

senddata:
		GoSub letclear			'wait until buffer ready
		SSPBUF = "!"			'send reply

		For i = 0 to 5			'loop for 6 array locations
			GoSub letclear		'wait until buffer ready
			SSPBUF = dataout[i]	'send array variable
		Next i					'next location
		
		Return

		
letclear:
		IF SSPIF = 0 Then letclear	'wait for interrupt flag
		SSPIF = 0				'reset flag

		Return



The problem is coming with SPI master. It is connected with serial port to Labview. when the circuit is switched on it displayes

Initialized...

(then it ask to enter two string data)

then it displays

You pressed (string data that we entered)

and then it displays sensor reading 11 times.

I have put the condition that when j>10 then goto main and ask for the string data again.

But this doesnt work. It displays sensor data correctly 11 times, and then initialized is displayed and then it halts, i enter the values but nothing happens. Please tell me what is the problem with this,


I shall be thankful to u for this