comparison Small_CPU/Src/compass.c @ 358:c6a084d1433f

Add Support for new end-2019 hardware: support LSM303AGR compass (Now working) Make a build file for testing
author heinrichsweikamp
date Sun, 24 Nov 2019 16:08:29 +0100
parents c3d511365552
children f9458e979154
comparison
equal deleted inserted replaced
357:c3d511365552 358:c6a084d1433f
37 #include "spi.h" 37 #include "spi.h"
38 #include "RTE_FlashAccess.h" // to store compass_calib_data 38 #include "RTE_FlashAccess.h" // to store compass_calib_data
39 39
40 #include "stm32f4xx_hal.h" 40 #include "stm32f4xx_hal.h"
41 41
42 #define TEST_IF_HMC5883L
43 //#define COMPASS_DEACTIVATE
44
45 /// split byte to bits 42 /// split byte to bits
46 typedef struct{ 43 typedef struct{
47 uint8_t bit0:1; ///< split byte to bits 44 uint8_t bit0:1; ///< split byte to bits
48 uint8_t bit1:1; ///< split byte to bits 45 uint8_t bit1:1; ///< split byte to bits
49 uint8_t bit2:1; ///< split byte to bits 46 uint8_t bit2:1; ///< split byte to bits
231 /// On first call it figures out which hardware is integrated 228 /// On first call it figures out which hardware is integrated
232 /// 229 ///
233 /// @param gain: 7 is max gain, compass_calib() might reduce it 230 /// @param gain: 7 is max gain, compass_calib() might reduce it
234 // =============================================================================== 231 // ===============================================================================
235 232
236 uint8_t testCompassTypeDebug = 0xFF;
237
238 void compass_init(uint8_t fast, uint8_t gain) 233 void compass_init(uint8_t fast, uint8_t gain)
239 { 234 {
240 // quick off
241 #ifdef COMPASS_DEACTIVATE
242 hardwareCompass = COMPASS_NOT_RECOGNIZED;
243 #endif
244 235
245 // don't call again with fast, gain in calib mode etc. 236 // don't call again with fast, gain in calib mode etc.
246 // if unknown 237 // if unknown
247 if(hardwareCompass == COMPASS_NOT_RECOGNIZED) 238 if(hardwareCompass == COMPASS_NOT_RECOGNIZED)
248 { 239 {
255 uint8_t data = WHO_AM_I; 246 uint8_t data = WHO_AM_I;
256 I2C_Master_Transmit( DEVICE_COMPASS_303D, &data, 1); 247 I2C_Master_Transmit( DEVICE_COMPASS_303D, &data, 1);
257 I2C_Master_Receive( DEVICE_COMPASS_303D, &data, 1); 248 I2C_Master_Receive( DEVICE_COMPASS_303D, &data, 1);
258 if(data == WHOIAM_VALUE_LSM303D) 249 if(data == WHOIAM_VALUE_LSM303D)
259 hardwareCompass = compass_generation2; //LSM303D; 250 hardwareCompass = compass_generation2; //LSM303D;
260 else 251 data = WHO_AM_I;
261 hardwareCompass = compass_generation1; //HMC5883L 252 I2C_Master_Transmit( DEVICE_ACCELARATOR_303AGR, &data, 1);
253 I2C_Master_Receive( DEVICE_ACCELARATOR_303AGR, &data, 1);
262 if(data == WHOIAM_VALUE_LSM303AGR) 254 if(data == WHOIAM_VALUE_LSM303AGR)
263 hardwareCompass = compass_generation3; //LSM303AGR; 255 hardwareCompass = compass_generation3; //LSM303AGR;
264 } 256 }
265 257
266 /* No compass identified => Retry */ 258 /* No compass identified => Retry */
269 uint8_t data = WHO_AM_I; 261 uint8_t data = WHO_AM_I;
270 I2C_Master_Transmit( DEVICE_COMPASS_303D, &data, 1); 262 I2C_Master_Transmit( DEVICE_COMPASS_303D, &data, 1);
271 I2C_Master_Receive( DEVICE_COMPASS_303D, &data, 1); 263 I2C_Master_Receive( DEVICE_COMPASS_303D, &data, 1);
272 if(data == WHOIAM_VALUE_LSM303D) 264 if(data == WHOIAM_VALUE_LSM303D)
273 hardwareCompass = compass_generation2; //LSM303D; 265 hardwareCompass = compass_generation2; //LSM303D;
274 else 266 data = WHO_AM_I;
275 hardwareCompass = compass_generation1; //HMC5883L; 267 I2C_Master_Transmit( DEVICE_ACCELARATOR_303AGR, &data, 1);
268 I2C_Master_Receive( DEVICE_ACCELARATOR_303AGR, &data, 1);
276 if(data == WHOIAM_VALUE_LSM303AGR) 269 if(data == WHOIAM_VALUE_LSM303AGR)
277 hardwareCompass = compass_generation3; //LSM303AGR; 270 hardwareCompass = compass_generation3; //LSM303AGR;
278 } 271 }
279 272
280 /* Assume that a HMC5883L is equipped by default if detection still failed */ 273 /* Assume that a HMC5883L is equipped by default if detection still failed */
281 if(hardwareCompass == 0) 274 if(hardwareCompass == 0)
282 hardwareCompass = compass_generation1; //HMC5883L; 275 hardwareCompass = compass_generation1; //HMC5883L;
283 276
284 #ifdef TEST_IF_HMC5883L
285 HAL_StatusTypeDef resultOfOperationHMC_MMA = HAL_TIMEOUT; 277 HAL_StatusTypeDef resultOfOperationHMC_MMA = HAL_TIMEOUT;
286 278
279 // test if both chips of the two-chip solution (gen 1) are present
287 if(hardwareCompass == compass_generation1) // HMC5883L) 280 if(hardwareCompass == compass_generation1) // HMC5883L)
288 { 281 {
282 HAL_Delay(10);
283 MX_I2C1_Init();
289 uint8_t data = 0x2A; // CTRL_REG1 of DEVICE_ACCELARATOR_MMA8452Q 284 uint8_t data = 0x2A; // CTRL_REG1 of DEVICE_ACCELARATOR_MMA8452Q
290 resultOfOperationHMC_MMA = I2C_Master_Transmit( DEVICE_ACCELARATOR_MMA8452Q, &data, 1); 285 resultOfOperationHMC_MMA = I2C_Master_Transmit( DEVICE_ACCELARATOR_MMA8452Q, &data, 1);
291 if(resultOfOperationHMC_MMA == HAL_OK) 286 if(resultOfOperationHMC_MMA == HAL_OK)
292 { 287 {
293 hardwareCompass = compass_generation1; //HMC5883L; // all fine, keep it 288 hardwareCompass = compass_generation1; //HMC5883L; // all fine, keep it
294 } 289 }
295 else 290 else
296 { 291 {
297 hardwareCompass = COMPASS_NOT_RECOGNIZED; 292 hardwareCompass = COMPASS_NOT_RECOGNIZED;
298 testCompassTypeDebug = 0xEC;
299 } 293 }
300 } 294 }
301 #endif
302 295
303 if(hardwareCompass == compass_generation2) //LSM303D) 296 if(hardwareCompass == compass_generation2) //LSM303D)
304 compass_init_LSM303D(fast, gain); 297 compass_init_LSM303D(fast, gain);
305 if(hardwareCompass == compass_generation3) //LSM303AGR) 298 if(hardwareCompass == compass_generation3) //LSM303AGR)
306 compass_init_LSM303AGR(fast, gain); 299 compass_init_LSM303AGR(fast, gain);
749 742
750 void compass_init_LSM303AGR(uint8_t fast, uint8_t gain) 743 void compass_init_LSM303AGR(uint8_t fast, uint8_t gain)
751 { 744 {
752 if(fast == 0) 745 if(fast == 0)
753 { 746 {
747 // init compass
754 LSM303AGR_write_checked_reg(0x60, 0x80); // 10Hz 748 LSM303AGR_write_checked_reg(0x60, 0x80); // 10Hz
755 LSM303AGR_write_checked_reg(0x61, 0x03); // CFG_REG_B_M 749 LSM303AGR_write_checked_reg(0x61, 0x03); // CFG_REG_B_M
756 LSM303AGR_write_checked_reg(0x62, 0x10); // CFG_REG_C_M 750 LSM303AGR_write_checked_reg(0x62, 0x10); // CFG_REG_C_M
751 LSM303AGR_write_checked_reg(0x63, 0x00); // INT_CTRL_REG_M
752
753 // init accel (Same chip, but different address...)
754 LSM303AGR_acc_write_checked_reg(0x1F, 0x00); // TEMP_CFG_REG_A (Temp sensor off)
755 LSM303AGR_acc_write_checked_reg(0x20, 0x4F); // CTRL_REG1_A (50Hz, x,y,z = ON)
756 LSM303AGR_acc_write_checked_reg(0x21, 0x00); // CTRL_REG2_A
757 LSM303AGR_acc_write_checked_reg(0x22, 0x00); // CTRL_REG3_A
758 LSM303AGR_acc_write_checked_reg(0x23, 0x08); // CTRL_REG4_A, High Resolution Mode enabled
757 } 759 }
758 else 760 else
759 { 761 {
760 LSM303AGR_write_checked_reg(0x60, 0x80); // 10Hz 762 // init compass
763 LSM303AGR_write_checked_reg(0x60, 0x84); // 20Hz
761 LSM303AGR_write_checked_reg(0x61, 0x03); // CFG_REG_B_M 764 LSM303AGR_write_checked_reg(0x61, 0x03); // CFG_REG_B_M
762 LSM303AGR_write_checked_reg(0x62, 0x10); // CFG_REG_C_M 765 LSM303AGR_write_checked_reg(0x62, 0x10); // CFG_REG_C_M
763 } 766 LSM303AGR_write_checked_reg(0x63, 0x00); // INT_CTRL_REG_M
764 // init accel (Same chip, but different address...) 767
765 LSM303AGR_acc_write_checked_reg(0x1F, 0x00); // TEMP_CFG_REG_A (Temp sensor off) 768 // init accel (Same chip, but different address...)
766 LSM303AGR_acc_write_checked_reg(0x20, 0x4F); // CTRL_REG1_A (10Hz, x,y,z = ON) 769 LSM303AGR_acc_write_checked_reg(0x1F, 0x00); // TEMP_CFG_REG_A (Temp sensor off)
767 LSM303AGR_acc_write_checked_reg(0x21, 0x00); // CTRL_REG2_A 770 LSM303AGR_acc_write_checked_reg(0x20, 0x4F); // CTRL_REG1_A (50Hz, x,y,z = ON)
768 LSM303AGR_acc_write_checked_reg(0x22, 0x00); // CTRL_REG3_A 771 LSM303AGR_acc_write_checked_reg(0x21, 0x00); // CTRL_REG2_A
769 LSM303AGR_acc_write_checked_reg(0x23, 0x04); // CTRL_REG4_A 772 LSM303AGR_acc_write_checked_reg(0x22, 0x00); // CTRL_REG3_A
773 LSM303AGR_acc_write_checked_reg(0x23, 0x0); // CTRL_REG4_A, High Resolution Mode enabled
774 }
770 775
771 return; 776 return;
772 } 777 }
773 778
774 779
805 accel_DY_f = 0; 810 accel_DY_f = 0;
806 accel_DZ_f = 0; 811 accel_DZ_f = 0;
807 812
808 for(int i=0;i<6;i++) 813 for(int i=0;i<6;i++)
809 { 814 {
810 data = ADDR_OUT_X_L_A + i; // ADDR_OUT_X_L_A is the same as in the LSM303D (luckily) 815 data = 0x28 + i; // OUT_X_L_A
811 I2C_Master_Transmit( DEVICE_ACCELARATOR_303AGR, &data, 1); 816 I2C_Master_Transmit( DEVICE_ACCELARATOR_303AGR, &data, 1);
812 I2C_Master_Receive( DEVICE_ACCELARATOR_303AGR, &accDataBuffer[i], 1); 817 I2C_Master_Receive( DEVICE_ACCELARATOR_303AGR, &accDataBuffer[i], 1);
813 } 818 }
814 819
815 xraw_f = ((float)( (int16_t)((accDataBuffer[1] << 8) | (accDataBuffer[0])))); 820 xraw_f = ((float)( (int16_t)((accDataBuffer[1] << 8) | (accDataBuffer[0]))));
819 rotate_accel_3f(&xraw_f, &yraw_f, &zraw_f); 824 rotate_accel_3f(&xraw_f, &yraw_f, &zraw_f);
820 825
821 // mh 826 // mh
822 accel_report_x = xraw_f; 827 accel_report_x = xraw_f;
823 accel_report_y = yraw_f; 828 accel_report_y = yraw_f;
824 accel_report_z = zraw_f; 829 accel_report_z = -zraw_f; // flip Z in gen 2 hardware
825 830
826 accel_DX_f = ((int16_t)(accel_report_x)); 831 accel_DX_f = ((int16_t)(accel_report_x));
827 accel_DY_f = ((int16_t)(accel_report_y)); 832 accel_DY_f = ((int16_t)(accel_report_y));
828 accel_DZ_f = ((int16_t)(accel_report_z)); 833 accel_DZ_f = ((int16_t)(accel_report_z));
829 } 834 }
855 860
856 // mh 160620 flip x and y if flip display 861 // mh 160620 flip x and y if flip display
857 compass_DX_f = (((int16_t)((magDataBuffer[1] << 8) | (magDataBuffer[0])))); 862 compass_DX_f = (((int16_t)((magDataBuffer[1] << 8) | (magDataBuffer[0]))));
858 compass_DY_f = (((int16_t)((magDataBuffer[3] << 8) | (magDataBuffer[2])))); 863 compass_DY_f = (((int16_t)((magDataBuffer[3] << 8) | (magDataBuffer[2]))));
859 compass_DZ_f = (((int16_t)((magDataBuffer[5] << 8) | (magDataBuffer[4])))); 864 compass_DZ_f = (((int16_t)((magDataBuffer[5] << 8) | (magDataBuffer[4]))));
860 // no rotation 865
866 // align axis in gen 2 hardware
867 compass_DZ_f *= -1;
868
861 return; 869 return;
862 } 870 }
863 871
864 872
865 // -------------------------------------------------------------------------------- 873 // --------------------------------------------------------------------------------