Skocz do zawartości

Problem z komunikacją TMP102 <-> I2C


kling

Pomocna odpowiedź

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);
}
Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.