STM32 MAX30100心率血氧传感模块的测试程序IIC(温度和模块ID采集)
(2017-02-03 23:59:54)
标签:
it |
#include "max30100.h"
#include "usart.h"
#include "delay.h"
#define BIT(n) ((0x01)<<(n))
#define MAX10300_WR_address 0xAE
#define MAX30100_REG_INT_STATUS 0x00
#define MAX30100_REG_INT_STATUS_PWR_RDY BIT(0)
#define MAX30100_REG_INT_STATUS_SPO2_RDY BIT(4)
#define MAX30100_REG_INT_STATUS_HR_RDY BIT(5)
#define MAX30100_REG_INT_STATUS_TEMP_RDY BIT(6)
#define MAX30100_REG_INT_STATUS_A_FULL
BIT(7)
#define MAX30100_REG_INT_ENABLE 0x01 //bit3~bit0 should be set
to zero
#define MAX30100_REG_INT_ENABLE_SPO2_RDY
BIT(4)
#define MAX30100_REG_INT_ENABLE_HR_RDY BIT(5)
#define MAX30100_REG_INT_ENABLE_TEP_RDY BIT(6)
#define MAX30100_REG_INT_ENABLE_A_FULL BIT(7)
#define MAX30100_REG_FIFO_WR_PTR 0x02
//FIFO_WR_PTR[3:0]
#define MAX30100_REG_FIFO_OF_CTR 0x03
//OVF_COUNTER[3:0] up to 0xF
#define MAX30100_REG_FIFO_RD_PTR 0x04
//FIFO_RD_PTR[3:0] only this should be
writen
#define MAX30100_REG_FIFO_DATA 0x05
//FIFO_DATA[7:0]
//each sample is 4 bytes of data ,this register has to be read
4 times to get one sample
#define MAX30100_REG_FIFO_DATA_ENTRY_COUNT
16
#define MAX30100_REG_FIFO_DATA_ENTRY_LEN
4
#define MAX30100_REG_MODE_CONFIG
0x06
#define MAX30100_REG_MODE_CONFIG_MODE_SPO2_EN
BIT(0)
#define MAX30100_REG_MODE_CONFIG_MODE_HR_EN BIT(1)
//MODE[2:0]
#define MAX30100_REG_MODE_CONFIG_MODE_MASK
0x03
#define MAX30100_REG_MODE_CONFIG_TEMP_EN BIT(3)
#define MAX30100_REG_MODE_CONFIG_PWR BIT(7)
#define MAX30100_REG_SPO2_CONFIG 0x07
#define MAX30100_REG_SPO2_CONFIG_100HZ BIT(2)
#define MAX30100_REG_SPO2_CONFIG_HI_RES_EN BIT(6)
#define MAX30100_REG_SPO2_CONFIG_1600US 0x03
#define MAX30100_REG_LED_CONFIG 0x09
#define MAX30100_REG_LED_CONFIG_LED_MASK 0x0f
#define MAX30100_REG_LED_CONFIG_RED_LED_SHIFT 4
#define MAX30100_REG_LED_CONFIG_24MA 0x07
#define MAX30100_REG_LED_CONFIG_50MA 0x0f
#define MAX30100_REG_TEMP_INTEGER 0x16
#define MAX30100_REG_TEMP_FRACTION 0x17
#define MAX30100_REG_REVISION_ID 0xFE
#define MAX30100_REG_PART_ID
0xFF
int rda;
unsigned char IIC_ACK;
void IIC_Init(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PB6 SCL
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
}
//START:when CLK is high,DATA change form high to
low
void IIC_Start(void)
{
SDA_OUT();
delay_us(2);
delay_us(2);
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
//STOP:when CLK is high DATA change form low to high
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL=0;
delay_us(2);
IIC_SDA=0;
delay_us(2);
IIC_SDA=1;
delay_us(2);
}
void IIC_SendByte(unsigned char txd)
{
if((txd<<t)&0x80)
IIC_SDA=1;
else
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
if(IIC_SDA==0)
IIC_ACK=0;
else
IIC_ACK=1;
IIC_SCL=0;
delay_us(2);
}
unsigned char IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_OUT();
IIC_SDA=1;
SDA_IN();
{
delay_us(2);
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
receive=receive<<1;
if(READ_SDA)receive++;
delay_us(2);
{
delay_us(2);
IIC_SCL=0;
delay_us(2);
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
{
delay_us(2);
IIC_SCL=0;
delay_us(2);
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
return receive;
}
void WR_MAX30100_Byte(int address,int saddress,int
W_Data)
{
delay_us(2);
IIC_Start();
delay_us(2);
IIC_SendByte(address);
delay_us(2);
IIC_SendByte(saddress);
delay_us(2);
IIC_SendByte(W_Data);
delay_us(2);
IIC_Stop();
delay_us(2);
}
void RD_MAX30100_Byte(int address,int saddress)
{
IIC_Start();
delay_us(2);
IIC_SendByte(address);
delay_us(2);
IIC_SendByte(saddress);
address+=1;
delay_us(2);
IIC_Start();
delay_us(2);
IIC_SendByte(address);
delay_us(2);
rda=IIC_Read_Byte(0);
delay_us(2);
IIC_Stop();
}
void max30100_test(void)
{
WR_MAX30100_Byte(MAX10300_WR_address,MAX30100_REG_MODE_CONFIG,MAX30100_REG_MODE_CONFIG_MODE_HR_EN|MAX30100_REG_MODE_CONFIG_TEMP_EN);//0000
1010
delay_ms(20);
RD_MAX30100_Byte(MAX10300_WR_address,MAX30100_REG_TEMP_INTEGER);//0001
0110
temp1=rda;
RD_MAX30100_Byte(MAX10300_WR_address,MAX30100_REG_TEMP_FRACTION);
temp2=rda;
temp=temp1+(temp2/100);
printf("temp=%.2f\r\n",temp);
RD_MAX30100_Byte(MAX10300_WR_address,MAX30100_REG_PART_ID);
printf("MAX30100 PART_ID =%d\r\n",rda);
printf("MAX30100 REVISION_ID =%d\r\n",rda);
}
前一篇:zigbee协议体系结构