加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PB7 SDA
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;    
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB,GPIO_Pin_7);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PB6 SCL
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB,GPIO_Pin_6);
}

//START:when CLK is high,DATA change form high to low 
void IIC_Start(void)
{
SDA_OUT(); 
  IIC_SDA=1;
delay_us(2);
  IIC_SCL=1;
delay_us(2);    
  IIC_SDA=0;
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_SCL=1;
delay_us(2);
IIC_SDA=1;
delay_us(2);
}
        
void IIC_SendByte(unsigned char txd)
{                        
    unsigned char t;   
 SDA_OUT();    
    for(t=0;t<8;t++)
    {              
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();
    for(i=0;i<8;i++ )
{
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); 
    }  
    if (!ack)
{
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);
}
    else
{
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)
{
 double temp,temp1,temp2;
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);   
    RD_MAX30100_Byte(MAX10300_WR_address,MAX30100_REG_REVISION_ID);            
printf("MAX30100 REVISION_ID =%d\r\n",rda);
    delay_ms(1000);    
}




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有