Skocz do zawartości

MPU9255 na STM32F4 przez komunikację UART


Pomocna odpowiedź

Napisano

Witam serdecznie. Jest mój pierwszy post na tym forum więc proszę o wyrozumiałość. Spróbuję przedstawić swój problem najbardziej szczegółowo jak tylko się da, bez zbędnego tekstu.

Otóż moim celem jest wysłanie surowych danych z czujników akcel, żyro i magnetometru na module 9255 przez UART do PC i tam zaprezentowanie symulacji w Matlabie. Niestety moja wiedza nt. mikrokontrolerów jest dosyć słaba.

Udało mi się podłączyć odpowiednio MPU9255 i konwerter usb-uart do mikrokontrolera tak jak na rysunku w załączniku z STM32CubeMX (zaimplementowałem tam moduły I2C i UART1, nic wiecej)

No i teraz sie pojawily pytania czy prawidłowo połączyłem ze sobą te urządzenia? Od czego zacząć przy pisaniu programu? Czy trzeba podłączyć zasilanie konwertera do stm32? Na razie sprawę z Matlabem pomijam.

Pojawił się dodatkowy problem z bibliotekami HAL, ponieważ producent MPU9255 zamieścił na swojej stronie tylko biblioteki STDPERIPH, a w CubeMX program ma działać na bibliotekach HAL.

Każda uwaga czy pomoc mile widziana. Pozdro

W międzyczasie udało mi się napisać kod, gdzie odczytywane są dane z rejestrów dla każdej osi magnetometru. Program się kompiluje, ale nie mam możliwości sprawdzenia jego poprawności.. w debugerze nic nie potrafię odczytać. Proszę o sprawdzenie i ewentualne uwagi do kodu

#define I2C_SLAVE_ADDRESS     (0x68<<1)     // adres slave: b110 1000 (LSB=0)

#define CONFIG								0x1A
//#define GYRO_CONFIG	  			0x1B
#define ACCEL_CONFIG    			0x1C
#define ACCEL_ENABLE_4G				0xE8			//1110 1000 - uruchomienie Az,Ax,Ay +  sensivity +-4g
#define SELF_TEST_Z_ACCEL			0x0F
#define PWR_MGMT_1			0x6B
#define USER_CTRL				0x6A
#define INT_PIN_CFG     0x37
#define CNTL1						0x0A
  /* USER CODE BEGIN 2 */
HAL_I2C_Init(&hi2c1); 
write_reg(0x6B,0x00); // Power Manager Register -> 0
write_reg(0x6A,0x00); // Disable Master I2C for enabling ByPass-Mode
write_reg(0x37,0x02); // Enable ByPass-Mode
write_reg_magn(0x0A, 0x06); // Continuous Measurement Mode 2

 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
			int xh_magn = read_reg_magn(0x04); // read x axis, high byte
			int xl_magn = read_reg_magn(0x03); // read x axis, lowbyte
			int yh_magn = read_reg_magn(0x06);// read y axis, high byte
			int yl_magn = read_reg_magn(0x05);// read y axis, lowbyte
			int zh_magn = read_reg_magn(0x08);// read z axis, high byte
			int zl_magn = read_reg_magn(0x07);// read z axis, lowbyte

	read_reg_magn(0x09); // "Take another measurement from magnetometer"

	    uint8_t x_magn = (xh_magn << 8) | (xl_magn & 0xff);
	HAL_UART_Transmit_DMA(&huart1,&x_magn,1);

			uint8_t y_magn = (yh_magn << 8) | (yl_magn & 0xff);
	HAL_UART_Transmit(&huart1,&y_magn,1,100);

			uint8_t z_magn = (zh_magn << 8) | (zl_magn & 0xff);
	HAL_UART_Transmit(&huart1,&z_magn,1,100);
}

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...