Hello,
I am trying to implement a Heart Rate Monitor Interface (HRMI) board with my nRF52, using the TWI_sensor example from SDK 12.2. I am unable to read any heart rate values and it appears the the SDA and SCL lines are not communicating whatsoever. This is because the data I am reading is garbage and will not change.
Here is my process:
-
Set the HRMI mode by writing
<0x53><N>
to the HRMI I2C address#define HRMI_I2C_ADDR 127
using HRMI_set_mode(), where<N>
sets the mode to average mode when N=1:ret_code_t HRMI_set_mode() { ret_code_t ret_code; uint8_t reg[2] = {0x53, 0x01}; // <0x53><N> ret_code = nrf_drv_twi_tx(&m_twi_master, HRMI_I2C_ADDR, reg, sizeof(reg), false); return ret_code; }
-
Request a set of heart rate samples by writing
<0x47><N>
to the HRMI I2C address (127) using start_HR(), where<N>
is the number of samples to request:ret_code_t start_HR(uint8_t num_samples) { ret_code_t ret_code; uint8_t reg[2] = {HRMI_GET_HR_DATA, num_samples}; // <0x47><N> ret_code = nrf_drv_twi_tx(&m_twi_master, HRMI_I2C_ADDR, reg, sizeof(reg), false); return ret_code; }
-
Read the response by allocating an array for data returned over I2C using fetch_HR():
ret_code_t fetch_HR(uint8_t * hr){ ret_code_t ret_code; uint8_t returned_over_I2C[3]; //Array to hold returned data ret_code = nrf_drv_twi_rx(&m_twi_master, HRMI_I2C_ADDR, returned_over_I2C, sizeof(returned_over_I2C)); nrf_delay_ms(10); *hr = returned_over_I2C[2]; return ret_code; }
Here is my main function with the function calls to do this:
int main(void)
{
ret_code_t err_code;
uint8_t hr;
err_code = twi_master_init();
HRMI_set_mode(); // Set HRMI to average mode
APP_ERROR_CHECK(err_code);
while (true)
{
start_HR(0x01); //Request N = 1 (0x01) HR samples
fetch_HR(&hr);
SEGGER_RTT_printf(0, "Heart Rate: %d\n", hr););
} }
As for my circuitry, my SDA and SCL lines both have a 4.7kohm pull-up resistor bridged between 5V. On the HRMI board itself, I have not installed the jumper SJ1, and I have installed jumper OP0. No other jumpers are installed to ensure that the I2C address is in fact 127. This is explained in the HRMI datasheet.
I have checked off everything from the troubleshooting section for I2C in the HRMI datasheet (p.33). I am confident my TWI setup is correct because I am able to get sensor data over I2C concurrently from an accelerometer when I run my code (not shown).
When I read all the values from my returned_over_I2C
array, the data appears as <0x00><0x36><0x244>
, where <0x244>
should be the HR1 value read. Again, these values appear even when I disconnect the SDA and SCL lines from the HRMI board.
Does anyone have any insight into this?
Thank you,
Levi