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