Napisałem program do obsługi TWI pod atmega8. SDA i SCL mam podciągnięte pod +5V przez rezystory 10kohm. Wydaje się, że jest wszystko dobrze jednak 2 dni nie mogę tego uruchomić. Niżej zamieszczam pełny program do obsługi TWI:
Jest to program obsługi pamięci szeregowej eeprom 24c512. Program zapętla się w pierwszym oczekiwaniu na gotowość magistrali. Jeżeli ustawiam wewnętrzny rezonator 1MHZ to program przechodzi przez podprogram i2c_gotowy, ale za każdym razem odczytana wartość to 161. Sprawdzałem i nie jest generowany sygnał start. Natomiast jak ustawiam 4MHZ lub więcej program wisi w i2c_gotowy.
Czy program jest właściwy a jeżeli tak to może coś nie tak jest ze sprzętem? Czy w przypadku sprzętowego TWI należy ustawiać linie SDA i SCL na wejściowe lub wyjściowe czy tym zajmuje się mikrokontroler automatycznie?
rcall i2c_init
rcall i2c_start
ldi r16,eeprom_adres_zapis ;adres eeprom
rcall i2c_wyslij
ldi r16,0 ;starszy adres pamięci
rcall i2c_wyslij
ldi r16,0 ;młodszy adres pamięci
rcall i2c_wyslij
rcall i2c_start
ldi r16,eeprom_adres_odczyt ;adres eeprom
rcall i2c_wyslij
rcall i2c_czytaj ;czytaj pamięć
rcall i2c_stop
.equ eeprom_adres_odczyt = 0b10100001
.equ eeprom_adres_zapis = 0b10100000
i2c_init:
;Częstotliwość magistrali F=f_sys/(16+2*TWBR*4^TWPS)
;100kHz - 400kHz
ldi r16,(1<<TWPS0)
sts TWSR,r16
ldi r16,18
sts TWBR,r16
ret
i2c_start:
ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ;sygnał start
sts TWCR,r16
rcall i2c_gotowy
ret
i2c_stop:
ldi R16,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
sts TWCR,R16 ; sygnał stop
ret
i2c_wyslij:
sts TWDR,r16 ;ładuj twdr zawartością rejestru r16
ldi r16,(1<<TWINT)|(1<<TWEN) ;Ack
sts TWCR,r16
rcall i2c_gotowy ;czekaj
ret
i2c_czytaj:
ldi r16,(1<<TWINT)|(1<<TWEA)|(1<<TWEN) ;Ack
sts TWCR,r16
rcall i2c_gotowy ;czekaj
lds r25,TWDR ;czytaj dane
ret
i2c_gotowy: ;czekaj na zwolnienie magistrali
lds r16,TWCR
sbrs r16,TWINT
rjmp i2c_gotowy
ret
Jest to program obsługi pamięci szeregowej eeprom 24c512. Program zapętla się w pierwszym oczekiwaniu na gotowość magistrali. Jeżeli ustawiam wewnętrzny rezonator 1MHZ to program przechodzi przez podprogram i2c_gotowy, ale za każdym razem odczytana wartość to 161. Sprawdzałem i nie jest generowany sygnał start. Natomiast jak ustawiam 4MHZ lub więcej program wisi w i2c_gotowy.
Czy program jest właściwy a jeżeli tak to może coś nie tak jest ze sprzętem? Czy w przypadku sprzętowego TWI należy ustawiać linie SDA i SCL na wejściowe lub wyjściowe czy tym zajmuje się mikrokontroler automatycznie?