MAX30102+stm32测心率血氧
只留下MAX30102、main、I2C、算法、四个文件就行,在I2C中改一下IO
单片机源程序如下:
- /** \file max30102.cpp ******************************************************
- *
- * Project: MAXREFDES117#
- * Filename: max30102.cpp
- * Description: This module is an embedded controller driver for the MAX30102
- *
- * Revision History:
- *\n 1-18-2016 Rev 01.00 GL Initial release.
- *\n
- */
- #include "max30102.h"
- #include "myiic.h"
- #define max30102_WR_address 0xAE
- bool maxim_max30102_write_reg(uint8_t uch_addr, uint8_t uch_data)
- /**
- * \brief Write a value to a MAX30102 register
- * \par Details
- * This function writes a value to a MAX30102 register
- *
- * \param[in] uch_addr - register address
- * \param[in] uch_data - register data
- *
- * \retval true on success
- */
- {
- /* 第1步:发起I2C总线启动信号 */
- i2c_Start();
- /* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
- i2c_SendByte(max30102_WR_address | I2C_WR); /* 此处是写指令 */
- /* 第3步:发送ACK */
- if (i2c_WaitAck() != 0)
- {
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- /* 第4步:发送字节地址 */
- i2c_SendByte(uch_addr);
- if (i2c_WaitAck() != 0)
- {
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- /* 第5步:开始写入数据 */
- i2c_SendByte(uch_data);
- /* 第6步:发送ACK */
- if (i2c_WaitAck() != 0)
- {
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- /* 发送I2C总线停止信号 */
- i2c_Stop();
- return true; /* 执行成功 */
- cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
- /* 发送I2C总线停止信号 */
- i2c_Stop();
- return false;
- }
- bool maxim_max30102_read_reg(uint8_t uch_addr, uint8_t *puch_data)
- /**
- * \brief Read a MAX30102 register
- * \par Details
- * This function reads a MAX30102 register
- *
- * \param[in] uch_addr - register address
- * \param[out] puch_data - pointer that stores the register data
- *
- * \retval true on success
- */
- {
- /* 第1步:发起I2C总线启动信号 */
- i2c_Start();
- /* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
- i2c_SendByte(max30102_WR_address | I2C_WR); /* 此处是写指令 */
- /* 第3步:发送ACK */
- if (i2c_WaitAck() != 0)
- {
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- /* 第4步:发送字节地址, */
- i2c_SendByte((uint8_t)uch_addr);
- if (i2c_WaitAck() != 0)
- {
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- /* 第6步:重新启动I2C总线。下面开始读取数据 */
- i2c_Start();
- /* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
- i2c_SendByte(max30102_WR_address | I2C_RD); /* 此处是读指令 */
- /* 第8步:发送ACK */
- if (i2c_WaitAck() != 0)
- {
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- /* 第9步:读取数据 */
- {
- *puch_data = i2c_ReadByte(); /* 读1个字节 */
- i2c_NAck(); /* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */
- }
- /* 发送I2C总线停止信号 */
- i2c_Stop();
- return true; /* 执行成功 返回data值 */
- cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
- /* 发送I2C总线停止信号 */
- i2c_Stop();
- return false;
- }
- bool maxim_max30102_init(void)
- /**
- * \brief Initialize the MAX30102
- * \par Details
- * This function initializes the MAX30102
- *
- * \param None
- *
- * \retval true on success
- */
- {
- if(!maxim_max30102_write_reg(REG_INTR_ENABLE_1, 0xc0)) // INTR setting
- return false;
- if(!maxim_max30102_write_reg(REG_INTR_ENABLE_2, 0x00))
- return false;
- if(!maxim_max30102_write_reg(REG_FIFO_WR_PTR, 0x00)) //FIFO_WR_PTR[4:0]
- return false;
- if(!maxim_max30102_write_reg(REG_OVF_COUNTER, 0x00)) //OVF_COUNTER[4:0]
- return false;
- if(!maxim_max30102_write_reg(REG_FIFO_RD_PTR, 0x00)) //FIFO_RD_PTR[4:0]
- return false;
- if(!maxim_max30102_write_reg(REG_FIFO_CONFIG, 0x6f)) //sample avg = 8, fifo rollover=false, fifo almost full = 17
- return false;
- if(!maxim_max30102_write_reg(REG_MODE_CONFIG, 0x03)) //0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
- return false;
- if(!maxim_max30102_write_reg(REG_SPO2_CONFIG, 0x2F)) // SPO2_ADC range = 4096nA, SPO2 sample rate (400 Hz), LED pulseWidth (411uS)
- return false;
- if(!maxim_max30102_write_reg(REG_LED1_PA, 0x17)) //Choose value for ~ 4.5mA for LED1
- return false;
- if(!maxim_max30102_write_reg(REG_LED2_PA, 0x17)) // Choose value for ~ 4.5mA for LED2
- return false;
- if(!maxim_max30102_write_reg(REG_PILOT_PA, 0x7f)) // Choose value for ~ 25mA for Pilot LED
- return false;
- return true;
- }
- bool maxim_max30102_read_fifo(uint32_t *pun_red_led, uint32_t *pun_ir_led)
- /**
- * \brief Read a set of samples from the MAX30102 FIFO register
- * \par Details
- * This function reads a set of samples from the MAX30102 FIFO register
- *
- * \param[out] *pun_red_led - pointer that stores the red LED reading data
- * \param[out] *pun_ir_led - pointer that stores the IR LED reading data
- *
- * \retval true on success
- */
- {
- uint32_t un_temp;
- uint8_t uch_temp;
- *pun_ir_led = 0;
- *pun_red_led = 0;
- maxim_max30102_read_reg(REG_INTR_STATUS_1, &uch_temp);
- maxim_max30102_read_reg(REG_INTR_STATUS_2, &uch_temp);
- /* 第1步:发起I2C总线启动信号 */
- i2c_Start();
- /* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
- i2c_SendByte(max30102_WR_address | I2C_WR); /* 此处是写指令 */
- /* 第3步:发送ACK */
- if (i2c_WaitAck() != 0)
- {
- printf("read fifo failed");
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- /* 第4步:发送字节地址, */
- i2c_SendByte((uint8_t)REG_FIFO_DATA);
- if (i2c_WaitAck() != 0)
- {
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- /* 第6步:重新启动I2C总线。下面开始读取数据 */
- i2c_Start();
- /* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
- i2c_SendByte(max30102_WR_address | I2C_RD); /* 此处是读指令 */
- /* 第8步:发送ACK */
- if (i2c_WaitAck() != 0)
- {
- goto cmd_fail; /* EEPROM器件无应答 */
- }
- un_temp = i2c_ReadByte();
- i2c_Ack();
- un_temp <<= 16;
- *pun_red_led += un_temp;
- un_temp = i2c_ReadByte();
- i2c_Ack();
- un_temp <<= 8;
- *pun_red_led += un_temp;
- un_temp = i2c_ReadByte();
- i2c_Ack();
- *pun_red_led += un_temp;
- un_temp = i2c_ReadByte();
- i2c_Ack();
- un_temp <<= 16;
- *pun_ir_led += un_temp;
- un_temp = i2c_ReadByte();
- i2c_Ack();
- un_temp <<= 8;
- *pun_ir_led += un_temp;
- un_temp = i2c_ReadByte();
- i2c_Ack();
- *pun_ir_led += un_temp;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
stm32 max30102上传整数型数据.zip
(366.15 KB, 下载次数: 820)
|