Mateusz Napisano Styczeń 22, 2013 Udostępnij Napisano Styczeń 22, 2013 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ą?
grabo Styczeń 22, 2013 Udostępnij Styczeń 22, 2013 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
Mateusz Styczeń 27, 2013 Autor tematu Udostępnij Styczeń 27, 2013 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: OKAkcelerometr: 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ć.
Pomocna odpowiedź
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ę »