BL652 MAX30102の基礎

 BL652 nRF52832でMAX30102を動かす事をめざす。同時に結果をOLEDに吐き出す所をやる。


SSD1306をI2C制御しつつ、もう一つMAX30102もI2Cで接続し、しかもnRF52でMAX30102を制御する事をめざす。

前回のテンプレートから開始する。

ssd1306.cの中のTWIの初期化関数をコールしている所をコメントアウトしてあげて本体のプログラム側で用意する事にする。

/* TWI instance. */

const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(0); 

の下の部分に

void twi_init (void)

{

    const nrf_drv_twi_config_t twi_config = {

       .scl                = ARDUINO_SCL_PIN,

       .sda                = ARDUINO_SDA_PIN,

       .frequency          = NRF_DRV_TWI_FREQ_400K,

       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,

       .clear_bus_init     = false

    };

   nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);

    nrf_drv_twi_enable(&m_twi);

}

初期化の関数をもってくる。#include "boards.h"をインクルードしているのでARDUINO_SCL_PINとARDUINO_SDA_PINが使える。直接、 ARDUINO_SCL_PIN            は27 、ARDUINO_SDA_PIN は26にしているので実数で入れても同じ。


MAX30102の基礎的なアクセスの方法はArduinoで勉強しているので、簡単な動作確認をする。

uint8_t MAX30102_read_register (uint8_t reg_address)

{

    uint8_t data;

    ret_code_t err_code;

    err_code = nrf_drv_twi_tx(&m_twi, 0x57, &reg_address, sizeof(reg_address), true);

    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_twi_rx(&m_twi, 0x57, &data, sizeof(data));

    APP_ERROR_CHECK(err_code);

return data;

}

レジスタを読む関数をまず用意してやる。void twi_init (void)に続けて定義を書いてやる。

int main(void)

{

    //initialization of I2C

    twi_init();

    //initialization of SSD1306

    SSD1306_Init();

    uint8_t OLED_buffer[32];


    //Initilization of NRF_LOG

    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));

    NRF_LOG_DEFAULT_BACKENDS_INIT();

    SSD1306_GotoXY (0,0);

    sprintf(OLED_buffer,"ID=0x%x",MAX30102_read_register(0xFF));

    SSD1306_Puts (OLED_buffer, &Font_11x18, 1);

    SSD1306_UpdateScreen();

    while (true)

    {

     //printf("Hallo printf.\n\r");

     NRF_LOG_INFO("Hello NRF_LOG.");

     NRF_LOG_FLUSH();

     nrf_delay_ms(500);

        // Do nothing.

    }

}

メインの部分を上にする。プログラムの仕様上、 twi_init();を先に呼び出してから SSD1306_Init();を走らせる。



接続は、I2Cバスをカスケードする形でSSD1306とSDA,SCKを接続している。

プログラムは正常で、MAX30102のIDを”15”を返してくれる。


レジスタへの書き込みの関数も用意してやる。

uint8_t MAX30102_write_register (uint8_t reg_address, uint8_t data)

{

    ret_code_t err_code; 

    uint8_t buffer[2] = {reg_address, data};

    err_code = nrf_drv_twi_tx(&m_twi, 0x57, buffer, sizeof(buffer), true);

    APP_ERROR_CHECK(err_code);

}


メインの中に

    //initialization of I2C
    twi_init();
    //initialization of SSD1306
    SSD1306_Init();
    uint8_t OLED_buffer[32];

    //initialization of MAX30102
    MAX30102_write_register(0x09,0x07);
    //LED current
    MAX30102_write_register(0x0D,0x1F);
    //
    MAX30102_write_register(0x11,0x21);

初期設定をレジスタに書き込み、
whileの中で、
     nrf_delay_ms(500);
     MAX30102_wite_register(0x0D,0x00);
     nrf_delay_ms(500);
     MAX30102_wite_register(0x0D,0x1F);
置いて点滅させてやる。
書き込みも問題なくできて、点滅する所まで確認できた。赤い点の部分が点滅しているところ。

#include <stdbool.h>
#include <stdint.h>

#include "nrf.h"
#include "nordic_common.h"
#include "boards.h"


// for using nrf_log
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"

// for using nrf_delay
#include "nrf_delay.h"

// for using I2C
#include "nrf_drv_twi.h"

// for using OLED display with SSD1306
#include "ssd1306.h"
#include "fun_logo.h"

/* TWI instance ID. */
#if TWI0_ENABLED
#define TWI_INSTANCE_ID     0
#elif TWI1_ENABLED
#define TWI_INSTANCE_ID     1
#endif
/* TWI instance. */
const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(0); //do not change instance name "m_twi" which is used ssd1306.c

void twi_init (void)
{
    const nrf_drv_twi_config_t twi_config = {
       .scl                = ARDUINO_SCL_PIN,
       .sda                = ARDUINO_SDA_PIN,
       .frequency          = NRF_DRV_TWI_FREQ_400K,
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
       .clear_bus_init     = false
    };

   nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL);
    nrf_drv_twi_enable(&m_twi);
}

uint8_t MAX30102_read_register (uint8_t reg_address)
{
    uint8_t data;
    ret_code_t err_code;
    /* Apuntamos al registro que queremos leer*/
    err_code = nrf_drv_twi_tx(&m_twi, 0x57, &reg_address, sizeof(reg_address), true);
    APP_ERROR_CHECK(err_code);

    /* Leemos los datos del registro*/
    err_code = nrf_drv_twi_rx(&m_twi, 0x57, &data, sizeof(data));
    APP_ERROR_CHECK(err_code);

return data;
}

uint8_t MAX30102_write_register (uint8_t reg_address, uint8_t data)
{
    ret_code_t err_code; 
    uint8_t buffer[2] = {reg_address, data};
    err_code = nrf_drv_twi_tx(&m_twi, 0x57, buffer, sizeof(buffer), true);
    APP_ERROR_CHECK(err_code);
}

/**
 * @brief Function for application main entry.
 */
int main(void)
{
    //initialization of I2C
    twi_init();
    //initialization of SSD1306
    SSD1306_Init();
    uint8_t OLED_buffer[32];

    //initialization of MAX30102
    MAX30102_write_register(0x09,0x07);
    //LED current
    MAX30102_write_register(0x0D,0x1F);
    //
    MAX30102_write_register(0x11,0x21);

    //Initilization of NRF_LOG
    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
    NRF_LOG_DEFAULT_BACKENDS_INIT();

    SSD1306_GotoXY (0,0);
    sprintf(OLED_buffer,"ID=0x%x",MAX30102_read_register(0xFF));
    SSD1306_Puts (OLED_buffer, &Font_11x18, 1);
    SSD1306_UpdateScreen();

    while (true)
    {

     //printf("Hallo printf.\n\r");
     NRF_LOG_INFO("Hello NRF_LOG.");
     NRF_LOG_FLUSH();
     nrf_delay_ms(500);
     MAX30102_wite_register(0x0D,0x00);
     nrf_delay_ms(500);
     MAX30102_wite_register(0x0D,0x1F);
        // Do nothing.
    }
}
/** @} */

コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法