kling Napisano Sierpień 1, 2011 Udostępnij Napisano Sierpień 1, 2011 Witam, od kilku dni męczę się z komunikacją Atmegi32 z czujnikiem temperatury TMP102. Układ TMP 102 jest na płytce ze SPARKFUNU więc eliminuje to złe połączenia. Jako, że Atmegę zasilam 5V (nie mam innej możliwości) użyłem konwertera napięć od Kamami "KaModLVC". Linie SDA i SCL przez ten konwerter połączyłem z uC. Układ zasilam 3.3V - napięcie dochodzi do układu. Przeszukjąc google napisałem program który miał komunikować się z układem. Jednak żadna z bibliotek I2C nie działała tak jak powinna. Nie zrażając się nie powodzeniem zacząłęm testować program krok po kroku przy użyciu UART'A. Wynika z tego, że układ nie odpowiada bitem ACK. Ma ktoś może pomysł co może być nie tak?! Diody sygnalizują że wychodzi z obydwu pętli, ale ACK jest nie prawidłowe. #include <avr/io.h> #include <util/delay.h> #include <util/twi.h> #include "uart.h" //Inicjalizacja magistrali I2C void i2c_init(void) { TWSR = (1<<TWPS0); TWBR = 0xC6; } /*Wysyla sygnal start na magistrale, adresuje urzadzenie oraz okresla kierunek transmisji zwraca 0 jezeli urzadzenie jest dostepne, 1 gdy wystapil blad*/ unsigned char i2c_start(unsigned char address) { char twst; //START TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // czekaj na zakonczenie transmisji while(!(TWCR & (1<<TWINT))); PORTB &= ~(1<<PB0); // Sprawdz rejestr statusu twst = TW_STATUS & 0xF8; //wystapil blad, zwroc 1 if ( (twst != TW_START) && (twst != TW_REP_START)) { UART_PutString("Błąd. Nie wysłano STARTU\n"); //_delay_ms(50); return 1; } // wyslij adres urzadzenia TWDR = address; TWCR = (1<<TWINT) | (1<<TWEN); //czekaj na zakonczenie transmisji i odbierz ACK/NAK while(!(TWCR & (1<<TWINT))); PORTB &= ~(1<<PB1); //sprawdz rejestr statusu twst = TW_STATUS & 0xF8; //wystapil blad, zwroc 1 if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) { UART_PutString("Błąd adresowania. Brak bitu ACK.\n"); _delay_ms(50); return 1; } //w przeciwnym wypadku operacja powiodla sie zwroc 0 UART_PutString("Komunikacja nawiazana"); return 0; } int main (void) { DDRB = 0xff; PORTB = 0xff; UART_Init(19200); UART_PutString("TMP102 test \n"); _delay_ms(1000); i2c_init(); _delay_ms(500); i2c_start(0b10010011); while(1); return(0); } Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!