Witam, ostatnio zabrałem się za opanowanie interfejsu I2C (TWI).
Staram się od dobrych 2 dni odczytać dane z układu PCF8583 (RTC).
Napisałem gromadę funkcji do obsługi I2C, większość pochodzi z książki "Język C dla mikrokontrolerów AVR" więc sądzę że nie mają błędów.
Pierwszym problemem jest adres jaki ma układ ma podłączone wejście A0 do zasilania czyli adres powinien wyglądać tak 1010 001 (0/1) czyli 0xA2 lub 0xA3
a okazuje się że układ odpowiada jedynie na adresy 0xA0 i 0xA1. Jest to zastanawiające ale to nie główny problem.
Chciał bym odczytać jakikolwiek rejestr z pamięci PCF.
Wykonuję Kolejno czynności:
-Inicjuję I2C (I2C_Init)
- Wysyłam START transmisji i adres układu z 1 na końcu czyli zapis (I2C_SendStartAndSelect)
- Wysyłam adres rejestru do odczytu (I2C_SendByte)
- Wysyłam START transmisji i adres układu z 0 na końcu czyli odczyt (I2C_SendStartAndSelect)
- Odczytuję dane z rejestru I2C_ReceivData_NACK();
ale za każdym razem otrzymuję jako wynik odczytu adres urządzenia czyli w tym przypadku 161 (0xA1)
Co robię źle?
Załączam cały kod (jest tak spory bałagan ze względu na setki testów jakie przeprowadzałem)
Staram się od dobrych 2 dni odczytać dane z układu PCF8583 (RTC).
Napisałem gromadę funkcji do obsługi I2C, większość pochodzi z książki "Język C dla mikrokontrolerów AVR" więc sądzę że nie mają błędów.
Pierwszym problemem jest adres jaki ma układ ma podłączone wejście A0 do zasilania czyli adres powinien wyglądać tak 1010 001 (0/1) czyli 0xA2 lub 0xA3
a okazuje się że układ odpowiada jedynie na adresy 0xA0 i 0xA1. Jest to zastanawiające ale to nie główny problem.
Chciał bym odczytać jakikolwiek rejestr z pamięci PCF.
Wykonuję Kolejno czynności:
-Inicjuję I2C (I2C_Init)
- Wysyłam START transmisji i adres układu z 1 na końcu czyli zapis (I2C_SendStartAndSelect)
- Wysyłam adres rejestru do odczytu (I2C_SendByte)
- Wysyłam START transmisji i adres układu z 0 na końcu czyli odczyt (I2C_SendStartAndSelect)
- Odczytuję dane z rejestru I2C_ReceivData_NACK();
ale za każdym razem otrzymuję jako wynik odczytu adres urządzenia czyli w tym przypadku 161 (0xA1)
Co robię źle?
Załączam cały kod (jest tak spory bałagan ze względu na setki testów jakie przeprowadzałem)
Kod: C / C++