;------ rf12_trans -------------------------------------------------------------
;
;	Sendet via SPI XH:XL zum RF12 und speichert die Antwort im selbigen
;
;-------------------------------------------------------------------------------
rf12_trans:
	cbi		RF_PORT, CS			;CS auf 0(aktiv)
	ldi		temp, 16			;16 Datenbits 

rf12_trans_loop:
	lsl		XL					;Ins derzeitige LSB 0 schreiben und schieben
	rol		XH					;Weiterschieben und MSB ins Carry
	cbi		RF_PORT, SDI		;SDI auf 0
	brcc	rf12_trans_0		;Wenn Carry schon leer ist, so lassen
	sbi		RF_PORT, SDI		;Andernfalls SDI auf 1

rf12_trans_0:
	sbic	RF_PIN, SDO			;Wenn SDO auf 1
	ori		XL, 1				;Ins derzeitige LSB 1 schreiben
 
	sbi		RF_PORT, SCK		;Clock-Impuls erzeugen
	nop					
	nop
	cbi		RF_PORT, SCK

	dec		temp				;Bit Zähler runterzählen
	brne	rf12_trans_loop		;Wenn nicht abgelaufen, wiederholen

	sbi		RF_PORT, CS			;CS auf 1(inaktiv)
	cbi		RF_PORT, SDI		;SDI auf 0
ret

;------ rf12_init ------------------------------------------------------------
;
;	Initialisierung des RFM12
;
;-------------------------------------------------------------------------------
RF12_init:
	ldi		temp, (1<<SDI)|(1<<SCK)|(1<<CS)
	out		RF_DDR, temp
	ldi		temp, (1<<CS)
	out		RF_PORT, temp

	rcall	wait_500ms						;wait until POR done
	
	ldiw	X, 0xC0E0						; CR16, AVR CLK: 10MHz
	rcall	rf12_trans						; CR = Control Register
	ldiw	X, 0x80E7						; CR1, el on, ef (FIFO) on, b1+b0=10 für 868
	rcall	rf12_trans
	ldiw	X, 0xC2AB						; CR6, Data Filter: internal
	rcall	rf12_trans
	ldiw	X, 0xCA81						; CR7, Set FIFO mode
	rcall	rf12_trans
	ldiw	X, 0xE000						; CR14, disable wakeuptimer
	rcall	rf12_trans
	ldiw	X, 0xC800						; CR15, disable low duty cycle
	rcall	rf12_trans
	ldiw	X, 0xC4F7						; CR10, AFC settings: autotuning: -10kHz...+7,5kHz
	rcall	rf12_trans
	ldiw	X, 0xA6F8						; CR3, Frequency Setting Command
	rcall	rf12_trans						; Sende/Empfangsfrequenz auf 868,92MHz einstellen
	ldiw	X, 0x948C						; CR5, Receiver Control Command
	rcall	rf12_trans						; 200 kHz Bandbreite, -6dB Verstärkung, DRSSI threshold -79dBm
	ldiw	X, 0xC610						; CR4, Data Rate Command
	rcall	rf12_trans						; Baudrate 19200
	ldiw	X, 0x9870						; CR11, TX Configuration Control Command
	rcall	rf12_trans						; Ausgangangsleistung 6mW, Frequenzshift 120kHz
ret


;----------rf12_ready----------------------------------------------------------
rf12_ready:
	cbi		RF_PORT, SDI
	cbi		RF_PORT, CS			;CS auf 0(aktiv)
	nop					

rf12_wait:
	sbis	RF_PIN, SDO			;Wenn SDO noch nicht 1 ist
	rjmp	rf12_wait			;nochmal schaun, ob es 1 ist
ret

;------ rf12_txdata ------------------------------------------------------------
;
;	Schickt Inhalt von XL in den Sende-FIFO 
;
;-------------------------------------------------------------------------------
rf12_txdata:
	ldiw	X, 0x8238			;CR2, Power management Command, TX on
	rcall	rf12_trans			;er, ebb clear, et, es und ex on
	rcall	rf12_ready
	ldiw	X, 0xB8AA			;CR13, transmit Preamble
	rcall	rf12_trans
	rcall	rf12_ready
	ldiw	X, 0xB8AA			;CR13, transmit Preamble
	rcall	rf12_trans
	rcall	rf12_ready
	ldiw	X, 0xB8AA			;CR13, transmit Preamble
	rcall	rf12_trans
	rcall	rf12_ready
	ldiw	X, 0xB82D			;CR13, transmit Synchron
	rcall	rf12_trans
	rcall	rf12_ready
	ldiw	X, 0xB8D4			;CR13, transmit Synchron
	rcall	rf12_trans
	rcall	rf12_ready
	clr		cnt
rf12_txdata_send:
	lpm
	mov		XL, r0
	ldi		XH, 0xB8
	rcall	rf12_trans
	rcall	rf12_ready
	inc		cnt
	cp		cnt, datacnt
	breq	rf12_txdata_end
	adiw	ZL, 1
	rjmp	rf12_txdata_send
rf12_txdata_end:
	rcall	wait_10ms
	ldiw	X, 0x8208			;TX off
	rcall	rf12_trans
ret

