@Besserwessi: der Code oben ist ein Slave und kein Master (wie Du vermutet hast).
@oberallgeier: der Code oben läuft, so wie er oben zitiert ist. Allerdings fehlt dann die Funktionalität, mitten in der Übertragung oder nach irgendeinem Byte mit einer Stop-Condition oder Start-Condition vom Master zu operieren. Wenn man diese auskommentierten Zeilen aktiviert, werden die meisten Übertragungen allerdings durch fehlerhaft erkannte (aber nicht vorhandene) Stop-Condition abgebrochen. Das kann man so umschiffen:
Man fragt die Stop-Condition nur während der ersten SCL clock des nächsten Bytes ab, dann gibt es weniger Fehler aber die Funktionalität ist da.
man muß dazu folgende Code Sequenz im Code oben:
- ; the master sends data to the ATtiny26
ldi Temp1,(1<<USIOIF)+0x00 ;16 SCL edges
out USISR,Temp1
ldi Temp1,0 ;ACK=0
out USIDR,Temp1 ;bit 0 will be send as ACK
; wait until the master sends the Data Byte
write_2: ; sbic USISR,USIPF ;stop condition detected?
; rjmp main_loop
sbrc Flags,START_DETECTED ;start condition detected?
rjmp start_cond
sbis USISR,USIOIF
rjmp write_2
durch die folgende ersetzen:
- ; the master sends data to the ATtiny26
ldi Temp1,(1<<USISIF)+(1<<USIOIF)+(1<<USIPF)+0x0E ;2 SCL edges
out USISR,Temp1
;wait for 1 SCL clock to detect stop condition or new start condition
first_SCL:
sbic USISR,USIPF ;stop condition detected?
rjmp main_loop
sbrc Flags,START_DETECTED ;start condition detected?
rjmp start_cond
sbis USISR,USIOIF
rjmp first_SCL
ldi Temp1,(1<<USISIF)+(1<<USIOIF)+(1<<USIPF)+0x02 ;14 SCL edges
out USISR,Temp1
; wait until the master sends the Data Byte
write_2:
sbis USISR,USIOIF
rjmp write_2
Als I2C Master benutze ich die Bibliothek von Peter Fleury, die man auf seiner Homepage herunterladen kann, und zwar den Part, der in rein in Software (ohne Nutzung des TWI-Moduls) für eine C-Compilierung in GNU-Assembler codiert ist.
Lesezeichen