|
I2CCTR EQU 10H I2CAD EQU 11H REG3 EQU 12H REG2 EQU 13H REG1 EQU 14H REG0 EQU 15H
GENR0 EQU 8H GENR1 EQU 9H BIT_COUNT EQU 9H GENR2 EQU 0AH BYTE_COUNT EQU 0AH
movlw 4H write MOVWF BYTE_COUNT MOVLW B8583W WR_ABC MOVWF I2CCTR MOVFW GENR0 ; WR_MEM MOVWF I2CAD WR_MEM0 MOVLW IORA TRIS RA BSF RA,SCL MOVLW I2CCTR+$20 MOVWF FSR M_START NOP BTFSS RA,SDA RETLW 0FFH ; GOTO ^-1
MOVLW E2OUT TRIS RA NOP BCF RA,SDA ; to start NXBY WR_BYTE MOVLW 8H MOVWF BIT_COUNT BIT_LOOP nop RLF 0H BCF RA,SCL BTFSS 3,0 GOTO ^+3 BSF RA,SDA GOTO ^+2 BCF RA,SDA NOP NOP
BSF RA,SCL DECFSZ BIT_COUNT GOTO BIT_LOOP NOP NOP BCF RA,SCL NOP ACKG NOP MOVLW IORA TRIS RA BSF RA,SCL NOP BTFSC RA,SDA GOTO ACKG
INCF FSR NOP bcf RA,SCL MOVLW E2OUT TRIS RA DECFSZ BYTE_COUNT GOTO NXBY ; W_STOP MOVLW I2CAD+$0A2 SUBWF FSR,W BTFSS 3,0 RETLW 0H M_STOP BCF RA,SDA NOP BSF RA,SCL MOVLW IORA NOP NOP NOP BSF RA,SDA TRIS RA RETLW 0H
;------------------------------ ; ST_CMEMAD MOVFW GENR0 MOVWF I2CAD MOVLW C02W MOVWF I2CCTR MOVLW C02R MOVWF REG3 ; ST_MEMAD MOVLW 2 MOVWF BYTE_COUNT CALL WR_MEM0 MOVLW 1 MOVWF BYTE_COUNT MOVFW REG3 MOVWF I2CCTR CALL WR_MEM0 RETLW 0H ;--------------------------
RD_BYTES MOVWF BYTE_COUNT MOVLW REG3+$20 MOVWF FSR RNXTB BCF RA,SCL MOVLW IORA tris RA MOVLW 8H MOVWF BIT_COUNT RNX BCF RA,SCL NOP BCF 3H,0 BTFSC RA,SDA BSF 3H,0 RLF 0H
BSF RA,SCL NOP DECFSZ BIT_COUNT GOTO RNX
INCF FSR MOVLW E2OUT BCF RA,SCL TRIS RA DECFSZ BYTE_COUNT GOTO T_ACKG R_STOP CALL M_STOP RETLW 0H ; T_ACKG BCF RA,SDA NOP BSF RA,SCL XORLW 0FFH XORLW 0FFH XORLW 0FFH GOTO RNXTB |