Skocz do zawartości

Problem z komunikacją TMP102 <-> I2C


Pomocna odpowiedź

Napisano

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);
}

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...