Skocz do zawartości

LSM330DL Problem z komunikacją


Mateusz

Pomocna odpowiedź

Witam.

Zamontowałem w swoim układzie czujnik LSM330DL i w żaden sposób nie mogę się z nim skomunikować.

I nie wiem czy słusznie podłączyłem CS do 3V3. W datasheet jest apisane tak:

Gyroscope:

SPI enable I2C/SPI mode selection (1: SPI idle mode / I2C communicationenabled; 0: SPI communication mode / I2C disabled)

A potem jest opis:

CS is the serial port enable and it is controlled by the SPI master. It goes low at the start of

the transmission and goes back high at the end.

Ale na schematach protokołu CS jest ściągane na 0 przed rozpoczęciem nadawania:

Proszę o jakąś pomoc. Adresy jaie sprawdzałem to: 0x30 i 0xD0. I otrzymałem błąd.

Komunikacja raczej działa bo z innym układem komunikuje się bez przeszkód.

Edit:

Wydaje mi się, że jednak CS powinien być ściągany do masy. No i teraz rodzi się pytanie, czy może być po prostu cały czas podłączony do masy czy muszę podłączyć CS do UC i podawać 0 przed transmisją?

Link do komentarza
Share on other sites

Jeśli chcesz komunikować się przez I2C to piny CS muszą mieć stan wysoki, czyli zgodnie ze schematem. Problemem może być brak konwertera poziomów napięć - nie możesz tak po prostu sobie spiąć linii SDA i SCL urządzeń które pracują na różnych napięciach zasilania.

Poza tym nie doczytałeś noty katalogowej - wszystkie piny RES powinny być podłączone do masy, a kondensator oznaczony u Ciebie jako C8 powinien mieć 10nF a nie 10uF.

To tak na pierwszy rzut oka 🙂

Link do komentarza
Share on other sites

Udało mi się odczytać dane z akcelerometru bez żadnego problemu. Jednak w żaden sposób nie mogę odczytać danych z żyroskopu. Odczytując wartości otrzymuje zawszę tę samą wartość, tak jakby rejestr się nie odświeżał.

Po zresetowaniu procesora wartość jest dalej ta sama. Jednak po odłączeniu układu od zasilania i podłączenia na nowo wartość ta się zmienia, ale wysyłana jest cały czas ta sama.

Funkcja inicjująca żyroskop:

int LSM330DL_gyro_init(void)
{
char err;
err=i2c();

err+=i2c();

err+=i2c();

return (int)err;
}

Nie zwraca żadnych błędów w komunikacji.

Następna wywoływana funkcja odczytuje dane z rejestrów i wysyła po UART:

void LSM330DL_read_gyro_registers(void)
{
char buf[20];

i2c();
i2c_rep();
sprintf(buf,"20: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"21: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"22: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"23: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"24: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"25: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"26: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"27: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"2E: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"2F: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"30: %i\n", raw);
USART_send_string(buf);

//88888888888888888888888888888888888888

i2c();
i2c_rep();
sprintf(buf,"31: %i\n", raw);
USART_send_string(buf);

}

Następnie w pętli głównej odczytuje wartości z jednej osi żyroskopu:

int LSM330DL_GYR_read_z(void)
{
i2c();

i2c_rep();	

int16_t raw_z = raw_zl|(raw_zh<<8);

return (int)raw_z;
}

Adres rejestru jest A8 zamiast 28 ponieważ aby odczytywać kilka rejestrów jeden po drugim należy dać 1 n MSB adresu.

I w pętli głównej w skrócie:

gyro_z = LSM330DL_GYR_read_z();

	time++;
	if(time==3)
	{
		int ready = LSM330DL_GYR_ready();
		sprintf(buf,"%i;%i;%i;%i\n", acc_x, acc_y, gyro_z, ready);
		//sprintf(buf,"%i\n", gyro_z);
		USART_send_string(buf);
		time=0;
	}

Funkcja sprawdzająca rejestr w którym podawane są flagi sygnalizujące odświeżenie danych:

int LSM330DL_GYR_ready(void)
{
i2c();

i2c_rep();	

return (int)raw_zh;
}

No i oczywiście dane otrzymywane po uart:

Kompas: OK

Akcelerometr: OK

Zyrokop: OK

20: 15

21: 0

22: 0

23: 1

24: 0

25: 0

26: 249

27: 230

2E: 0

2F: 32

30: 0

31: 0

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;3;137;15

0;10;137;15

1;15;137;15

4;5;137;15

5;3;137;15

1;7;137;15

-4;11;137;15

-5;5;137;15

-2;-1;137;15

0;-3;137;15

0;-1;137;15

2;-6;137;15

-1;-6;137;15

2;-3;137;15

5;0;137;15

4;1;137;15

2;-2;137;15

0;0;137;15

0;5;137;15

0;5;137;15

1;3;137;15

5;-3;137;15

9;-5;137;15

15;-11;137;15

18;-18;137;15

24;-23;137;15

34;-16;137;15

39;-13;137;15

40;-7;137;15

39;7;137;15

39;16;137;15

38;24;137;15

33;32;137;15

28;38;137;15

27;39;137;15

31;32;137;15

30;27;137;15

30;16;137;15

33;5;137;15

37;-6;137;15

41;-15;137;15

41;-26;137;15

44;-38;137;15

44;-43;137;15

38;-47;137;15

34;-45;137;15

31;-35;137;15

31;-30;137;15

29;-23;137;15

29;-15;137;15

29;-9;137;15

31;-6;137;15

34;-8;137;15

39;-13;137;15

40;-15;137;15

46;-19;137;15

48;-17;137;15

46;-13;137;15

43;-5;137;15

39;3;137;15

34;8;137;15

32;12;137;15

31;12;137;15

28;11;137;15

25;9;137;15

23;7;137;15

23;4;137;15

21;1;137;15

17;0;137;15

18;-4;137;15

19;-11;137;15

19;-16;137;15

21;-22;137;15

23;-28;137;15

21;-29;137;15

20;-32;137;15

19;-32;137;15

20;-29;137;15

21;-28;137;15

27;-26;137;15

30;-24;137;15

30;-22;137;15

28;-19;137;15

24;-16;137;15

21;-14;137;15

16;-8;137;15

7;-8;137;15

9;-1;137;15

8;1;137;15

5;1;137;15

3;1;137;15

2;1;137;15

1;1;137;15

0;1;137;15

0;1;137;15

0;1;137;15

0;1;137;15

0;1;137;15

0;1;137;15

Nie mam więcej pomysłów co jest nie tak.

Jeśli chcesz komunikować się przez I2C to piny CS muszą mieć stan wysoki, czyli zgodnie ze schematem. Problemem może być brak konwertera poziomów napięć - nie możesz tak po prostu sobie spiąć linii SDA i SCL urządzeń które pracują na różnych napięciach zasilania.

Poza tym nie doczytałeś noty katalogowej - wszystkie piny RES powinny być podłączone do masy, a kondensator oznaczony u Ciebie jako C8 powinien mieć 10nF a nie 10uF.

To tak na pierwszy rzut oka

Wymieniłem kondensator, Cs jest podłączone do 1. Niestety konwertera napięć nie dam rady już domontować 🙂. Ale udaje mi się komunikować z 2 urządzeniami bez problemów tak więc żyro też powinno być ok. Tym bardziej, że odczytuje poprawnie dane zapisane w rejestrach. No i piny RES też już nie dam rady podłączyć.

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.