采用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语言)相关推荐

  1. STM32F103通过模拟IIC读取LIS3DH 解析数据获取加速度和角度

    STM32F03通过模拟IIC读取LIS3DH 解析数据获取加速度和角度. 串口1输出电脑串口助手,直接用即可,代码规范,好移植 STM32F03通过模拟IIC读取LIS3DH 解析数据获取加速度和角 ...

  2. STM32模拟IIC读取PCF8563

    作者第一次开写博客,本着学习的态度,附上自己总结的代码,希望大家多多指点! 一.首先是对于PCF8563芯片的介绍与使用说明: PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接 ...

  3. 模拟IIC读取SHT30温湿度传感器数据

    文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...

  4. 模拟投票小程序C语言代码,微信小程序投票系统创建投票发布demo完整源码下载 一个很简单 - 下载 - 搜珍网...

    压缩包 : cc5b0189c052ed2f04381e14637b362c.zip 列表 wx_voteforyou-master/ wx_voteforyou-master/README.md w ...

  5. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

    版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...

  6. STM32F103C6T6 | 模拟IIC主机读取AHT20温湿度传感器数据

    关于STM32的IIC 一开始是用硬件内置的IIC来读取数据的,没有什么问题,但是不知道为什么后续断电上电之后一直没有数据,仿真看的话发现卡死在这些循环里面,我才反应过来网上一直说的硬件IIC有问题是 ...

  7. STM32F103单片机软件模拟IIC并读取TMP112数字温度传感器

    本文利用STM32F103系列单片机读取TMP112数字温度传感器的温度信息,TMP112数字传感器采用IIC总线协议通信.STM32自身含有硬件IIC资源,分别是PB6-->SCL.PB7-- ...

  8. c语言编程模拟机械钟表行走,C语言课程设计报告-模拟时钟转动程序

    1. 课程设计报告题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 导 教 师 金陵科技学院教务处制 程序设 ...

  9. c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序

    C语言课程设计报告模拟时钟转动程序 课程设计报告题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 导 教 师 ...

  10. c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序.doc

    C语言课程设计报告模拟时钟转动程序 PAGE 课程设计报告 题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 ...

最新文章

  1. QPS过万,redis大量连接超时怎么解决?
  2. Linux内核中max()宏的奥妙何在?(一)
  3. android TextView 带滚动条,和ScrollView 用法(暂时觉得ScrollView滑动速度比较快)
  4. SQL 简单,复杂查询,基本函数查询
  5. js GB2312和unicode互转
  6. 通过MATLAB将数据转化为mif文件,供Quartusii软件的ROM核读取调用
  7. 平顶山学院计算机分数线,2016年平顶山学院艺术类专业录取分数线
  8. MUI 宫格组件(grid)怎么取消mui-active背景色?(优先级设置问题)- 踩坑篇
  9. mouseChildren= false
  10. C++类模版demo
  11. grid设置时间格式
  12. 通俗易懂web3.0
  13. WIN7英文操作系统,中文语言包安装。及部分开发环境,软件中文乱码问题解决。
  14. 用74ls90组成二十四进制计数器_尘埃粒子计数器的工作原理和应用分析
  15. 前端获取本地ip和外网ip
  16. 求1000-2000年的闰年代码
  17. 2022数学建模高教杯国家一等奖经验分享
  18. c++ overload 、override、overwrite
  19. 从零开始学习网络数据包分析:科来抓包的入门教程
  20. 【安全预警】WINRAR,7ZIP,WINZIP等存在严重漏洞

热门文章

  1. 计算机 睡眠 无法打印,打印机脱机无法打印解决教程
  2. GRC: 个人信息保护法, 个人隐私, 企业风险合规治理
  3. Apicloud+Vue开发App专题
  4. 2020-2021 年度广东省职业院校学生专业技能大赛网络空间安全赛项竞赛规程
  5. PHP使用MQ消息队列
  6. 用mysql生成工资条,巧用各种方法可以实现工资条一键生成
  7. Android8 for 9300,三星G9300官方固件rom刷机包 G9300ZCS3CRI1 安卓8.0
  8. 宁波大学计算机网络复试真题,宁波大学计算机网络习题集
  9. 交返对于高频交易者尤为重要
  10. 点餐系统ip地址_教你一步一步做无线点餐项目(登录篇)