Example #1
0
// 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);
	}
}
Example #2
0
/**
 * @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;
}