
;##########################################################################
;#                                                                        #
;#                            By ELECTRO8051                           	  #
;#                                                                        #
;#   Version 2                                       07/12/2001           #
;#                                                                        #
;#                                                                        #
;#     Fichier WRIRAA216                                                  #
;#                                                                        #
;#------------------------------------------------------------------------#
;#                                                                        #
;#  S/pgm emulation bus I2C validé de 12 a 16mhz                          #
;#  sur UC type 8051 a 12Periodes/instruction                             #
;# Pour l'affichage des datas, l'application utilisatrice devra placer    #
;# 20 octets max terminés par 00 dans la table commencant à l'octet       #
;# table_data (1 ligne) ,attention :R0 bank1 modifié                      #
;##########################################################################
;


SDA    		EQU	P1.7	;SDA suivant application
SCL		EQU	P1.6	;SCL suivant application
ADRESS_RAA216  	EQU	70h	;72h,74h,76h, modifier suivant cablage A0,A1
				;70h pour (A0,A1)=0
RB0		EQU     00h     ; Select Register Bank 0
RB1		EQU	08h	; Select Register Bank 1

	DSEG AT 20h

FLAGS:    	 DS     1       ; Bit adressable memory
ACKREC  	 BIT   FLAGS.0  ; Mis à 1 pour indiquer au master d'acquitter un octet en reception

instruction:	   DS     1       ; Octet instruction à écrire par votre application
table_data:	   DS	  21	  ; Table de 20 octets de data (1 ligne)+1 octet 00

STACK:	 	   DS	  1       ; Pile 



	wrraa216 segment code
	rseg wrraa216

;********************************************************
;* titre : Tempo7MicroS		                        *
;*------------------------------------------------------*
;* fonction: tempo de 7 µs à 12mhz		        *
;*  call 2µs,ret 2µs					*
;*							*
;*------------------------------------------------------*
;* param. d'entree : aucun  				*
;********************************************************

Tempo7MicroS:       ;call :2 µs
	nop	;1 µs
	nop	;1 µs
 	nop	;1 us
	ret	;2µs



;********************************************************
;* titre : EmisI2c12m          	                        *
;* Modif : Utilise B                                    *
;*------------------------------------------------------*
;*                     				        *
;* fonction: emet un octet sur bus i2c                  *
;* genere un stop si l'esclave n'acquitte pas           *
;*------------------------------------------------------*
;* param. d'entree : A	     			        *
;* param. de sortie: c =1 succes,c=0 pas d'ack du slave *
;********************************************************
EmisI2c12m:

	MOV	B,#8

     
EMIS1:	
	CLR	SCL

	RLC	A
	MOV	SDA,C    ;Bit info dans SDA
	NOP
	NOP
	SETB	SCL
	NOP
	NOP        
	JNB	SCL,ATTsicl
EMIS2:	
	DJNZ	B,EMIS1
EMIS3:	
	CLR	SCL
	SETB	SDA ;Le master laisse floter SDA pour que le slave le tire à 0:ACK du slave
	nop
	nop
	nop
	
	MOV	B,#20 ;Durée de l'attente du ACK 
	SETB	SCL
	JB	SDA,ATTACQ ;le slave doit donner le Ack par un 0 sur SDA
ACQ:	
	nop
	nop
	nop
	CLR	SCL
	SETB	C	;C=1:le slave a bien acquitté l'octet écrit dans ce dernier
RET2:	
	RET
ATTACQ:		;Attente ACK pendant décrément de B	
	JNB	SDA,ACQ  ;Si ACK reçu Fin
	DJNZ	B,ATTACQ
ARRET:	CALL StopI2c12M
	CLR C	;C=0 pour indiquer pas ACK 
	SJMP	RET2
ATTSICL:
	JB	SCL,EMIS2
	SJMP	ARRET




;***************************************************** 
;* titre : RecI2c12m 			  	     *
;* Modif : Utilise B 				     *
;*---------------------------------------------------*
;*                     				     *
;* fonction: recoit un octet sur bus i2c             *
;*						     *
;*---------------------------------------------------*
;* reg. modifie : A      			     *
;* param. d'entree : bit Ackrec  	   	     *
;* param. de sortie: donnee dans A	             *
;*                                    		     *
;***************************************************** 

RecI2c12m:

	MOV	B,#8
REC1:	
	CLR	SCL
	call Tempo7MicroS
	SETB	SCL
	NOP
	NOP
	MOV	C,SDA
	RLC	A
	DJNZ	B,REC1
	CLR	SCL	;genere 1 master dernier byte
	nop
	nop
	JNB AckRec,glop  ;Ackrec=0 :pas d'ack,Ackrec=1 :acquittement
	CLR SDA
	sjmp glap
GLOP:	SETB	sda  ;Pas de ack:cas octet unique ou dernier octet si plusieurs
glap:	NOP
	NOP
	NOP
	SETB	SCL	; acknowledge
	call Tempo7MicroS
	clr	SCL    
	nop
	nop
	nop
	SETB SDA
	nop
	nop
	nop
	RET















;***********************************************************
;* titre : StopI2c12M 		            	           *
;*---------------------------------------------------------*
;*                     				  	   *
;* fonction: Envoie les conditions de Stop/bus I2c         *
;*                                                         *
;*---------------------------------------------------------*
;* param. d'entree : aucun  			           *
;***********************************************************


StopI2c12M:   
	CLR	SDA
	CLR 	SCL
	SETB	SCL
	Call Tempo7MicroS		;4.7 micro mini	
	SETB	SDA
        RET

;********************************************************
;* titre : StartI2c12M 		                        *
;*------------------------------------------------------*
;*                     				        *
;* fonction: Envoie les conditions de Start/bus I2c     *
;*------------------------------------------------------*
;* param. d'entree : aucun  			        *
;********************************************************



StartI2c12M:   setb 	SDA     ;
	setb SCL
	call Tempo7MicroS	;4,7 µs nécessaire
	clr SDA
        RET

;************************************************************
;* titre : WriteInst 		                            *
;*----------------------------------------------------------*
;*                     				  	    *
;* fonction: Ecriture d'une instruction sur RAA216          *
;* testé de 12 à 16 mhz	 			            *
;*----------------------------------------------------------*
;* param. d'entree : adress_raa216,instruction              *
;* param. de sortie: C=1 ecriture OK,C=0 Incident           *
;************************************************************

WriteInst:

        MOV    SP,#STACK

	LCALL startI2c12m	;Start I2C
	MOV A,#ADRESS_RAA216	;Positionnement de l'adresse du RAA216
	LCALL EmisI2c12m	;Envoi de l'adresse sur le bus I2c
	JNC FIN			;si C=0,le ISS n'acquitte pas
	CLR A			;A=0 pour indiquer octet suivant=instruction
        LCALL EmisI2c12m	;Emission de A sur le bus I2C
	JNC FIN
	MOV A,#instruction      ;Instruction à ecrire sur aff_lcd
        LCALL EmisI2c12m	;Emission de A sur le bus I2C
	JNC FIN
	LCALL StopI2c12M 	;Stop I2C
	SETB C			;C=1 OK
fin:	RET

;************************************************************
;* titre : Writedata 		                            *
;*----------------------------------------------------------*
;* Ecriture des datas  				  	    *
;* fonction: Ecriture d'une table de 21 octets max terminée *
;* par 00 (compris)                                         *
;* testé de 12 à 16 mhz	 			            *
;* Modifie R0 Bank 1					    *
;*----------------------------------------------------------*
;* param. d'entree : adress_raa216,table_data remplie	    *
;* param. de sortie: C=1 ecriture OK,C=0 Incident           *
;************************************************************

WriteData:
        MOV    PSW,#RB1      	; Select register bank 1
        MOV    SP,#STACK

	LCALL startI2c12m	;Start I2C
	MOV A,#ADRESS_RAA216	;Positionnement de l'adresse du RAA216
	LCALL EmisI2c12m	;Envoi de l'adresse sur le bus I2c
	JNC FIN2			;si C=0,le RAA216 n'acquitte pas
        MOV A,#0FFH              ;FF =envoi de data
        LCALL EmisI2c12m	;Emission de A sur le bus I2C
	JNC FIN2

        MOV R0,#table_data
loopx:  MOV A,@R0
        JZ suite		;Si (octet)==0 fin
        LCALL EmisI2c12m	;Emission de A sur le bus I2C
	JNC FIN2
        INC R0
	CJNE R0,#table_data+20,loopx    ;Dernier octet atteint ?
suite:	LCALL StopI2c12M 	;Stop I2C
	SETB C			;C=1 OK
fin2:	RET
				
	END

