MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据

MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据

1、msa311简介

使用i2c总线
可以读取xyz轴的加速度
可以监测单击双击事件
可以监测运动与静止状态
可以监测自由落体事件,可用来监测摔倒或跌落。
可以监测旋转事件,类似手机旋转屏幕。
这一节只获取xyz轴加速度,中断以及其他事件先不设置。
msa311的初始化流程如下:
设置工作模式
使能Axis
设置dataRate
设置BandWidth
设置Range
对应代码:

void Msa311_Init(void)
{
	uint8_t partID = 0;
	msa311_powermode_t powerMode;
	msa311_axes_state_t state;
	msa311_dataRate_t dataRate;
	msa301_bandwidth_t bandWidth;
	msa311_range_t range;

    Msa311_GetPardId(&partID);

    if (partID == 0x13)
    {
        printf("Find Msa311 Device\r\n");
        printf("Now to Init Msa311\r\n");

        Msa311_SetPowerMode(MSA311_NORMALMODE);     // Power Mode == Normal Mode
        Msa311_GetPowerMode(&powerMode);
        printf("Msa311 Power Mode = 0x%02x\r\n",powerMode);

        Msa311_Set_Axes_Enable(AXES_ENABLE);        // 使能xyz轴
        Msa311_Get_Axes_Enable(&state); 
        printf("Msa311 Axes have %s\r\n",state == AXES_ENABLE ? "enable" : " disable ");

        Msa311_SetDataRate(MSA311_DATARATE_1000_HZ);
        Msa311_GetDataRate(&dataRate);
        printf("Msa311_GetDataRate == 0x%02x\r\n",dataRate);

        Msa311_SetBandWidth(MSA301_BANDWIDTH_500_HZ);
        Msa311_GetBandWidth(&bandWidth);
        printf("Msa311_GetBandWidth == 0x%02x\r\n",bandWidth);

        Msa311_SetRange(MSA311_RANGE_2_G);
        Msa311_GetRange(&range);
        printf("Msa311_GetRange == 0x%02x\r\n",range);

        printf("Msa311 Init Success!\r\n");

    }
    else
    {
        printf("ERROR: not Find Msa311 \r\n");
    }


    while (1)
    {
        Msa311_GetXYZData();
        BOARD_Delay1Ms(500);
    }  
}

2、接线

scl ---------pc6
sda ---------pc7

代码中既可以用硬件i2c,也可以用软件模拟i2c,都是配置的pc6,pc7 这两个管脚。
通过这个下面这个切换软硬件i2c的使用

#define I2C_MODE        USER_SW_I2C

3、封装msa i2c读写函数

static bool Msa311_WirteReg(uint8_t reg,uint8_t value)
{
#if I2C_MODE == USER_SW_I2C

    return SwI2c_Device_Write_Data(MSA311_I2CADDR_DEFAULT_8,®,1,&value,1);
#elif I2C_MODE == USE_HARD_I2C
    uint8_t tmp[2] = {0};
    tmp[0] = reg;
    tmp[1] = value;
    return BOARD_I2c1_Write(sizeof(tmp),tmp);
#endif

}

static bool Msa311_ReadReg(uint8_t reg,uint8_t *value)
{
#if I2C_MODE == USER_SW_I2C
    return SwI2c_Device_Read_Data(MSA311_I2CADDR_DEFAULT_8,®,1,value,1);
#elif I2C_MODE == USE_HARD_I2C
    bool bRet;
    bRet = BOARD_I2c1_Write(1,®);
    bRet |= BOARD_I2c1_Read(1,value);
    return bRet;
#endif
}

static bool Msa311_ReadRegs(uint8_t reg,uint8_t *value,uint16_t len)
{
#if I2C_MODE == USER_SW_I2C
    return SwI2c_Device_Read_Data(MSA311_I2CADDR_DEFAULT_8,®,1,value,len);
#elif I2C_MODE == USE_HARD_I2C
    bool bRet;
    bRet = BOARD_I2c1_Write(1,®);
    bRet |= BOARD_I2c1_Read(len,value);
    return bRet;
#endif
}

4、对应寄存器设置

MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据_第1张图片
MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据_第2张图片
MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据_第3张图片

xyz轴数据读取寄存器
MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据_第4张图片

对应设置寄存器代码如下:函数名与寄存器功能一一对应,方便理解。

static bool Msa311_Set_Axes_Enable(msa311_axes_state_t state)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_ODR,&r_data);
	if (bRet == false)
	{
		perror("Msa311_Set_Axes_Enable read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_AXES_ENABLE_MSAK) | state);
	bRet = Msa311_WirteReg(MSA311_REG_ODR,w_data);
	if (bRet == false)
	{
		perror("Msa311_Set_Axes_Enable write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_Get_Axes_Enable(msa311_axes_state_t *state)
{
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_ODR,&r_data);
	if (bRet == false)
	{
		perror("Msa311_Set_Axes_Enable read error\n");
		return false;
	}
    *state = (r_data & ~(MSA311_AXES_ENABLE_MSAK));
    
    return bRet;
}

static bool Msa311_SetPowerMode(msa311_powermode_t powerMode)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_POWERMODE,&r_data);
	if (bRet == false)
	{
		perror("msa311_set_power_mode read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_POWER_MODE_MSAK) | powerMode);
	bRet = Msa311_WirteReg(MSA311_REG_POWERMODE,w_data);
	if (bRet == false)
	{
		perror("msa311_set_power_mode write error\n");
		return false;
	}

    return bRet;
}


static bool Msa311_GetPowerMode(msa311_powermode_t *powerMode)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_POWERMODE,&r_data);
	if (bRet == false)
	{
		perror("msa311_set_power_mode read error\n");
		return false;
	}
    *powerMode = (r_data & ~(MSA311_POWER_MODE_MSAK));
    
    return bRet;
}

static bool Msa311_SetDataRate(msa311_dataRate_t dateRate)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_ODR,&r_data);
	if (bRet == false)
	{
		perror("Msa311_SetDataRate read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_DATA_RATE_MASK) | dateRate);
	bRet = Msa311_WirteReg(MSA311_REG_ODR,w_data);
	if (bRet == false)
	{
		perror("Msa311_SetDataRate write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_GetDataRate(msa311_dataRate_t *dataRate)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_ODR,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetDataRate read error\n");
		return false;
	}
    *dataRate = (r_data & ~(MSA311_DATA_RATE_MASK));
    
    return bRet;
}

static bool Msa311_SetBandWidth(msa301_bandwidth_t bandWidth)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_POWERMODE,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetBandWidth read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_BAND_WIDTH_MASK) | bandWidth);
	bRet = Msa311_WirteReg(MSA311_REG_POWERMODE,w_data);
	if (bRet == false)
	{
		perror("Msa311_GetBandWidth write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_GetBandWidth(msa301_bandwidth_t *bandWidth)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_POWERMODE,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetBandWidth read error\n");
		return false;
	}
    *bandWidth = (r_data & ~(MSA311_BAND_WIDTH_MASK));
    
    return bRet;
}

static bool Msa311_SetRange(msa311_range_t range)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_RESRANGE,&r_data);
	if (bRet == false)
	{
		perror("Msa311_SetRange read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_RANG_MASK) | range);
	bRet = Msa311_WirteReg(MSA311_REG_RESRANGE,w_data);
	if (bRet == false)
	{
		perror("Msa311_SetRange write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_GetRange(msa311_range_t *range)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_RESRANGE,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetRange read error\n");
		return false;
	}
    *range = (r_data & ~(MSA311_RANG_MASK));
    
    return bRet;
}

static bool Msa311_GetPardId(uint8_t *id)
{
    return Msa311_ReadReg(MSA311_REG_PARTID,id);
}

5、现象:

main函数调用Msa311_Init(),即可500ms间隔打印xyz轴数据。
MM32F3273G8P火龙果开发板MindSDK开发教程11 -获取msa311加速器的xyz轴数据_第5张图片

6、代码

代码下载

你可能感兴趣的:(火龙果MM32F3273G8P,mm32,mm32F3273G8p,嵌入式硬件)