hallo,
Ich kämpfe jetzt schon einige Tage mit meiner PIC schaltung!
Sie sollte nur einen Wert aus dem EEPROM 24LC512 über die I2C schnittstelle des PIC 16F877 auslesen
und über die Serielle schnittstelle ausgeben.
Leider bekomme ich nur FF zurück.
Ich weiss leider nicht, ob dies an meiner Schreibfunktion oder Lesefunktion liegt.
Würde mich über hilfe sehr freuen
dank im voraus
Hannes
ps: hier meine I2C subroutinen
init_i2c:
;---------------------------------------------------------------------
;baud rate = 100KHz @ 20MHz
banksel SSPSTAT
bsf SSPSTAT,SMP ; Slew rate disable
bcf SSPSTAT,CKE ; i2c standard
banksel SSPCON
clrf SSPCON
bsf SSPCON,SSPM3 ; I2C master mode in hardware
bsf SSPCON,SSPEN ; enable SSP module
movlw 0x31 ; ;
banksel SSPADD ; select SFR bank
movwf SSPADD
bcf STATUS, RP0
bcf STATUS, RP1 ; bank 0
return
;#####################################################################
;I2C unterprogramme
;#####################################################################
;************************************************************
;---------------------------------------------------------------------
I2CSTART:
banksel SSPCON2
bsf SSPCON2, SEN ; START Condition
test_start:
nop
nop
btfsc SSPCON2, SEN ; Prüfen ob START gesendet
goto test_start
banksel PIR1
return
;---------------------------------------------------------------------
;#####################################################################
;---------------------------------------------------------------------
I2CSTOP:
banksel SSPCON2
bsf SSPCON2, PEN
test_stop:
nop
nop
btfsc SSPCON2, PEN
goto test_stop
banksel PIR1
return
;---------------------------------------------------------------------
;#####################################################################
;---------------------------------------------------------------------
I2CSEND:
banksel PIR1
bcf PIR1,SSPIF ; clear interrupt flag
movwf SSPBUF ; move slave address to SSPBUF
test_send:
nop
nop
btfss PIR1,SSPIF ; has SSP completed sending SLAVE Address?
goto test_send ; no, loop back to test_send
bcf PIR1,SSPIF ; clear interrupt flag
return
;---------------------------------------------------------------------
;#####################################################################
;---------------------------------------------------------------------
I2CREAD:
bsf PORTB, 6
banksel PIR1
bcf PIR1,SSPIF ; clear interrupt flag
bsf STATUS, RP0
bcf STATUS, RP1 ; bank1
bsf SSPCON2, RCEN ; Read enable
banksel PIR1
test_read:
nop
nop
btfss PIR1, SSPIF ; fertig?
goto test_read ; nein, noch nicht
bcf PIR1, SSPIF ; ja, alles fertig, nun noch SSPIF zurücksetzen
banksel SSPBUF
movf SSPBUF, W
banksel i2c_buffer
movwf i2c_buffer
banksel SSPCON2
bcf SSPCON2, RCEN
bcf STATUS, RP0
bcf STATUS, RP1 ; bank0
return
;---------------------------------------------------------------------
;#####################################################################
;---------------------------------------------------------------------
I2CCHECKACK:
movlw 0x00
movwf i2ccounter ; Ackpolling counter 0
check_ack:
nop
nop
banksel i2ccounter
incf i2ccounter
btfss STATUS,Z
goto I2CCHECKACK_END
banksel SSPCON2
btfsc SSPCON2,ACKSTAT ; was ACK received from slave?
goto check_ack ;
bsf SSPCON2, ACKSTAT
bcf STATUS, RP0
bcf STATUS, RP1
I2CCHECKACK_END:
return
;---------------------------------------------------------------------
;---------------------------------------------------------------------
I2C_WAKE_EEPROM:
call I2CSTART ; START Condition
I2C_WAKE_LOOP ; RESTART LOOP
movlw EEPROM_ADR ; EEPROM Adresse in W schreiben
btfsc I2C_RW_BIT ; Schreiben oder Lesen ?
bsf W,0
call I2CSEND ; Adr senden
call I2CCHECKACK ; Ack empfangen?
btfss STATUS,Z ; Prüfen ob RESTART gesendet werden muss
return ; Nein: zurück
banksel SSPCON2 ; Ja:
bsf SSPCON2,RSEN ; RESTART einleiten
btfsc SSPCON2, RSEN ; Prüfen ob restart gesendet
goto $-1 ; loop back
goto I2C_WAKE_LOOP ; Adresse erneut senden
return
;---------------------------------------------------------------------
I2C_SEND_ADR:
movwf i2c_eeprom_adr_h
call I2CSEND
call I2CCHECKACK
movwf i2c_eeprom_adr_l
call I2CSEND
call I2CCHECKACK
return
;---------------------------------------------------------------------
I2C_SEND_DATA:
movwf i2c_buffer
call I2CSEND
call I2CCHECKACK
return
;---------------------------------------------------------------------
I2C_READ_DATA:
call I2CREAD
banksel SSPCON2
bsf SSPCON2, ACKDT ; NOT ACK auswählen
bsf SSPCON2, ACKEN ; NOT ACK senden
btfsc SSPCON2, ACKEN ; Polling ob gesendet
goto $-1
return