Hi, Hier mal der code, den ich mit dem 24AA1025 verwendet habe:
wichtig ist, dass du beim lesen nach dem senden der Speicheradresse einen RESTART sendest das ist zwar prinzipiell das gleiche wie ein STOP gefolgt von einem START aber der zeitliche ablauf ist dabei einzuhalten. also: restart verwenden.Code:#define ADR_EEPROM1_TX b'10100000' #define ADR_EEPROM1_RX b'10100001' eeprom Lesen DATEN_LESEN_B2 ; bcf INTCON,GIE call I2C_WAIT_EEPROM_NOT_BUSY_B2 ; Weiter, wenn eeprom nicht busy call I2C_ON_B2 movlw ADR_EEPROM1_TX ; EEPROM zum Schreiben Adressieren call I2C_TX_B2 movfw EEPROM_ADR_HBYTE ; Speicheradresse Senden call I2C_TX_B2 movfw EEPROM_ADR_LBYTE call I2C_TX_B2 call I2C_RESTART_B2 ; Restart movlw ADR_EEPROM1_RX ; EEPROM zum Lesen Adressieren call I2C_TX_B2 call I2C_RX_B2 ; Datenbyte Empfangen movfw SSPBUF ; speichern movwf STARTBYTE;1 call I2C_ACK_B2 ; ACK Senden . .hier lese ich eigentlich noch ca.30 weitere bytes ein . . call I2C_RX_B2 ; Datenbyte Empfangen movfw SSPBUF ; speichern movwf KRAFT_BCD_Z;32 call I2C_ACK_B2 ; ACK Senden call I2C_RX_B2 ; Datenbyte Empfangen movfw SSPBUF ; speichern movwf KRAFT_BCD_E;33 call I2C_NACK_B2 ; NOT- ACK Senden call I2C_OFF_B2 ; Bus freigeben return ;********************************************************************************************************** ; eeprom beschreiben ;Datensatz Speichern call I2C_WAIT_EEPROM_NOT_BUSY_B2 ; Weiter, wenn eeprom nicht busy call I2C_ON_B2 movlw ADR_EEPROM1_TX ; EEPROM zum Schreiben Adressieren call I2C_TX_B2 movfw EEPROM_ADR_HBYTE ; Speicheradresse Senden call I2C_TX_B2 movfw EEPROM_ADR_LBYTE call I2C_TX_B2 ;datensatz senden movfw DATUM_BCD_Z call I2C_TX_B2 movfw DATUM_BCD_E call I2C_TX_B2 movfw MONAT_BCD_Z call I2C_TX_B2 movfw MONAT_BCD_E call I2C_TX_B2 movfw JAHR_BCD_Z call I2C_TX_B2 movfw JAHR_BCD_E call I2C_TX_B2 . . . . movfw KRAFT_BCD_ZT call I2C_TX_B2 movfw KRAFT_BCD_T call I2C_TX_B2 movfw KRAFT_BCD_H call I2C_TX_B2 movfw KRAFT_BCD_Z call I2C_TX_B2 movfw KRAFT_BCD_E call I2C_TX_B2 call I2C_OFF_B2 ; Busfreigabe call I2C_WAIT_EEPROM_NOT_BUSY_B2 ; Warten, bis speichervorgang abgeschlossen ist return ;********************************************************************************************************** ;********************************************************************************************************** ; I2C Unterprogramme ; ; I2C Bus im Master Mode Übernehmen I2C_ON_B2 bcf PIR1, SSPIF ; Interrupt flag löschen bsf STATUS, RP0 bsf SSPCON2, SEN ; Bus übernahme anweisen bcf STATUS, RP0 goto I2C_WARTE_B2 ; I2C Bus Restart I2C_RESTART_B2 bcf PIR1, SSPIF ; Interrupt flag löschen bsf STATUS, RP0 bsf SSPCON2, RSEN ; Bus Restart anweisen bcf STATUS, RP0 goto I2C_WARTE_B2 ; ein Byte aus W senden I2C_TX_B2 movwf SSPBUF ; -> zum I2C-Slave übertragen goto I2C_WARTE_B2 ;ein Byte vom Slave empfangen (nach SSPBUF) I2C_RX_B2 bsf STATUS, RP0 bsf SSPCON2, RCEN ; Daten Empfang einschalten bcf STATUS, RP0 goto I2C_WARTE_B2 ; Warte, bis eeprom nicht busy I2C_WAIT_EEPROM_NOT_BUSY_B2 bcf STATUS,RP0 call I2C_RESTART_B2 movlw ADR_EEPROM1_TX call I2C_TX_B2 bsf STATUS,RP0 btfsc SSPCON2,ACKSTAT ; Wenn ACK empfangen: BEENDEN goto I2C_WAIT_EEPROM_NOT_BUSY_B2 bcf STATUS,RP0 call I2C_OFF_B2 nop nop nop nop return ;ein Byte vom Slave empfangen (nach SSPBUF) I2C_ACK_B2 bsf STATUS, RP0 bcf SSPCON2, ACKDT bsf SSPCON2, ACKEN ; ACK senden bcf STATUS, RP0 goto I2C_WARTE_B2 ;ein Byte vom Slave empfangen (nach SSPBUF) I2C_NACK_B2 bsf STATUS, RP0 bsf SSPCON2, ACKDT ; NOTACK senden bsf SSPCON2, ACKEN I2C_NACK1_B2 btfsc SSPSTAT,R_W goto I2C_NACK1_B2 bcf STATUS, RP0 goto I2C_WARTE_B2 ; I2C-Bus wieder freigeben I2C_OFF_B2 bsf STATUS, RP0 bsf SSPCON2, PEN ; Bus Freigabe anweisen bcf STATUS, RP0 I2C_WARTE_B2 btfss PIR1, SSPIF ; SSPIF == 1 ? goto I2C_WARTE_B2 ; nein->sprung bcf PIR1, SSPIF ; SSPIF =0 return ;**********************************************************************************************************
ausserdem verwende ich vor jedem Zugriff eine funktion, die das ACHNOWLEDGE Polling durchführt und damit sicherstellt, dass das eeprom nicht noch mit schreiben beschäftigt ist.
Ich dachte auch erst, dass mein eeprom def ist, lag aber dann doch an der ansteuerung meinerseits.... so wie das doch meistens ist...
habe auch noch ein PDF von microchip angehängt, in dem der umgang mit pic und eeprom über I2C erklärt anschaulich mit code-beispielen weklärt wird. -- doch nicht. das pdf ist mit ~650kb zu gross aber ich sende es dir per e-mail, wenn du mir deine Adresse zukommen lässt...







Zitieren

Lesezeichen