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:
Nie mam więcej pomysłów co jest nie tak.
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ć.