// This is needed if reset is pressed while communication // to the eeprom is running. // NOTE: after bricklet_clear_eeproms i2c has to be reconfigured! void bricklet_clear_eeproms(void) { Pin sda = PIN_TWI_TWD_BRICKLET; Pin scl = PIN_TWI_TWCK_BRICKLET; for(uint8_t i = 0; i < BRICKLET_NUM; i++) { bricklet_select(i); i2c_clear_bus(&sda, &scl); bricklet_deselect(i); } }
/** * @brief Configures and activates the I2C peripheral. * * @param[in] i2cp pointer to the @p I2CDriver object * * @notapi */ void i2c_lld_start(I2CDriver *i2cp) { NRF_TWIM_Type *i2c = i2cp->i2c; const I2CConfig *cfg = i2cp->config; if (i2cp->state != I2C_STOP) return; osalDbgAssert(i2c->ENABLE == 0, "already in use"); i2c_clear_bus(i2cp); IOPORT1->PIN_CNF[cfg->scl_pad] = I2C_PIN_CNF; IOPORT1->PIN_CNF[cfg->sda_pad] = I2C_PIN_CNF; i2c->SHORTS = 0; i2c->EVENTS_STOPPED = 0; i2c->EVENTS_ERROR = 0; (void)i2c->EVENTS_STOPPED; (void)i2c->EVENTS_ERROR; i2c->PSEL.SCL = cfg->scl_pad; i2c->PSEL.SDA = cfg->sda_pad; switch (cfg->clock) { case 100000: i2c->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100 << TWIM_FREQUENCY_FREQUENCY_Pos; break; case 250000: i2c->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K250 << TWIM_FREQUENCY_FREQUENCY_Pos; break; case 400000: i2c->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K400 << TWIM_FREQUENCY_FREQUENCY_Pos; break; default: osalDbgAssert(0, "invalid I2C frequency"); break; }; #if NRF5_I2C_USE_I2C0 nvicEnableVector(I2C0_IRQ_NUM, I2C0_IRQ_PRI); #endif #if NRF5_I2C_USE_I2C1 nvicEnableVector(I2C1_IRQ_NUM, I2C1_IRQ_PRI); #endif i2c->INTENSET = TWIM_INTENSET_STOPPED_Msk | TWIM_INTENSET_ERROR_Msk; i2c->ENABLE = TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos; }