MAX30102 模拟IIC读取程序(C语言)
采用STM32F427 读取MAX30102程序 ,端口PB5 PB6
#include "stm32F4xx_hal.h"
#include <STDINT.H>
#include "IIC.H"
#include "stm32F4xx.h" // Device header
//#define IIC_SCL_PORT GPIOB
//#define IIC_SCL_PIN GPIO_PIN_6
//#define IIC_SDA_PORT GPIOB
//#define IIC_SDA_PIN GPIO_PIN_5
void IIC_Delay(void)
{
uint32_t i;
for(i=0;i<75;i++)
{
}
}
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = IIC_SCL_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(IIC_SCL_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = IIC_SDA_PIN;
HAL_GPIO_Init(IIC_SDA_PORT, &GPIO_InitStruct);
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_SET);
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = IIC_SDA_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
//GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(IIC_SCL_PORT, &GPIO_InitStruct);
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = IIC_SDA_PIN;
// GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD ;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(IIC_SCL_PORT, &GPIO_InitStruct);
}
void IIC_Start(void)
{
SDA_OUT();
// Set_IIC_SDA;
// Set_IIC_SCL;
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_SET);
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
IIC_Delay();
// Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_RESET);
IIC_Delay();
//Clr_IIC_SCL;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
}
void IIC_Stop(void)
{
SDA_OUT();
// Clr_IIC_SCL;
// Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_RESET);
IIC_Delay();
// Set_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
IIC_Delay();
// Set_IIC_SDA;
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_SET);
IIC_Delay();
}
uint8_t IIC_Wait_Ack(void)
{
uint32_t i=2;
SDA_IN(); //SDAÉèÖÃΪÊäÈë
//Set_IIC_SDA;
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_SET);
IIC_Delay();
//Set_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
IIC_Delay();
while(i--){
if(HAL_GPIO_ReadPin(IIC_SDA_PORT, IIC_SDA_PIN)==1)
{
//Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
IIC_Delay();
//Set_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
IIC_Delay();
}
else
goto loop;
}
loop:
// Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
IIC_Delay();
return 0;
}
void IIC_Ack(void)
{
// Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
SDA_OUT();
//Clr_IIC_SDA;
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_RESET);
IIC_Delay();
//Set_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
IIC_Delay();
// Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
}
void IIC_NAck(void)
{
//Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
SDA_OUT();
//Set_IIC_SDA;
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_SET);
IIC_Delay();
//Set_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
IIC_Delay();
// Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
}
void IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
for(t=0;t<8;t++)
{
// Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
IIC_Delay();
if (txd&0x80) //Set_IIC_SDA
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_SET);
else //Clr_IIC_SDA;
HAL_GPIO_WritePin(IIC_SDA_PORT,IIC_SDA_PIN,GPIO_PIN_RESET);
txd<<=1;
IIC_Delay();
//Set_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
IIC_Delay();
}
// Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
}
uint8_t IIC_Read_Byte(void)
{
uint8_t i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
receive<<=1;
// Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_RESET);
IIC_Delay();
// Set_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
IIC_Delay();
if(HAL_GPIO_ReadPin(IIC_SDA_PORT, IIC_SDA_PIN)==GPIO_PIN_SET)
{
receive |= 0x01;
}
else
{
receive &= 0xfe;
}
}
//Clr_IIC_SCL;
HAL_GPIO_WritePin(IIC_SCL_PORT,IIC_SCL_PIN,GPIO_PIN_SET);
return receive;
}
//下面为max30102读写文件
#include <STDINT.H>
#include "MAX30102.h"
#include "IIC.H"
#define max30102_WR_address 0xAE
#define INTERRUPT_REG 0X00
/*
#define REG_INTR_STATUS_1 0x00
#define REG_INTR_STATUS_2 0x01
#define REG_INTR_ENABLE_1 0x02
#define REG_INTR_ENABLE_2 0x03
#define REG_FIFO_WR_PTR 0x04
#define REG_OVF_COUNTER 0x05
#define REG_FIFO_RD_PTR 0x06
#define REG_FIFO_DATA 0x07
#define REG_FIFO_CONFIG 0x08
#define REG_MODE_CONFIG 0x09
#define REG_SPO2_CONFIG 0x0A
#define REG_LED1_PA 0x0C
#define REG_LED2_PA 0x0D
#define REG_PILOT_PA 0x10
#define REG_MULTI_LED_CTRL1 0x11
#define REG_MULTI_LED_CTRL2 0x12
#define REG_TEMP_INTR 0x1F
#define REG_TEMP_FRAC 0x20
#define REG_TEMP_CONFIG 0x21
#define REG_PROX_INT_THRESH 0x30
#define REG_REV_ID 0xFE
#define REG_PART_ID 0xFF
*/
void max30102_init1(void)
{
//DIE SPO2 SETING
//max30102_Write(REG_INTR_ENABLE_1,0xc0) ;//rg:0x02 INTR setting
max30102_Write(REG_INTR_ENABLE_1,0xD0) ;//rg:0x02 INTR setting a-Full ppg_rdy alc_ovf ennable
max30102_Bus_Write(0x03, 0x00); //DIE_TEMP_RDY_EN
max30102_Write(REG_FIFO_WR_PTR,0x00); //rg:0x04 FIFO_WR_PTR[4:0] rg:0x04
max30102_Write(REG_OVF_COUNTER,0x00); //rg:0x05 OVF_COUNTER[4:0] rg:0x05
max30102_Write(REG_FIFO_RD_PTR,0x00); //rg:0x06 FIFO_RD_PTR[4:0] rg:0x06
max30102_Write(REG_FIFO_CONFIG,0x4f); // rg:0x08 sample avg = 4, fifo rollover=false, fifo almost full = 17
max30102_Write(REG_MODE_CONFIG,0x03); // rg:0x09 0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED
max30102_Write(REG_SPO2_CONFIG,0x47); //rg:0x0a SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), LED pulseWidth (400uS)
max30102_Write(REG_LED1_PA,60); //rg:0x0c Choose value for ~ 7mA for LED1
max30102_Write(REG_LED2_PA,60); //rg:0x0d Choose value for ~ 7mA for LED2
max30102_Write(REG_PILOT_PA,0x7f); // rg:0x10 Choose value for ~ 25mA for Pilot LED
//DIE TEMPRATURE SETING
// max30102_Bus_Write(0x03, 0x02); //DIE_TEMP_RDY_EN
// max30102_Bus_Write(0x21, 0x01); //SET TEMP_EN
// max30102_Read(0x01); //clear DIE_TEMP_RDY
}
void max30102_reset(void)
{
max30102_Write(REG_MODE_CONFIG,0x40); // rg:0x09 RESET=1 ALL DATA rigister reset to poweron state
}
uint8_t max30102_Write( uint8_t Register_Address, uint8_t Word_Data)
{
IIC_Start();
IIC_Send_Byte(max30102_WR_address | I2C_WR);
if (IIC_Wait_Ack() != 0)
{
goto cmd_fail; /* EEPROMÆ÷¼þÎÞÓ¦´ð */
}
IIC_Send_Byte(Register_Address);
if (IIC_Wait_Ack() != 0)
{
goto cmd_fail; /* EEPROMÆ÷¼þÎÞÓ¦´ð */
}
IIC_Send_Byte(Word_Data);
if (IIC_Wait_Ack() != 0)
{
goto cmd_fail;
}
IIC_Stop();
return 1;
cmd_fail:
IIC_Stop();
return 0;
}
int8_t max30102_Read(uint8_t Register_Address)
{
uint8_t data;
IIC_Start();
IIC_Send_Byte(max30102_WR_address | I2C_WR);
if (IIC_Wait_Ack() != 0)
{
goto cmd_fail;
}
IIC_Send_Byte((uint8_t)Register_Address);
if (IIC_Wait_Ack() != 0)
{
goto cmd_fail; /* EEPROMÆ÷¼þÎÞÓ¦´ð */
}
IIC_Start();
IIC_Send_Byte(max30102_WR_address | I2C_RD);
if (IIC_Wait_Ack() != 0)
{
goto cmd_fail;
}
{
data = IIC_Read_Byte();
IIC_NAck();
}
IIC_Stop();
return data;
cmd_fail:
IIC_Stop();
return 0;
}
void max30102_FIFO_Rd(uint8_t Register_Address, uint32_t Word_Data[][2], uint8_t count)
{
uint8_t i=0;
uint8_t numb = count;
uint32_t data1, data2,data3;
IIC_Start();
IIC_Send_Byte(max30102_WR_address | I2C_WR);
if (IIC_Wait_Ack() != 0)
{
goto cmd_fail;
}
IIC_Send_Byte((uint8_t)Register_Address);
if (IIC_Wait_Ack() != 0)
{
goto cmd_fail;
}
IIC_Start();
IIC_Send_Byte(max30102_WR_address | I2C_RD);
IIC_Ack();
while (numb)
{
data1 = IIC_Read_Byte();
IIC_Ack();
data2 = IIC_Read_Byte();
IIC_Ack();
data3 = IIC_Read_Byte();
IIC_Ack();
Word_Data[i][0] = ((data1 << 8) | data2)<<8|data3; //
Word_Data[i][0]&=0x3ffff;
data1 = IIC_Read_Byte();
IIC_Ack();
data2 = IIC_Read_Byte();
IIC_Ack();
data3 = IIC_Read_Byte();
if(1==numb )
IIC_NAck();
else
IIC_Ack();
Word_Data[i][1] = ((data1 << 8) | data2)<<8|data3;
Word_Data[i][1]&=0x3ffff;
numb--;
i++;
}
// IIC_Stop();
cmd_fail:
IIC_Stop();
}
MAX30102 模拟IIC读取程序(C语言)相关推荐
- STM32F103通过模拟IIC读取LIS3DH 解析数据获取加速度和角度
STM32F03通过模拟IIC读取LIS3DH 解析数据获取加速度和角度. 串口1输出电脑串口助手,直接用即可,代码规范,好移植 STM32F03通过模拟IIC读取LIS3DH 解析数据获取加速度和角 ...
- STM32模拟IIC读取PCF8563
作者第一次开写博客,本着学习的态度,附上自己总结的代码,希望大家多多指点! 一.首先是对于PCF8563芯片的介绍与使用说明: PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接 ...
- 模拟IIC读取SHT30温湿度传感器数据
文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...
- 模拟投票小程序C语言代码,微信小程序投票系统创建投票发布demo完整源码下载 一个很简单 - 下载 - 搜珍网...
压缩包 : cc5b0189c052ed2f04381e14637b362c.zip 列表 wx_voteforyou-master/ wx_voteforyou-master/README.md w ...
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...
- STM32F103C6T6 | 模拟IIC主机读取AHT20温湿度传感器数据
关于STM32的IIC 一开始是用硬件内置的IIC来读取数据的,没有什么问题,但是不知道为什么后续断电上电之后一直没有数据,仿真看的话发现卡死在这些循环里面,我才反应过来网上一直说的硬件IIC有问题是 ...
- STM32F103单片机软件模拟IIC并读取TMP112数字温度传感器
本文利用STM32F103系列单片机读取TMP112数字温度传感器的温度信息,TMP112数字传感器采用IIC总线协议通信.STM32自身含有硬件IIC资源,分别是PB6-->SCL.PB7-- ...
- c语言编程模拟机械钟表行走,C语言课程设计报告-模拟时钟转动程序
1. 课程设计报告题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 导 教 师 金陵科技学院教务处制 程序设 ...
- c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序
C语言课程设计报告模拟时钟转动程序 课程设计报告题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 导 教 师 ...
- c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序.doc
C语言课程设计报告模拟时钟转动程序 PAGE 课程设计报告 题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 ...
最新文章
- QPS过万,redis大量连接超时怎么解决?
- Linux内核中max()宏的奥妙何在?(一)
- android TextView 带滚动条,和ScrollView 用法(暂时觉得ScrollView滑动速度比较快)
- SQL 简单,复杂查询,基本函数查询
- js GB2312和unicode互转
- 通过MATLAB将数据转化为mif文件,供Quartusii软件的ROM核读取调用
- 平顶山学院计算机分数线,2016年平顶山学院艺术类专业录取分数线
- MUI 宫格组件(grid)怎么取消mui-active背景色?(优先级设置问题)- 踩坑篇
- mouseChildren= false
- C++类模版demo
- grid设置时间格式
- 通俗易懂web3.0
- WIN7英文操作系统,中文语言包安装。及部分开发环境,软件中文乱码问题解决。
- 用74ls90组成二十四进制计数器_尘埃粒子计数器的工作原理和应用分析
- 前端获取本地ip和外网ip
- 求1000-2000年的闰年代码
- 2022数学建模高教杯国家一等奖经验分享
- c++ overload 、override、overwrite
- 从零开始学习网络数据包分析:科来抓包的入门教程
- 【安全预警】WINRAR,7ZIP,WINZIP等存在严重漏洞
热门文章
- 计算机 睡眠 无法打印,打印机脱机无法打印解决教程
- GRC: 个人信息保护法, 个人隐私, 企业风险合规治理
- Apicloud+Vue开发App专题
- 2020-2021 年度广东省职业院校学生专业技能大赛网络空间安全赛项竞赛规程
- PHP使用MQ消息队列
- 用mysql生成工资条,巧用各种方法可以实现工资条一键生成
- Android8 for 9300,三星G9300官方固件rom刷机包 G9300ZCS3CRI1 安卓8.0
- 宁波大学计算机网络复试真题,宁波大学计算机网络习题集
- 交返对于高频交易者尤为重要
- 点餐系统ip地址_教你一步一步做无线点餐项目(登录篇)