I am using nrf_drv_twi_rx to initiate an I2C read transfer but the interrupt isn't fired for the RX transfer when the ulTaskNotifyTake is used, but seems to work without ulTaskNotifyTake() call. When I hooked up to the logic analyzer, it seems the read bytes aren't sent.
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context) { Sensor *obj = static_cast<Sensor*>(p_context); switch (p_event->type) { case NRF_DRV_TWI_EVT_DONE: if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX) { vTaskNotifyGiveFromISR(obj->taskHandle, pdFALSE); } else if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_TX) { NRF_LOG_INFO("TX transfer done...\n"); } m_xfer_done = true; break; default: break; } } void Sensor::initiateI2cRead() { ret_code_t err_code = nrf_drv_twi_rx(&m_twi, ADDR, _buffer, 2); } void MCP9808::write(uint8_t reg, uint8_t *buffer, uint8_t size) { ret_code_t err_code; err_code = nrf_drv_twi_tx(&m_twi, ADDR, ®, size, false); APP_ERROR_CHECK(err_code); while (m_xfer_done == false); } void Sensor::xferData(uint8_t size) { write(reg, size); } void Sensor::mainThread() { xferData(1); while(true) { initiateI2cRead(); uint32_t taskNotify = ulTaskNotifyTake(pdTRUE, portMAX_DELAY); processData(); } }