Gadget

Massive improvements to the MMA7455 library

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;
}