STM32F407,MAX537加速度计数据SPI读取、多字节读取

MAX537时序

MAX53X 传感器数据通过访问并读取指定寄存器地址实现。同样,对 MAX53X 的控制通过将值写入指定寄存器实现。
MAX53X 通过 4 线 SPI 硬件接口时序实现寄存器访问,写入或读取指定地址的寄存器。 MGZ53X 的 SPI 接口为从机模式采用 Mode 3 时序类型。即 CPOL = 1,CPHA = 1,CS 拉 低前,Clock 的默认电平为高,数据在上升沿读取。

MAX537读写时序

 

 

 

 

MAX537加速度计使能 

MAX53X 系列加速度计上电后默认处于休眠状态。需要通过 SPI 写加速度计的使能控制 寄存器来使加速度计开始工作。 加速度计的使能控制寄存器在寄存器地址 0x2A,上电后需要在寄存器地址 0x2A 写入 0x7F 来使能加速度计。

MAX537数据读取

MAX53X 的输出数据分 5 个寄存器地址保存(2 字节温度数据,3 字节角速度数据)。当 数据更新时,会根据相应的字节顺序更新这 5 个寄存器。在这个过程中,为了保证读取到的寄存器是同一帧新数据,避免读取数据不完整,需要判断数据有效的标志位(STATUS, 0x38 [7]: Data_Rdy)。当寄存器内的数据有效时,该 bit 会置成 1 并保持直到将 0x3A ~ 0x3E 温度 和加速度数据寄存器内的数据全部读走后,该标志位会自动清零。
推 荐 的 读 取 数 据 的 流 程 是 先 判 断 STATUS,0x38[7]:Data_Rdy 的状态。当判定
数据有效后再读取传感器数据 0x3A ~ 0x3E。需要注意的是,读取状态寄存器 STATUS,0x38[7]:Data_Rdy 需要在单独的 SPI 读取过程中完成,不能和数据在一次 SPI 连续读操作中完成。

代码

MAX537.C

#include "MAX537HC.h"
#include "spi.h"
#include "delay.h"
#include <stdbool.h>



u8 buf[5],i;
void MAX537_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
 
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
	  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
	  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化

	GPIO_SetBits(GPIOC,GPIO_Pin_6);
	SPI1_Init();
	MA537X_EN();
}
uint8_t MA537X_RdOneReg(uint8_t RegAddr)
{
    uint8_t Addr = 0,st; 
    Addr = (MAX537_GET_REG_OFFSET(RegAddr) | REG_ADDR_RW_BIT_Msk);  
    CS=0;
	SPI1_ReadWriteByte(Addr);
	st=SPI1_ReadWriteByte(0x00);;
    CS=1;
    return st;
}
void MA537X_WrOneReg(uint8_t RegAddr, uint8_t RegVal)
{
    uint8_t Addr = 0;
    Addr = MAX537_GET_REG_OFFSET(RegAddr) & (~REG_ADDR_RW_BIT_Msk);    /* Clear W/R bit to write */
    CS=0;
    SPI1_ReadWriteByte(Addr);
    SPI1_ReadWriteByte(RegVal);
     CS=1;
}

void MA537X_EN(void)
{
    MA537X_WrOneReg(0x2a,0x7f);
}

void MA537X_RdMultiReg(uint8_t RegStartAddr)
{
    uint8_t Addr = 0;
    Addr = (MAX537_GET_REG_OFFSET(RegStartAddr) | REG_ADDR_RW_BIT_Msk | REG_ADDR_AUTO_INC_BIT_Msk);
    CS=0;
    SPI1_ReadWriteByte(Addr);
	buf[0]=SPI1_ReadWriteByte(0x00);
	buf[1]=SPI1_ReadWriteByte(0x00);
	buf[2]=SPI1_ReadWriteByte(0x00);
	buf[3]=SPI1_ReadWriteByte(0x00);
	buf[4]=SPI1_ReadWriteByte(0x00);
    CS=1;
}

bool MA537X_GetDataRdyStatus(void)
{
    uint8_t RegVal = 0;
    RegVal = MA537X_RdOneReg(0x38);
    return(RegVal & MAX537_STATUS_DATA_RDY_Msk);
}


MAX537.H

#ifndef __MAX537HC_H
#define __MAX537HC_H
#include "sys.h"
#include <stdbool.h>

#define CS PCout(6)	// CS


/* Bit definition for MGZ33X_STATUS */
#define MAX537_STATUS_DATA_RDY_Pos      (7UL)
#define MAX537_STATUS_DATA_RDY_Msk      (0x1UL << MAX537_STATUS_DATA_RDY_Pos)

/* Bit definition for register offset address */
#define REG_ADDR_RW_BIT_Pos             (7UL)   /* Read(1)/Write(0) bit position */
#define REG_ADDR_RW_BIT_Msk             (0x1UL << REG_ADDR_RW_BIT_Pos)
#define REG_ADDR_AUTO_INC_BIT_Pos       (6UL)   /* Register address auto increasement enable bit */
#define REG_ADDR_AUTO_INC_BIT_Msk       (0x1UL << REG_ADDR_AUTO_INC_BIT_Pos)

/* Definition for register address */
#define REG_ADDR_OFFSET_Pos             (0U)
#define REG_ADDR_OFFSET_Msk             (0x3F << REG_ADDR_OFFSET_Pos)   /* Register address offset mask */
#define REG_PAGE_ADDR_Pos               (6U)
#define REG_PAGE_ADDR_Msk               (0x3F << REG_PAGE_ADDR_Pos)

/* Register page and offset macro */
#define MAX537_GET_REG_PAGE(RegAddr)    (((RegAddr) & REG_PAGE_ADDR_Msk) >> REG_PAGE_ADDR_Pos)
#define MAX537_GET_REG_OFFSET(RegAddr)  (((RegAddr) & REG_ADDR_OFFSET_Msk) >> REG_ADDR_OFFSET_Pos)


/* Definition of temperature conversion macro */
#define GET_TEMP_CELSIUS_VAL(Dec)       (((float)Dec+8000)/320+22)


void MAX537_Init(void);
uint8_t MA537X_RdOneReg(uint8_t RegAddr);
void MA537X_WrOneReg(uint8_t RegAddr, uint8_t RegVal);
void MA537X_EN(void);
void MA537X_RdMultiReg(uint8_t RegStartAddr);
bool MA537X_GetDataRdyStatus(void);


#endif

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "spi.h"
#include "key.h"  
#include "MAX537HC.h"



extern u8 buf[5];
	
int main(void)
{ 
	u8 key;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);     //初始化延时函数
	uart_init(115200);	//初始化串口波特率为115200
    MAX537_Init();
	while(1)
	{
            if(MA537X_GetDataRdyStatus())
            {
				int16_t temp;
                float TempVal = 0;
                int32_t  RateVal = 0;
				MA537X_RdMultiReg(0x3A);
				printf("%x\r\n",buf[0]);
				printf("%x\r\n",buf[1]);
				printf("%x\r\n",buf[2]);
				printf("%x\r\n",buf[3]);
				printf("%x\r\n",buf[4]);
//				temp=(int16_t)(buf[1]<<8|buf[0]);
//				TempVal =(((float)temp+8000)/320+22);
                TempVal = GET_TEMP_CELSIUS_VAL(*(int16_t *)buf);
                RateVal = ((int32_t)((buf[2]<<8) | (buf[3]<<16) | (buf[4]<<24)))/256;
                printf("MAX537X temp=%f, acceleation=%d\r\n", TempVal, RateVal);
                delay_ms(500);
        }
	}
}       


结果

### STM32F407IG与MPU6050配合使用 对于STM32F407IG微控制器与MPU6050六轴运动处理传感器之间的连接和编程,通常涉及硬件接口的选择以及软件配置两方面。 #### 硬件连接指南 为了实现两者间的通信,推荐采用I²C或者SPI总线协议。其中,I²C是一种简单有效的双线双向串行通信方式,在许多应用场合下被广泛采纳用于短距离的数据交换。当选用I²C模式时,需将STM32的SCL引脚连接到MPU6050的SDA引脚上;同样地,把STM32上的SDA引脚接到MPU6050对应的SCL端子上去[^1]。另外还需注意拉高电阻的设置来确保信号稳定传输。 #### 软件初始化过程 在程序设计阶段,则要先完成必要的外设初始化工作。这包括但不限于开启相应的GPIO口、启动IIC/SPI模块并设定其参数等操作。具体来说就是在`main.c`文件中的适当位置加入如下代码片段: ```c // 初始化 I2C 接口 MX_I2C1_Init(); ``` 接着定义全局变量用来存储来自MPU6050的数据包结构体实例: ```c /* USER CODE BEGIN PV */ MPU6050_t MPU6050; /* USER CODE END PV */ ``` 之后调用特定函数对MPU6050进行初始化配置,比如重置设备状态、校准加速度计陀螺仪偏移量等等。这部分逻辑可以封装成独立的方法以便于维护管理。 #### 数据读取方法 获取传感器数据一般通过发送命令请求指定寄存器地址的方式来进行批量读写访问。例如,可以通过下面这段伪码展示如何连续读取多个字节的信息: ```c uint8_t buffer[14]; // 创建缓冲区准备接收14字节长度的结果集 HAL_I2C_Master_Receive(&hi2c1, (uint16_t)(MPU6050_ADDRESS<<1), buffer, 14, HAL_MAX_DELAY); ``` 上述例子中假设已经成功建立了与目标器件之间的握手关系,并且指定了正确的从机地址(这里为`MPU6050_ADDRESS`左移一位),最后利用ST官方提供的HAL库完成了实际的消息传递流程。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定猪的谔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值