標(biāo)題:
STM32驅(qū)動MAX30102源碼
[打印本頁]
作者:
798314770
時間:
2019-1-4 15:26
標(biāo)題:
STM32驅(qū)動MAX30102源碼
MAX30102+stm32
單片機源程序如下:
#include "stm32f10x.h"
#include "usart.h"
#include "ultrasonic.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_i2c.h"
#include "delay.h"//延時函數(shù)
#include <stdio.h>
#include <math.h>
#include "bsp_i2c_gpio.h"
/*************************************************
函數(shù): fputc(int ch, FILE *f)
功能: 重定向c庫函數(shù)printf到USART1
參數(shù): 無
返回: 無
**************************************************/
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (unsigned char) ch);
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
}
/*************************************************
函數(shù): void main_init(void)
功能: main初始化
參數(shù): 無
返回: 無
**************************************************/
void main_init(void)
{
Usart_Init();
//I2C1_GPIO_Config();
//I2C1_Mode_config();
//I2C1_Configuration();
bsp_InitI2C();
delay_init(72); //延時初始化
}
extern u8 max30102_Bus_Read(u8 Register_Address);
extern void max30102_init(void);
/*************************************************
函數(shù): int main(void)
功能: main主函數(shù)
參數(shù): 無
返回: 無
**************************************************/
int main(void)
{
u8 temp_num=0;
main_init();
max30102_init();
printf("\r\n MAX30102 init \r\n");
while(1)
{
delay_ms(1000);
max30102_init();
temp_num = max30102_Bus_Read(0x1f);
printf("當(dāng)前溫度 = %d\r\n",temp_num);
}
}
#define max30102_WR_address 0xAE
u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data)
{
/* 采用串行EEPROM隨即讀取指令序列,連續(xù)讀取若干字節(jié) */
/* 第1步:發(fā)起I2C總線啟動信號 */
i2c_Start();
/* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_WR); /* 此處是寫指令 */
/* 第3步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第4步:發(fā)送字節(jié)地址 */
i2c_SendByte(Register_Address);
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第5步:開始寫入數(shù)據(jù) */
i2c_SendByte(Word_Data);
/* 第6步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 發(fā)送I2C總線停止信號 */
i2c_Stop();
return 1; /* 執(zhí)行成功 */
cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號,避免影響I2C總線上其他設(shè)備 */
/* 發(fā)送I2C總線停止信號 */
i2c_Stop();
return 0;
}
u8 max30102_Bus_Read(u8 Register_Address)
{
u8 data;
/* 第1步:發(fā)起I2C總線啟動信號 */
i2c_Start();
/* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_WR); /* 此處是寫指令 */
/* 第3步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第4步:發(fā)送字節(jié)地址, */
i2c_SendByte((uint8_t)Register_Address);
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第6步:重新啟動I2C總線。下面開始讀取數(shù)據(jù) */
i2c_Start();
/* 第7步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_RD); /* 此處是讀指令 */
/* 第8步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第9步:讀取數(shù)據(jù) */
{
data = i2c_ReadByte(); /* 讀1個字節(jié) */
i2c_NAck(); /* 最后1個字節(jié)讀完后,CPU產(chǎn)生NACK信號(驅(qū)動SDA = 1) */
}
/* 發(fā)送I2C總線停止信號 */
i2c_Stop();
return data; /* 執(zhí)行成功 返回data值 */
cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號,避免影響I2C總線上其他設(shè)備 */
/* 發(fā)送I2C總線停止信號 */
i2c_Stop();
return 0;
}
void max30102_FIFO_Read(u8 Register_Address,u16 Word_Data[][2],u8 count)
{
u8 i=0;
u8 no = count;
u8 data1, data2;
/* 第1步:發(fā)起I2C總線啟動信號 */
i2c_Start();
/* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_WR); /* 此處是寫指令 */
/* 第3步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第4步:發(fā)送字節(jié)地址, */
i2c_SendByte((uint8_t)Register_Address);
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第6步:重新啟動I2C總線。下面開始讀取數(shù)據(jù) */
i2c_Start();
/* 第7步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_RD); /* 此處是讀指令 */
/* 第8步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第9步:讀取數(shù)據(jù) */
while (no)
{
data1 = i2c_ReadByte();
i2c_Ack();
data2 = i2c_ReadByte();
i2c_Ack();
Word_Data[i][0] = (((u16)data1 << 8) | data2); //
data1 = i2c_ReadByte();
i2c_Ack();
data2 = i2c_ReadByte();
if(1==no)
i2c_NAck(); /* 最后1個字節(jié)讀完后,CPU產(chǎn)生NACK信號(驅(qū)動SDA = 1) */
else
i2c_Ack();
Word_Data[i][1] = (((u16)data1 << 8) | data2);
no--;
i++;
}
/* 發(fā)送I2C總線停止信號 */
i2c_Stop();
cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號,避免影響I2C總線上其他設(shè)備 */
/* 發(fā)送I2C總線停止信號 */
i2c_Stop();
}
#define INTERRUPT_REG 0X00
void max30102_init()
{
max30102_Bus_Write(0x09, 0x0b); //mode configuration : temp_en[3] MODE[2:0]=010 HR only enabled 011 SP02 enabled
max30102_Bus_Write(0x01, 0xF0); //open all of interrupt
max30102_Bus_Write(INTERRUPT_REG, 0x00); //all interrupt clear
max30102_Bus_Write(0x03, 0x02); //DIE_TEMP_RDY_EN
max30102_Bus_Write(0x21, 0x01); //SET TEMP_EN
max30102_Bus_Write(0x0a, 0x47); //SPO2_SR[4:2]=001 100 per second LED_PW[1:0]=11 16BITS
max30102_Bus_Write(0x0c, 0x47);
max30102_Bus_Write(0x0d, 0x47);
}
復(fù)制代碼
所有資料51hei提供下載:
使用模擬iic_MAX30102_for_stm32.7z
(383.17 KB, 下載次數(shù): 111)
2019-1-4 16:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2019-1-4 17:00
不要發(fā)本站已有的重復(fù)內(nèi)容,建議先在搜索欄搜索一下
作者:
小翔520
時間:
2019-1-31 16:23
樓主有沒i2.c文件庫的函數(shù),跪求一下
作者:
SMILE鵬
時間:
2021-7-13 01:30
不能用 大家不用下載了
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1