void twi_send(Twi *this_twi, wbuff *nwb, uint32_t address) { this_twi->TWI_MMR = TWI_MMR_DADR(address) | TWI_MMR_IADRSZ_1_BYTE; this_twi->TWI_IADR = TWI_IADR_IADR(nwb->buff[0]); this_twi->TWI_CR = TWI_CR_MSEN; this_twi->TWI_THR = nwb->buff[1]; this_twi->TWI_CR = TWI_CR_STOP; }
// if 1 byte address, eeprom uses lower address bits for pos > 255 if (EEPROM_ADDRSZ_BYTES == TWI_MMR_IADRSZ_1_BYTE) { address |= pos >> 8; pos &= 0xFF; } // set master mode register with internal address TWI_INTERFACE->TWI_MMR = 0; TWI_INTERFACE->TWI_MMR = (twiDirection << 12) | EEPROM_ADDRSZ_BYTES | TWI_MMR_DADR(address); // write internal address register TWI_INTERFACE->TWI_IADR = 0; TWI_INTERFACE->TWI_IADR = TWI_IADR_IADR(pos); if (twiDirection) TWI_INTERFACE->TWI_CR = TWI_CR_START;//send Start Bit for receiving data #endif } /************************************************************************* Terminates the data transfer and releases the I2C bus *************************************************************************/ void HAL::i2cStop(void) { while ( (TWI_INTERFACE->TWI_SR & TWI_SR_TXRDY) != TWI_SR_TXRDY);//wait for transmission finished TWI_INTERFACE->TWI_CR = TWI_CR_STOP;// send Stop while (!((TWI_INTERFACE->TWI_SR & TWI_SR_TXCOMP) == TWI_SR_TXCOMP));//wait for i2cCompleted }