打印
[其他ST产品]

STM32与外接MAX30102的I2C通信问题

[复制链接]
7219|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cek|  楼主 | 2018-3-10 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人大四学生,目前做的毕设需要使用到MAX30102模块,使用的核心板是STM32F103C8T6。
在使用过程中发现该模块的工作电压为1.8V,I2C上拉电阻接的是1.8V,然而我单片机的工作电压为3.3V,直接连接并不能进行通信。
请教了公司的同事,改了一下电路,将上拉电阻的电压接到了5V。
但是由于模块的工作电压为1.8V,所以在释放总线的时候导致SDA的输出高电平电压到不了3.3V,只能到1.6V左右。
因此现在我的单片机与MAX30102并不能进行通信。
各位大牛走过路过麻烦帮我看一下,有没有什么解决的办法。
谢谢了真的,比较急,我自己弄了挺久的了,弄不出来
沙发
ayb_ice| | 2018-3-12 09:23 | 只看该作者
NXP有个方案,外接两个场效应管和两个电阻就可以了,可以网上搜索下,很简单的,电平转换IC也是有的

使用特权

评论回复
板凳
hbsjzwsm| | 2018-3-14 08:17 | 只看该作者
加个电平转换的芯片,就可以了

使用特权

评论回复
地板
彬w少| | 2018-5-24 21:22 | 只看该作者
楼主,能把你的程序共享给我吗?万分感谢

使用特权

评论回复
5
Polarbear7| | 2019-12-6 10:34 | 只看该作者
楼主现在有弄出来stm32的max30102的程序吗,我刚开始上手有点一窍不通啊,想跟你请教一下,如果方便的话可否添加一下我的QQ:1609598886

使用特权

评论回复
6
maximQ820270087| | 2020-6-20 09:26 | 只看该作者
MAX30102。采用一个1.8V电源和一个独立的3.3V用于内部LED的电源,标准的I2C兼容的通信接口

使用特权

评论回复
7
maximQ820270087| | 2020-6-20 09:51 | 只看该作者
/** \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 "bsp_i2c_gpio.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;
}

使用特权

评论回复
8
maximQ820270087| | 2020-6-20 09:51 | 只看该作者
给大家参考一下部分代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

cek

1

主题

2

帖子

0

粉丝