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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.