/** * \brief Configures a TWI peripheral to operate in slave mode. * \param pTwi Pointer to an Twi instance. * \param slaveAddress Slave address. */ void TWI_ConfigureSlave(Twi *pTwi, uint8_t slaveAddress) { uint32_t i; /* TWI software reset */ pTwi->TWI_CR = TWI_CR_SWRST; pTwi->TWI_RHR; /* Wait at least 10 ms */ for (i=0; i < 1000000; i++); /* TWI Slave Mode Disabled, TWI Master Mode Disabled*/ pTwi->TWI_CR = TWI_CR_SVDIS | TWI_CR_MSDIS; /* Configure slave address. */ pTwi->TWI_SMR = 0; pTwi->TWI_SMR = TWI_SMR_SADR(slaveAddress); /* SVEN: TWI Slave Mode Enabled */ pTwi->TWI_CR = TWI_CR_SVEN; /* Wait at least 10 ms */ for (i=0; i < 1000000; i++); assert( (pTwi->TWI_CR & TWI_CR_SVDIS)!= TWI_CR_SVDIS ) ; }
/** * \brief Initialize TWI slave mode. * * \param p_twi Pointer to a TWI instance. * \param ul_device_addr Device address of the SAM slave device on the I2C bus. */ void twi_slave_init(Twi *p_twi, uint32_t ul_device_addr) { /* Disable TWI interrupts */ p_twi->TWI_IDR = ~0UL; p_twi->TWI_SR; /* Reset TWI */ twi_reset(p_twi); /* Set slave address in slave mode */ p_twi->TWI_SMR = TWI_SMR_SADR(ul_device_addr); /* Enable slave mode */ twi_enable_slave_mode(p_twi); }
/** * \brief Set TWI slave address. * * \param p_twi Pointer to a TWI instance. * \param ul_device_addr Device address of the SAM slave device on the I2C bus. */ void twi_set_slave_addr(Twi *p_twi, uint32_t ul_device_addr) { /* Set slave address */ p_twi->TWI_SMR = TWI_SMR_SADR(ul_device_addr); }