Based on https://github.com/MikroElektronika/ECG_3_click and https://os.mbed.com/teams/MaximIntegrated/code/MAX30003/

Dependents:   ECG_3_click_example

ECG_3_click.cpp

Committer:
JohnnyK
Date:
2021-09-30
Revision:
0:6cd861d8d613

File content as of revision 0:6cd861d8d613:


 
#include "ECG_3_click.h"
 
ECG_3_click::ECG_3_click(SPI &spiBus, PinName cs):
m_spiBus(spiBus), m_cs(cs, 1)
{
    //empty block
}

ECG_3_click::~ECG_3_click()
{
    //empty block
}


void ECG_3_click::swReset(void)
{
    writeRegister(_ECG3_SW_RST_REG, _ECG3_SW_RST_CMD);
}

void ECG_3_click::fifoReset(void)
{
    writeRegister(_ECG3_FIFO_RST_REG, _ECG3_FIFO_RST_CMD);
}

void ECG_3_click::sync(void)
{
    writeRegister(_ECG3_SYNC_REG, _ECG3_SYNCH_CMD);
}

void ECG_3_click::init(void)
{
    writeRegister(_ECG3_CNFG_GEN_REG, _ECG3_FMSTR_32768HZ_ECG_512HZ | _ECG3_ECG_CHANN_EN | _ECG3_DCLOFF_EN | _ECG3_RBIAS_100M_OHM | _ECG3_RBIASP_EN | _ECG3_RBIASN_EN);
    writeRegister(_ECG3_CNFG_CAL_REG, _ECG3_VCAL_EN | _ECG3_VMODE_BIPOL | _ECG3_VMAG_500MICROV);
    writeRegister(_ECG3_CNFG_EMUX_REG, _ECG3_ECGP_EN | _ECG3_ECGN_EN | _ECG3_ECGP_CAL_VCALP | _ECG3_ECGN_CAL_VCALN);
    writeRegister(_ECG3_CNFG_ECG_REG, 0x800000 | _ECG3_DHPF_500MILIHZ | _ECG3_DLPF_40HZ);
    writeRegister(_ECG3_CNFG_RTOR1_REG, _ECG3_WNDW_12 | _ECG3_RRGAIN_AUTO_SCALE | _ECG3_RTOR_EN | _ECG3_PAVG_8 | 0x000600);
}

void ECG_3_click::getECG(uint32_t *outECG)
{
    *outECG = readRegister(_ECG3_ECG_FIFO_REG);
    *outECG >>= 6;
}

void ECG_3_click::getRTOR(uint16_t *outHR, uint16_t *outRR)
{
    
    float res;
    uint16_t resInt;

    uint32_t rtorTemp = readRegister(_ECG3_RTOR_REG);
    rtorTemp >>= 10;
    res = 60 / ((float)rtorTemp * 0.008);
    resInt = res;
    *outHR = resInt;

    resInt = (uint16_t)rtorTemp * 8;
    *outRR = resInt;
}

uint32_t ECG_3_click::readRegister(const uint8_t reg)
{
    uint32_t data = 0;
    
    m_cs = 0;
    m_spiBus.write((reg << 1) | 1);
    data |= (m_spiBus.write(0xFF) << 16);
    data |= (m_spiBus.write(0xFF) << 8);
    data |= m_spiBus.write(0xFF);
    m_cs = 1;
    
    return data;
}
  
void ECG_3_click::writeRegister(const uint8_t reg, const uint32_t data)
{
    m_cs = 0;
    m_spiBus.write(reg << 1);
    m_spiBus.write((0x00FF0000 & data) >> 16);
    m_spiBus.write((0x0000FF00 & data) >> 8);
    m_spiBus.write( 0x000000FF & data);
    m_cs = 1;
}