This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

NRF TWIM EasyDMA Won''t Start (Master I2C)

I haven't been able to crack this one. Both pins confirmed as pull-up high using

#define I2C_PIN_INIT_CONF     ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \
                              | (GPIO_PIN_CNF_DRIVE_S0D1     << GPIO_PIN_CNF_DRIVE_Pos) \
                              | (GPIO_PIN_CNF_PULL_Pullup    << GPIO_PIN_CNF_PULL_Pos)  \
                              | (GPIO_PIN_CNF_INPUT_Connect  << GPIO_PIN_CNF_INPUT_Pos) \
                              | (GPIO_PIN_CNF_DIR_Input      << GPIO_PIN_CNF_DIR_Pos))



I notice when the peripheral is enabled the pins are pulled low (correct I think).

Only sending, have set short between tx and stop. Interrupt set to fire on stop.

Verified all registers are correct. 4 bytes ready to dispatch!



Execute with   NRF_TWIM0->TASKS_STARTTX = 1

And it sits there. I have a main loop and a print in the interrupt. The interrupt doesn't fire and main suggests EVENTS_TXSTARTED hasn't occurred.



Parents
  • Been looking at it again but without any luck. Using NRF52DK, pins 6 and 7 (not taken by anything else) used for SCL/SDA. 

    NRF_GPIO->PIN_CNF[CFG_PIN_LCD_SCL] = I2C_PIN_INIT_CONF;
    NRF_GPIO->PIN_CNF[CFG_PIN_LCD_SDA] = I2C_PIN_INIT_CONF;
    NRF_GPIO->PIN_CNF[CFG_PIN_LCD_VDD] = ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \
    | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) \
    | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) \
    | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos));
    NRF_GPIO->OUTSET = 1 << CFG_PIN_LCD_VDD;

    NRF_TWIM0->ADDRESS = 0x3f;
    NRF_TWIM0->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100 << TWIM_FREQUENCY_FREQUENCY_Pos;
    NRF_TWIM0->PSEL.SCL = (TWIM_PSEL_SCL_CONNECT_Connected << TWIM_PSEL_SCL_CONNECT_Pos) | CFG_PIN_LCD_SCL;
    NRF_TWIM0->PSEL.SDA = (TWIM_PSEL_SDA_CONNECT_Connected << TWIM_PSEL_SDA_CONNECT_Pos) | CFG_PIN_LCD_SDA;
    NRF_TWIM0->INTENSET = TWIM_INTENSET_STOPPED_Enabled << TWIM_INTENSET_STOPPED_Pos;
    NRF_TWIM0->SHORTS = TWIM_SHORTS_LASTTX_STOP_Enabled << TWIM_SHORTS_LASTTX_STOP_Pos;
    NRF_TWIM0->ENABLE = 1;

    NVIC_SetPriority(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn, 3);
    NVIC_EnableIRQ(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn);

    __enable_irq();




Reply Children
No Data
Related