

;
;		Starting with ATMEL 89C51ED2 and SPI
;
;		LED on port 22 on wait 1 second
;		LED on port 23 on wait one second
;		LED on port 22 off wait one second
;		LED on port 23 off wait one second
;		Oh, the excitement!
;

$NOMOD
$TITLE(BYTE SPI_TEST)
$DEBUG
$OBJECT
$NOPAGING

;Variable declarations

$include(C:\asm51\89C51ED2.inc)

SS	EQU	P2.1 ;J7-29
	rec_data 			Data 	30h
	T1COUNT				Data	31h		;Timer 1 count
	trans_completed 	Bit 	00h
	ALARM1 				Bit 	01h  	;Flag for timer 1 set in timer 1 interrupt


;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;			Macros
		
	START_50MS_TIMER MACRO FIFTY_MS_INTERVALS 	;FIFTY_MS_INTERVALS is the 
											;number of .05 second
											;intervals to wait for
		clr ET1
		clr alarm1
		orl TMOD,#10h       ;Set timer 1 to 16-bit mode
      	MOV TH1,#0B0H       
      	MOV TL1,#03CH ;Initialize TL1 to overflow every .05 seconds
      	SETB ET1            ;Enable timer interrupt 1
      	SETB EA             ;Enable all interrupts
      
      	MOV T1COUNT, FIFTY_MS_INTERVALS  ;Set T1COUNT to 20 to wait for 1s
      	SETB TR1        ;Turn timer 0 on								

ENDM
;
;			End of Macros
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




org 0000H
	
	ljmp MAIN

ORG 001Bh
	
	ljmp T1_INTERRUPT	;Timer 1 interrupt 

org 4Bh
	
	ljmp SPI_INT

org 100h

MAIN:
	orl spcon, #10h
	setb SS
	orl spcon, #82h
	anl spcon, #0F7h ;cpol = 0
	mov a, spcon
	clr acc.2
	mov spcon, a
	orl ien1, #04h
	orl spcon, #40h
	clr trans_completed
	setb ea
	
	

;//////////////////////////////////////////////////////////////////////////////
;
;  Set up MAX6957 registers
;

	
	clr SS
	
	mov SPDAT,#04h				; config register
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
	
   	mov SPDAT,#01h				; disable shutdown, global current control, trans det disabled
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
   	
   	setb SS						; read 2 bytes into SPI slave
	nop						; min CS pulse is 19 ns so at 12 MHz one nop should do it
	
	clr SS
	
	mov SPDAT,#0Dh				; ports 20, 21, 22, 23 config register
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
	
   	mov SPDAT,#0Ch				; set port 22 & 23 to LED Driver
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
   	
   	   	
   	setb SS						; read 2 bytes into SPI slave
	nop					; min CS pulse is 19 ns so at 12 MHz one nop should do it

   	
;//////////////////////////////////////////////////////////////////////////////
;
;  Main loop
;   	
LOOP1:
   	clr SS
   	mov SPDAT,#36h				; port 22
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
	
   	mov SPDAT,#01h				; on
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */

   	setb SS	
	nop						; min CS pulse is 19 ns so at 12 MHz one nop should do it
	
	START_50MS_TIMER #20 ;Delay for 20 * .05 seconds
    jnb Alarm1, $ 

	clr SS
	
	mov SPDAT,#37h				; port 22
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
	
   	mov SPDAT,#01h				; on
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */

   	setb SS	
	
	nop						; min CS pulse is 19 ns so at 12 MHz one nop should do it
	
	START_50MS_TIMER #20 ;Delay for 20 * .05 seconds
    jnb Alarm1, $ 

	clr SS
	
	mov SPDAT,#36h				; port 22
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
	
   	mov SPDAT,#00h				; off
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
   	
   	   	
   	setb SS	
   	nop						; min CS pulse is 19 ns so at 12 MHz one nop should do it
	
	START_50MS_TIMER #20 ;Delay for 20 * .05 seconds
    jnb Alarm1, $ 

	clr SS
	
	mov SPDAT,#37h				; port 23
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */
	
   	mov SPDAT,#00h				; off
   	jnb trans_completed,$		; /* wait end of transmission */
   	clr trans_completed			; /* clear software transfer flag */

   	setb SS	
   	
   	START_50MS_TIMER #20 ;Delay for 20 * .05 seconds
    jnb Alarm1, $ 

	jmp  loop1						; endless loop
	
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;
;			Timer1 interrupt. Timer 1 used for multiples of .05 seconds.	
		
	
T1_INTERRUPT: 
		MOV TH1,#03CH 
		MOV TL1,#0B0H 
		DJNZ T1COUNT,T1_EXIT ;If we haven't reached 0 then jump out of int routine 
		SETB ALARM1
		CLR ET1			  ;stop timer
      	CLR TR1

T1_EXIT: 
RETI 
;
;			End of Timer1 interrupt
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
;
;			SPI interrupt. 	
			
SPI_INT:						;  /* interrupt address is 0x004B */
	
	mov R7,SPSTA
	mov ACC,R7
	jnb ACC.7,BREAK1 			;case 0x80:
	mov rec_data,SPDAT 			;  /* read receive data */
    setb trans_completed 		;  /* set software flag */
BREAK1:

	jnb ACC.4,BREAK2 			;case 0x10:
	cpl p2.0 ;J7-31					; Debugging
		;  /* put here for mode fault tasking */	
BREAK2:
	
	jnb ACC.6,BREAK3 			;case 0x40:
	cpl p2.0 ;J7-31					; Debugging
								;  /* put here for overrun tasking */	
BREAK3:

RETI
;
;			End of SPI interrupt
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

	
END

