Hello guys, i randomly get twi error busy 17.
i have #define TWI_DEFAULT_CONFIG_IRQ_PRIORITY 7
in sdk_config.h
and .interrupt_priority = APP_IRQ_PRIORITY_LOW
in init function.
This is my code
:
void twi_init(void)
{
if(twi_init_status) return;
ret_code_t err_code;
const nrf_drv_twi_config_t twi_mma_7660_config = {
.scl = SCL,
.sda = SDA,
.frequency = NRF_TWI_FREQ_100K,
.interrupt_priority = APP_IRQ_PRIORITY_LOW
};
err_code = nrf_drv_twi_init(&twi_instance, &twi_mma_7660_config, twi_handler, NULL);
APP_ERROR_CHECK(err_code);
nrf_drv_twi_enable(&twi_instance);
nrf_delay_ms(200);
twi_init_status = true;
}
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{
switch(p_event->type)
{
case NRF_DRV_TWI_EVT_DONE:
m_xfer_done = true;
break;
default:
break;
}
}
and this are my read and write functions:
void twi_write(uint8_t dev_addres, uint8_t reg_addres, uint8_t data[], uint8_t length)
{
uint8_t buffer[length];
buffer[0] = reg_addres;
for(int i = 0; i < length; i++) buffer[i+1] = data[i];
m_xfer_done = false;
ret_code_t err_code = nrf_drv_twi_tx(&twi_instance, dev_addres, buffer, sizeof(buffer) + 1, false);
APP_ERROR_CHECK(err_code);
while (!m_xfer_done);
}
void twi_write_no_register(uint8_t dev_addres, uint8_t data[], uint8_t length)
{
m_xfer_done = false;
ret_code_t err_code = nrf_drv_twi_tx(&twi_instance, dev_addres, data, length, false);
APP_ERROR_CHECK(err_code);
while (!m_xfer_done);
}
void twi_read(uint8_t dev_addres, uint8_t reg_addres, uint8_t *data_pointer, uint8_t length)
{
ret_code_t err_code;
uint8_t buffer[length];
buffer[0] = reg_addres;
m_xfer_done = false;
err_code = nrf_drv_twi_tx(&twi_instance, dev_addres, buffer, 1, false); // sends ADDR+W, dev_addres, reg_addres
APP_ERROR_CHECK(err_code);
while (!m_xfer_done);
m_xfer_done = false;
err_code = nrf_drv_twi_rx(&twi_instance, dev_addres, buffer, length); // reads from reg_addres #(length) of bytes
APP_ERROR_CHECK(err_code);
while (!m_xfer_done);
for(int i=0;i<length;i++)
{
*data_pointer=buffer[i];
data_pointer++;
}
}
I was reading posts about this problem but coudn't find a solution. I tried to put delays after twi functions but it didn't resolve the issue. Is this something i should handle in my code (if yes how would be helpfull)? I have also tried blocking mode and the error is the same. Sometimes it works for hours and sometime error occures right away.
Thanks.