From 392a6860ae69ecad2ddb2c5a988707ab62aa9a08 Mon Sep 17 00:00:00 2001 From: Charlie Birks Date: Mon, 3 Feb 2025 20:28:49 +0000 Subject: [PATCH 1/3] stm32: update MSA301 config to avoid checking device in update --- 32blit-stm32/Src/32blit/i2c.cpp | 21 +++++++-------------- 32blit-stm32/Src/i2c-msa301.c | 7 +++---- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/32blit-stm32/Src/32blit/i2c.cpp b/32blit-stm32/Src/32blit/i2c.cpp index bad611a32..f728c659d 100644 --- a/32blit-stm32/Src/32blit/i2c.cpp +++ b/32blit-stm32/Src/32blit/i2c.cpp @@ -119,24 +119,17 @@ namespace i2c { i2c_state = PROC_ACL; break; case PROC_ACL: - // LIS3DH & MSA301 - 12-bit left-justified + // LIS3DH - 12-bit left-justified + // MSA301 - 14-bit left-justified accel_x.add(((int8_t)i2c_buffer[1] << 6) | (i2c_buffer[0] >> 2)); accel_y.add(((int8_t)i2c_buffer[3] << 6) | (i2c_buffer[2] >> 2)); accel_z.add(((int8_t)i2c_buffer[5] << 6) | (i2c_buffer[4] >> 2)); - if(is_beta_unit){ - blit::tilt = Vec3( - accel_x.average(), - accel_y.average(), - -accel_z.average() - ); - } else { - blit::tilt = Vec3( - -accel_x.average(), - -accel_y.average(), - -accel_z.average() - ); - } + blit::tilt = Vec3( + -accel_x.average(), + -accel_y.average(), + -accel_z.average() + ); blit::tilt.normalize(); diff --git a/32blit-stm32/Src/i2c-msa301.c b/32blit-stm32/Src/i2c-msa301.c index b0b7627c0..2e8bbad18 100644 --- a/32blit-stm32/Src/i2c-msa301.c +++ b/32blit-stm32/Src/i2c-msa301.c @@ -4,11 +4,11 @@ static void _i2c_send_8(I2C_HandleTypeDef *i2c_port, uint16_t address, uint8_t reg, uint8_t data); -//functions +//functions void msa301_init(I2C_HandleTypeDef *i2c_port, uint8_t power_mode, uint8_t low_power_bandwidth, uint8_t update_rate){ _i2c_send_8(i2c_port, MSA301_DEVICE_ADDRESS, MSA301_CONTROL1_REGISTER, update_rate); _i2c_send_8(i2c_port, MSA301_DEVICE_ADDRESS, MSA301_CONTROL2_REGISTER, (power_mode | low_power_bandwidth)); - _i2c_send_8(i2c_port, MSA301_DEVICE_ADDRESS, MSA301_SWAP_REGISTER, 0b00001111); // Reverse X, Y and Z axis polarity (and X/Y swap also??) + _i2c_send_8(i2c_port, MSA301_DEVICE_ADDRESS, MSA301_SWAP_REGISTER, 0b00000011); // Reverse Z axis polarity and X/Y swap } static void _i2c_send_8(I2C_HandleTypeDef *i2c_port, uint16_t address, uint8_t reg, uint8_t data){ @@ -17,6 +17,5 @@ static void _i2c_send_8(I2C_HandleTypeDef *i2c_port, uint16_t address, uint8_t r data_buffer[1] = data; HAL_I2C_Master_Transmit(i2c_port, address, &data_buffer[0] , 2 ,HAL_TIMEOUT); } - + /*****************************END OF FILE****/ - \ No newline at end of file From 6d5bae0149cf57a38bbca960ac08c4cddb8236b1 Mon Sep 17 00:00:00 2001 From: Charlie Birks Date: Mon, 3 Feb 2025 20:41:10 +0000 Subject: [PATCH 2/3] stm32: use int16_t for accel averages If we don't shift the raw value down, the worst that happens is that the MSA301 loses 1 bit. --- 32blit-stm32/Src/32blit/i2c.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/32blit-stm32/Src/32blit/i2c.cpp b/32blit-stm32/Src/32blit/i2c.cpp index f728c659d..37df21c6d 100644 --- a/32blit-stm32/Src/32blit/i2c.cpp +++ b/32blit-stm32/Src/32blit/i2c.cpp @@ -46,9 +46,9 @@ static uint16_t accel_address = LIS3DH_DEVICE_ADDRESS; // // Local variables for this file // -static RunningAverage accel_x(8); -static RunningAverage accel_y(8); -static RunningAverage accel_z(8); +static RunningAverage accel_x(8); +static RunningAverage accel_y(8); +static RunningAverage accel_z(8); static I2CState i2c_state = SEND_ACL; static uint8_t i2c_buffer[6] = {0}; @@ -121,14 +121,15 @@ namespace i2c { case PROC_ACL: // LIS3DH - 12-bit left-justified // MSA301 - 14-bit left-justified - accel_x.add(((int8_t)i2c_buffer[1] << 6) | (i2c_buffer[0] >> 2)); - accel_y.add(((int8_t)i2c_buffer[3] << 6) | (i2c_buffer[2] >> 2)); - accel_z.add(((int8_t)i2c_buffer[5] << 6) | (i2c_buffer[4] >> 2)); + // shift it down later so the average drops less bits + accel_x.add(((int8_t)i2c_buffer[1] << 8) | (i2c_buffer[0])); + accel_y.add(((int8_t)i2c_buffer[3] << 8) | (i2c_buffer[2])); + accel_z.add(((int8_t)i2c_buffer[5] << 8) | (i2c_buffer[4])); blit::tilt = Vec3( - -accel_x.average(), - -accel_y.average(), - -accel_z.average() + -accel_x.average() >> 2, + -accel_y.average() >> 2, + -accel_z.average() >> 2 ); blit::tilt.normalize(); From 90399110fb9ca2c58cc50a5884137a02beed5b8b Mon Sep 17 00:00:00 2001 From: Charlie Birks Date: Mon, 3 Feb 2025 20:48:04 +0000 Subject: [PATCH 3/3] reserve data in RunningAverage Avoid over-allocation surprises --- 32blit/engine/running_average.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/32blit/engine/running_average.hpp b/32blit/engine/running_average.hpp index 88d5b031c..e95a1b2db 100644 --- a/32blit/engine/running_average.hpp +++ b/32blit/engine/running_average.hpp @@ -9,7 +9,9 @@ class RunningAverage { public: using Data = std::vector; - RunningAverage(std::size_t uSize) : m_uSize(uSize), m_uIndex(0), m_average(0), m_bFull(false) {}; + RunningAverage(std::size_t uSize) : m_uSize(uSize), m_uIndex(0), m_average(0), m_bFull(false) { + m_data.reserve(uSize); + }; const T &operator[] (std::size_t i) const { @@ -91,7 +93,7 @@ class RunningAverage private: Data m_data; - std::size_t m_uSize; + const std::size_t m_uSize; std::size_t m_uIndex; T m_average; bool m_bFull;