Gadget

My first, terrible library for STM32

This post was originally published on May 20, 2018 at https://sparklechicken.net/channel/jakessbc

 

I have officially written my first library/sensor driver!  It’s for the MMA7455 3-Axis Accelerometer, and it is more than a wee bit ugly.  It only provides for 8-bit functionality in its current incarnation, and only in monitor mode.  The 10-bit read only reads the X axis no matter what register I poll for some reason.  I also haven’t implemented the interrupt mode yet.  I’m also pretty sure that there are many improvements that can be made to the code as it currently exists, but it works!  I’ve currently got it plugged up with an Adafruit Feather OLED (SSD1306) to display stuff instead of having to check registers in the debugger.  The SSD1306 driver by 4ilo works wonderfully!  The whole thing is based on the STM32 HAL, with chip init code provided by STM32CubeMX.

Anyway, the whole project can be found at my GitHub page, but the library is below.  If you see any glaring errors or ways to clean it up, let me know!

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)

extern char JSC_xchar[12];
extern char JSC_ychar[12];
extern char JSC_zchar[12];

void JSC_MMA7455_Init();
void JSC_MMA7455_Read_8Bit_X();
void JSC_MMA7455_Read_8Bit_Y();
void JSC_MMA7455_Read_8Bit_Z();
void JSC_MMA7455_Read_8Bit_All();
void JSC_MMA7455_Read_10Bit_X();
void JSC_MMA7455_Read_10Bit_Y();
void JSC_MMA7455_Read_10Bit_Z();
void JSC_MMA7455_Read_10Bit_All();

extern I2C_HandleTypeDef JSC_MMA7455_I2C_PORT;

#endif /* MMA7455_H_ */

MMA7455.c

/*
 * MMA7455.c
 *
 *  Created on: May 19, 2018
 *      Author: Jake Moomaw
 */

#include "stm32l4xx_hal.h"
#include "MMA7455.h"

uint8_t init_byte = JSC_MMA7455_2g_init_byte;
uint8_t *pJSC_MMA7455_init = &init_byte;
int8_t JSC_8bit_xval = 0;
uint8_t *pJSC_8bit_xval = &JSC_8bit_xval;
int8_t JSC_8bit_yval = 0;
uint8_t *pJSC_8bit_yval = &JSC_8bit_yval;
int8_t JSC_8bit_zval = 0;
uint8_t *pJSC_8bit_zval = &JSC_8bit_zval;
int16_t JSC_10bit_xval = 0;
uint16_t *pJSC_10bit_xval = &JSC_10bit_xval;
int16_t JSC_10bit_yval = 0;
uint16_t *pJSC_10bit_yval = &JSC_10bit_yval;
int16_t JSC_10bit_zval = 0;
uint16_t *pJSC_10bit_zval = &JSC_10bit_zval;
char JSC_xchar[12];
char JSC_ychar[12];
char JSC_zchar[12];

void JSC_MMA7455_Init()
{
    HAL_I2C_Mem_Write(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_init_reg, 1, pJSC_MMA7455_init, 1, 10000);
}
void JSC_MMA7455_Read_8Bit_X()
{
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_x_reg, 1, pJSC_8bit_xval, 1, 10000);
    sprintf(JSC_xchar, "%d", JSC_8bit_xval);
}
void JSC_MMA7455_Read_8Bit_Y()
{
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_y_reg, 1, pJSC_8bit_yval, 1, 10000);
    sprintf(JSC_xchar, "%d", JSC_8bit_yval);
}
void JSC_MMA7455_Read_8Bit_Z()
{
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_z_reg, 1, pJSC_8bit_zval, 1, 10000);
    sprintf(JSC_xchar, "%d", JSC_8bit_zval);
}
void JSC_MMA7455_Read_8Bit_All()
{
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_x_reg, 1, pJSC_8bit_xval, 1, 10000);
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_y_reg, 1, pJSC_8bit_yval, 1, 10000);
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_8bit_z_reg, 1, pJSC_8bit_zval, 1, 10000);
    sprintf(JSC_xchar, "%d", JSC_8bit_xval);
    sprintf(JSC_ychar, "%d", JSC_8bit_yval);
    sprintf(JSC_zchar, "%d", JSC_8bit_zval);
}
void JSC_MMA7455_Read_10Bit_X()
{
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_x_reg_low, 2, pJSC_10bit_xval, 2, 10000);
    sprintf(JSC_xchar, "%d", JSC_10bit_xval);
}
void JSC_MMA7455_Read_10Bit_Y()
{
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_y_reg_low, 2, pJSC_10bit_yval, 2, 10000);
    sprintf(JSC_ychar, "%d", JSC_10bit_yval);
}
void JSC_MMA7455_Read_10Bit_Z()
{
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_z_reg_low, 2, pJSC_10bit_zval, 2, 10000);
    sprintf(JSC_zchar, "%d", JSC_10bit_zval);
}

void JSC_MMA7455_Read_10Bit_All()
{
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_x_reg_low, 2, pJSC_10bit_xval, 2, 10000);
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_y_reg_low, 2, pJSC_10bit_yval, 2, 10000);
    HAL_I2C_Mem_Read(&hi2c1, JSC_MMA7455_I2C_ADDRESS, JSC_MMA7455_10bit_z_reg_low, 2, pJSC_10bit_zval, 2, 10000);
    sprintf(JSC_xchar, "%d", JSC_10bit_xval);
    sprintf(JSC_ychar, "%d", JSC_10bit_yval);
    sprintf(JSC_zchar, "%d", JSC_10bit_zval);

}