Forum: Mikrocontroller und Digitale Elektronik i2c-eeprom 24lc65


von Ralph Dillhardt (Gast)


Lesenswert?

Hallo,

seit Samstag versuche ich ein eeprom vom Typ 24lc65 an den SW-i2c-bus
anzukoppel. Von der Hardwareseite gab es keine Probleme.

Verwende ich ein beschriebenes eeprom, kann ich die Daten auch
wunderbar auslesen. Was überhaupt nicht funktioniert ist das
beschreiben des eeproms. Mitlerweile habe ich keine Idee mehr wo ich
den Fehler suchen soll.

Verwendet wird ein ATmega161 mit 8MHz Taktfrequenz.
Angeschlossen am SW-i2c-bus sind ein Timer PCF8593 und ein Standard
Display über ein PCA9555D.
Die Leitungen A0-A2 des eeproms sowie WP liegen auf GND.

Kann mir jemand ein Tipp geben?

MfG
Ralph

;---------------------------------------------------------------------;
i2c ack
; Queries for I2C Achknowledge (SDA=Lo)
; T Flag in SREG serves as an error flag
; it is set if there was NAK and cleared if there was an ACK
;---------------------------------------------------------------------
i2c_ack:
    clt      ; clear error flag
    sbi PORTB,sda    ; set SDA Hi
    cbi DDRB, sda    ; set SDA to input (pull-up active)
    sbi PORTB, scl    ; set SCL to Hi
    rcall wait5us
i2c_ackloop:
    sbis PINB, scl    ; Test, ob Wait-State des Slave
    rjmp i2c_ackloop
    sbic PINB, sda    ; reads SDA
    set      ; set error flag when NAK
    cbi PORTB, scl    ; set SCL to Lo
    sbi PORTB, sda    ; set SDA to Hi
    rcall wait5us
    ret

;i2c ack ende
;---------------------------------------------------------------------

;---------------------------------------------------------------------
; i2c write
; Writes eight bits to I2C bus and queries the acknoledge bit from
receiver
;---------------------------------------------------------------------
i2c_write:
           sbi     DDRB, sda            ; set SDA to output
           cbi     PORTB, sda           ; set SDA to Lo
           ldi     bitcntr, 8           ; eight bits to write
_wrt_bit:
           sbrc    i2c_buffer, 7        ; if MSB = Hi then
           sbi     PORTB, sda           ; set SDA to Hi
           nop
           sbi     PORTB, scl           ; set SCL to Hi
           rcall   wait5us
           cbi     PORTB, scl           ; set SCL to Lo
           cbi     PORTB, sda           ; set SDA to Lo
           rcall   wait5us
           lsl     i2c_buffer           ; shift i2c_buffer one bit
left
           dec     bitcntr
           brne    _wrt_bit
           rcall   i2c_ack              ; query acknowledge
           ret

;i2c write ende
;---------------------------------------------------------------------

;---------------------------------------------------------------------
;AT24C64 Eeprom write 1010xxx(fix-Adr)0(write) xxx=000
;---------------------------------------------------------------------
i2c_write_eeprom:
        rcall i2c_start      ;I2C Start Condition
        ldi i2c_buffer, 0b10100000  ;Slave addresse
        rcall i2c_write      ;Write Slave address
  ldi i2c_buffer, 0b00000000  ;address1 byte
  rcall i2c_write      ;Write address1
  ldi i2c_buffer, 0b00000001  ;address0 byte
  rcall i2c_write      ;Write address0
        ldi i2c_buffer, 'T'    ;data byte
        rcall i2c_write      ;Write Data byte
        rcall i2c_stop      ;I2C Stop Condition
i2c_weeprom_loop:
        rcall i2c_start      ;I2C Start Condition
        ldi i2c_buffer, 0b10100000  ;Slave addresse
        rcall i2c_write      ;Write Slave address
  brts i2c_weeprom_loop    ;Ack Polling
  ret

;AT24C64 Eeprom write ende
;---------------------------------------------------------------------

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.