<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/86150/max30101-i2c-communication-with-nrf52---dk</link><description>Hi, I&amp;#39;m currently designing a system which requires Heart Rate monitorization and I&amp;#39;m using the MAX30101 chip to do so. I will be using I2C communication and, therefore, based my code on the twi_sensor example for the nRF52 -DK dev kit. However, I just</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Wed, 06 Apr 2022 11:28:57 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/86150/max30101-i2c-communication-with-nrf52---dk" /><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/362061?ContentTypeID=1</link><pubDate>Wed, 06 Apr 2022 11:28:57 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:04965505-6c6a-43a9-a288-a4eec36b25cd</guid><dc:creator>Einarh</dc:creator><description>&lt;p&gt;They don&amp;#39;t make sense in what way?&lt;/p&gt;
&lt;p&gt;As long as it isn&amp;#39;t random gibberish data, I would have a look in the sensor data sheet to see what it says about how the data is represented.&lt;/p&gt;
&lt;p&gt;-Einar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/362052?ContentTypeID=1</link><pubDate>Wed, 06 Apr 2022 11:04:04 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7f5e8f6c-0200-4991-9b4c-0423f8b77498</guid><dc:creator>Gabriel Silva</dc:creator><description>&lt;p&gt;My initialization was not correct, there were a lot of configurations missing. The following code is the initialization:&amp;nbsp;&lt;pre class="ui-code" data-mode="c_cpp"&gt;void MAX30101_init (void)
{
    //Initialization and Configuration of MAX30101
    MAX30101_regWR(MAX30101_INT_EN_1, 0xC0);
    MAX30101_regWR(MAX30101_INT_EN_2, 0x00);
    
    MAX30101_regWR(MAX30101_FIFO_WR_PT, 0x00);
    MAX30101_regWR(MAX30101_OVF_CNT, 0x00);
    MAX30101_regWR(MAX30101_FIFO_RD_PT, 0x00);

    MAX30101_regWR(MAX30101_FIFO_CONF, 0x1F);
    MAX30101_regWR(MAX30101_CONF_REG, 0x03); //0x02 - HR; 0x03 - SpO2; 0x07 - Multi_LED
    MAX30101_regWR(MAX30101_SPO2_CONF, 0x27);
    MAX30101_regWR(LED1_PA, 0x3F);    // LED1 - RED
    //MAX30101_regWR(LED2_PA, 0x3F);    // LED2 - IR
    //MAX30101_regWR(LED3_PA, 0x3F);    // LED3 - GREEN
    //MAX30101_regWR(LED4_PA, 0x3F);    // LED4 - GREEN

    MAX30101_regRD(MAX30101_FIFO_WR_PT, &amp;amp;m_wr_ptr);
    MAX30101_regRD(MAX30101_FIFO_RD_PT, &amp;amp;m_rd_ptr);

    NRF_LOG_INFO(&amp;quot;Initialization and Configuration of MAX30101 done&amp;quot;);
    NRF_LOG_FLUSH();
}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Right now I&amp;#39;m trying to readthe values from the FIFO where the data is storred, on the MAX30101. The values that I&amp;#39;m getting don&amp;#39;t make much sense I think.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/361857?ContentTypeID=1</link><pubDate>Tue, 05 Apr 2022 13:07:18 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:229cfc06-af40-4a57-b3f1-7ceddf21bec2</guid><dc:creator>Einarh</dc:creator><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;Could you explain what you&amp;#39;re trying to do and what part of it isn&amp;#39;t working? That would make it easier for me to help you.&lt;/p&gt;
&lt;p&gt;Also, what was causing your previous issue? Would be nice to know if someone has similar issues.&lt;/p&gt;
&lt;p&gt;-Einar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/361773?ContentTypeID=1</link><pubDate>Tue, 05 Apr 2022 09:08:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d08e250f-7df6-4f9c-ac52-eff7122a53bf</guid><dc:creator>Gabriel Silva</dc:creator><description>&lt;p&gt;Hi! Hope you&amp;#39;re feeling better!&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve been reading the datasheet and trying multiple stuff and tink I have actually resolved the problem! Thanks for the help anyway! I do have another question, if maybe you could help. To acquire the values from the FIFO, I&amp;#39;m not sure how to proceed. Could you maybe help with that? The following code is the function I&amp;#39;m using to acquire the values.&lt;pre class="ui-code" data-mode="c_cpp"&gt;void MAX30101_FIFO_HR (uint32_t *pun_red_led)
{
    uint8_t status_1;
    uint32_t temp_32 = 0;
    uint8_t temp_array[3];
    
    *pun_red_led = 0;

    MAX30101_regRD(MAX30101_INT_ST_1, &amp;amp;status_1);
    MAX30101_regRD(MAX30101_FIFO_DATA, temp_array);


    temp_32 |= temp_array[0];
    temp_32 &amp;lt;&amp;lt;= 8;
    temp_32 |= temp_array[1];
    temp_32 &amp;lt;&amp;lt;= 8;
    temp_32 |= temp_array[2];
    *pun_red_led = temp_32;

    *pun_red_led &amp;amp;= 0x00FFFFFF;

}&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/361766?ContentTypeID=1</link><pubDate>Tue, 05 Apr 2022 08:52:02 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:63cf8047-9905-42bd-bb44-3ed8f906937a</guid><dc:creator>Einarh</dc:creator><description>&lt;p&gt;Hello again, sorry for the late reply, I was home sick last week.&lt;/p&gt;
&lt;p&gt;I notice you&amp;#39;re using &lt;a href="https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.1.0/group__nrf__drv__twi.html"&gt;this legacy driver&lt;/a&gt;, any reason you&amp;#39;re not using the nrfx driver?&lt;/p&gt;
&lt;p&gt;What version of the SDK are you using?&lt;/p&gt;
&lt;p&gt;-Einar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/360064?ContentTypeID=1</link><pubDate>Fri, 25 Mar 2022 14:52:43 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:47b1c87a-e2f9-4cbc-9bd6-79bd6eaad399</guid><dc:creator>Gabriel Silva</dc:creator><description>&lt;p&gt;Yes, the datasheet confirms the slave ID.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It probably is an incomplete initialization, because the slave ID is correct. If you could help, I would be really thankful! I&amp;#39;ll keep trying through the weekend.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thanks in advance!&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/360062?ContentTypeID=1</link><pubDate>Fri, 25 Mar 2022 14:50:35 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:48bf7ef5-ccae-4383-847f-00a551baa74d</guid><dc:creator>Einarh</dc:creator><description>&lt;p&gt;Does the datasheet confirm the slave id?&lt;/p&gt;
&lt;p&gt;Depending on the type of sensor you&amp;#39;re using there could potentially be more than one available slave id.&lt;/p&gt;
&lt;p&gt;Based on the behavior you&amp;#39;re seeing it sounds like it could be either a wrong slave address or incomplete initialization of the sensor.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;re still having issues I can look into the data reading procedure on monday&lt;/p&gt;
&lt;p&gt;-Einar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/360057?ContentTypeID=1</link><pubDate>Fri, 25 Mar 2022 14:32:36 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0b8852f5-91c6-42e6-b2a7-ddd72dfe1c35</guid><dc:creator>Gabriel Silva</dc:creator><description>&lt;p&gt;Yes, I have tried that and I still get zeros.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;My guess is that I am not correctly reading the FIFO, but I cant&amp;#39;t find what it is that I&amp;#39;m doing wrong.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/360053?ContentTypeID=1</link><pubDate>Fri, 25 Mar 2022 14:28:49 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f26b7180-430b-49bf-933c-170f73c045ba</guid><dc:creator>Einarh</dc:creator><description>&lt;p&gt;ok I see, and then when you try to read anything you get only zeroes?&lt;/p&gt;
&lt;p&gt;Have you tried initializing your read array to something other than zero to differentiate between reading zeroes and not reading anything?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/360030?ContentTypeID=1</link><pubDate>Fri, 25 Mar 2022 13:51:54 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:3ce47885-064c-4285-963c-28a7715c686b</guid><dc:creator>Gabriel Silva</dc:creator><description>&lt;p&gt;I used the twi_scanner code to get the slave ID.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/360029?ContentTypeID=1</link><pubDate>Fri, 25 Mar 2022 13:49:42 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:37fe7086-c716-44f6-89c6-3e81de9119dd</guid><dc:creator>Einarh</dc:creator><description>&lt;p&gt;What exactly do you mean by detecting the sensor?&lt;/p&gt;
&lt;p&gt;Are you able to read other registers than the measurement data, such as a sensor device id maybe?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/359879?ContentTypeID=1</link><pubDate>Thu, 24 Mar 2022 17:13:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:423b9c8f-8689-4abe-8e7d-1a34dfeed15b</guid><dc:creator>Gabriel Silva</dc:creator><description>&lt;p&gt;Hi! Thanks for the reply!&lt;/p&gt;
&lt;p&gt;I am able to detect the sensor in the correct address (0x57).&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t get any error message, I just keep getting 0&amp;#39;s. I think I may be reading the FIFO in a wrong way, but I based my code on the pseudo-code on the datasheet.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/359837?ContentTypeID=1</link><pubDate>Thu, 24 Mar 2022 14:19:09 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ef278a26-0cfc-48f1-9be6-daa3b0f86737</guid><dc:creator>Einarh</dc:creator><description>&lt;p&gt;Hi!&lt;/p&gt;
&lt;p&gt;What have you done so far to debug the I2C?&lt;/p&gt;
&lt;p&gt;Are you able to use you I2C device at all? Is the problem reaching the sensor?&lt;/p&gt;
&lt;p&gt;Have you seen any error messages that could indicate what your problem is?&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Einar&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: MAX30101 I2C communication with nRF52 - DK</title><link>https://devzone.nordicsemi.com/thread/359772?ContentTypeID=1</link><pubDate>Thu, 24 Mar 2022 11:10:58 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8e637279-549d-4c5f-81cf-c18ee6a6af39</guid><dc:creator>Gabriel Silva</dc:creator><description>&lt;p&gt;I did a few changes, but still I get the same results. Here is the newer version of the code. Once again, thanks in advance.&lt;pre class="ui-code" data-mode="c_cpp"&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;quot;boards.h&amp;quot;
#include &amp;quot;app_util_platform.h&amp;quot;
#include &amp;quot;app_error.h&amp;quot;
#include &amp;quot;nrf_drv_twi.h&amp;quot;
#include &amp;quot;nrf_delay.h&amp;quot;


#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_log_ctrl.h&amp;quot;
#include &amp;quot;nrf_log_default_backends.h&amp;quot;

/* TWI instance ID. */
#define TWI_INSTANCE_ID     0

#define MAX30101_ADDRESS     0x57
#define MAX30101_CONF_REG    0x09
#define MAX30101_MODE_HR     0x02
#define MAX30101_MODE_SPO2   0x03
#define MAX30101_FIFO_DATA   0x07
#define MAX30101_FIFO_WR_PT  0x04
#define MAX30101_FIFO_RD_PT  0x06
#define SPO2_CONF            0x0A
#define SPO2_CONF_SET        0x04

/* Indicates if operation on TWI has ended. */
static volatile bool m_xfer_done = false;

/* TWI instance. */
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

/* Buffer for samples read from temperature sensor. */
static uint8_t m_sample;

static uint8_t m_wr_ptr, m_rd_ptr, m_num_samples;

static uint8_t tx_fifo[10];
static uint8_t read_array[10];

/**
 * @brief Function for setting active mode on MMA7660 accelerometer.
 */
void LM75B_set_mode(void)
{
    ret_code_t err_code;

    /* Writing to MAX30101_CONF_REG to set SpO2 Mode. */
    uint8_t reg[2] = {MAX30101_CONF_REG, MAX30101_MODE_SPO2};
    err_code = nrf_drv_twi_tx(&amp;amp;m_twi, MAX30101_ADDRESS, reg, sizeof(reg), false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);

    /* Writing to pointer byte. */
    tx_fifo[0] = MAX30101_FIFO_WR_PT;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&amp;amp;m_twi, MAX30101_ADDRESS, tx_fifo, 1, false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);
    err_code = nrf_drv_twi_rx(&amp;amp;m_twi, MAX30101_ADDRESS, &amp;amp;m_wr_ptr, sizeof(m_wr_ptr));
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);

}

/**
 * @brief Function for handling data from temperature sensor.
 *
 * @param[in] temp          Temperature in Celsius degrees read from sensor.
 */
__STATIC_INLINE void data_handler(uint8_t temp)
{
    NRF_LOG_INFO(&amp;quot;Values SpO2: %d .&amp;quot;, temp);
}

/**
 * @brief TWI events handler.
 */
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{
    switch (p_event-&amp;gt;type)
    {
        case NRF_DRV_TWI_EVT_DONE:
        if (p_event-&amp;gt;xfer_desc.type == NRF_DRV_TWI_XFER_RX)
            {
                data_handler(m_sample);
            }
            m_xfer_done = true;
            break;
        default:
            break;
    }
}

/**
 * @brief UART initialization.
 */
void twi_init (void)
{
    ret_code_t err_code;

    const nrf_drv_twi_config_t twi_lm75b_config = {
       .scl                = ARDUINO_SCL_PIN,
       .sda                = ARDUINO_SDA_PIN,
       .frequency          = NRF_DRV_TWI_FREQ_100K,
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
       .clear_bus_init     = false
    };

    err_code = nrf_drv_twi_init(&amp;amp;m_twi, &amp;amp;twi_lm75b_config, twi_handler, NULL);
    APP_ERROR_CHECK(err_code);

    nrf_drv_twi_enable(&amp;amp;m_twi);
}

/**
 * @brief Function for reading data from temperature sensor.
 */
static void read_sensor_data()
{
    ret_code_t err_code;
    
    m_xfer_done = false;

    read_array[0] = MAX30101_FIFO_DATA;
    m_xfer_done = false;
    err_code = nrf_drv_twi_tx(&amp;amp;m_twi, MAX30101_ADDRESS, read_array, 1, false);
    APP_ERROR_CHECK(err_code);
    while (m_xfer_done == false);

    err_code = nrf_drv_twi_rx(&amp;amp;m_twi, MAX30101_ADDRESS, &amp;amp;m_sample, sizeof(m_sample));
    APP_ERROR_CHECK(err_code);
}

/**
 * @brief Function for main application entry.
 */
int main(void)
{
    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    NRF_LOG_INFO(&amp;quot;\r\nTWI sensor example started.&amp;quot;);
    NRF_LOG_FLUSH();

    twi_init();
    NRF_LOG_INFO(&amp;quot;\r\nI2C Communication initialized.&amp;quot;);
    NRF_LOG_FLUSH();

    LM75B_set_mode();

    NRF_LOG_INFO(&amp;quot;\r\nMAX30101 Initialized.&amp;quot;);
    NRF_LOG_FLUSH();

    while (true)
    {
        nrf_delay_ms(500);

        do
        {
            __WFE();
        }while (m_xfer_done == false);

        read_sensor_data();
        NRF_LOG_FLUSH();
    }
}
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>