This post was originally published on May 21, 2018 at https://sparklechicken.net/channel/jakessbc
Holy cow! It compiles without warnings, the 10 bit reads work, and it is a whole lot cleaner now. The functions are actually returning stuff, so the code to print to the SSD1306 looks like this:
sprintf(x_axis, "%d", JSC_MMA7455_Read_8Bit_X());
ssd1306_WriteString(x_axis,Font_11x18,White);
Now I can start adding other features like changing the raw vectors into angles and using the interrupts for freefall detection. As before, the whole project can be found at GitHub.
MMA7455.h
#include "stm32l4xx_hal.h"
#ifndef MMA7455_H_
#define MMA7455_H_
#define JSC_MMA7455_I2C_ADDRESS ((uint8_t)0x1d<<1)
#define JSC_MMA7455_I2C_PORT hi2c1
#define JSC_MMA7455_10bit_x_reg_low ((uint8_t)0x00)
#define JSC_MMA7455_10bit_x_reg_high ((uint8_t)0x01)
#define JSC_MMA7455_10bit_y_reg_low ((uint8_t)0x02)
#define JSC_MMA7455_10bit_y_reg_high ((uint8_t)0x03)
#define JSC_MMA7455_10bit_z_reg_low ((uint8_t)0x04)
#define JSC_MMA7455_10bit_z_reg_high ((uint8_t)0x05)
#define JSC_MMA7455_8bit_x_reg ((uint8_t)0x06)
#define JSC_MMA7455_8bit_y_reg ((uint8_t)0x07)
#define JSC_MMA7455_8bit_z_reg ((uint8_t)0x08)
#define JSC_MMA7455_init_reg ((uint8_t)0x16)
#define JSC_MMA7455_2g_init_byte ((uint8_t)0x15)
#define JSC_MMA7455_4g_init_byte ((uint8_t)0x19)
#define JSC_MMA7455_8g_init_byte ((uint8_t)0x11)
void JSC_MMA7455_Init_2G();
void JSC_MMA7455_Init_4G();
void JSC_MMA7455_Init_8G();
int8_t JSC_MMA7455_Read_8Bit_X();
int8_t JSC_MMA7455_Read_8Bit_Y();
int8_t JSC_MMA7455_Read_8Bit_Z();
int16_t JSC_MMA7455_Read_10Bit_X();
int16_t JSC_MMA7455_Read_10Bit_Y();
int16_t JSC_MMA7455_Read_10Bit_Z();
extern I2C_HandleTypeDef JSC_MMA7455_I2C_PORT;
#endif /* MMA7455_H_ */
MMA7455.c
#include "stm32l4xx_hal.h"
#include "MMA7455.h"
void JSC_MMA7455_Init_2G()
{
uint8_t init_byte = JSC_MMA7455_2g_init_byte;
HAL_I2C_Mem_Write(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_init_reg, 1, &init_byte, 1, 10000);
}
void JSC_MMA7455_Init_4G()
{
uint8_t init_byte = JSC_MMA7455_4g_init_byte;
HAL_I2C_Mem_Write(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_init_reg, 1, &init_byte, 1, 10000);
}
void JSC_MMA7455_Init_8G()
{
uint8_t init_byte = JSC_MMA7455_8g_init_byte;
HAL_I2C_Mem_Write(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_init_reg, 1, &init_byte, 1, 10000);
}
int8_t JSC_MMA7455_Read_8Bit_X(void)
{
uint8_t JSC_8bit_xval;
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_x_reg, 1, &JSC_8bit_xval, 1, 10000);
int8_t JSC_signed_xval = JSC_8bit_xval;
return JSC_signed_xval;
}
int8_t JSC_MMA7455_Read_8Bit_Y(void)
{
uint8_t JSC_8bit_yval;
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_y_reg, 1, &JSC_8bit_yval, 1, 10000);
int8_t JSC_signed_yval = JSC_8bit_yval;
return JSC_signed_yval;
}
int8_t JSC_MMA7455_Read_8Bit_Z(void)
{
uint8_t JSC_8bit_zval;
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_z_reg, 1, &JSC_8bit_zval, 1, 10000);
int8_t JSC_signed_zval = JSC_8bit_zval;
return JSC_signed_zval;
}
int16_t JSC_MMA7455_Read_10Bit_X(void)
{
uint8_t JSC_10bit_xval_low;
uint8_t JSC_10bit_xval_high;
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_x_reg_low, 1, &JSC_10bit_xval_low, 1, 10000);
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_x_reg_low, 1, &JSC_10bit_xval_high, 1, 10000);
int16_t JSC_10bit_xval = ((int16_t)JSC_10bit_xval_high << 8) | JSC_10bit_xval_low;
return JSC_10bit_xval;
}
int16_t JSC_MMA7455_Read_10Bit_Y(void)
{
uint8_t JSC_10bit_yval_low;
uint8_t JSC_10bit_yval_high;
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_y_reg_low, 1, &JSC_10bit_yval_low, 1, 10000);
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_y_reg_low, 1, &JSC_10bit_yval_high, 1, 10000);
int16_t JSC_10bit_yval = ((int16_t)JSC_10bit_yval_high << 8) | JSC_10bit_yval_low;
return JSC_10bit_yval;
}
int16_t JSC_MMA7455_Read_10Bit_Z(void)
{
uint8_t JSC_10bit_zval_low;
uint8_t JSC_10bit_zval_high;
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_z_reg_low, 1, &JSC_10bit_zval_low, 1, 10000);
HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_z_reg_low, 1, &JSC_10bit_zval_high, 1, 10000);
int16_t JSC_10bit_zval = ((int16_t)JSC_10bit_zval_high << 8) | JSC_10bit_zval_low;
return JSC_10bit_zval;
}