static void onI2C(int id, void * tptr) { DTWI::I2C_STATUS status = di2c.getStatus(); uint8_t data; if(status.fSlave) { if(status.fRead) { while(di2c.available() > 0) { onReceiveServiceR(NULL, di2c.available()); } } // on writing out, we only call once when the // new session starts else if(status.fWrite && iSessionCur != status.iSession) { iSessionCur = status.iSession; onRequestServiceR(); } } }
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity) { DTWI::I2C_STATUS status; // may have to wait for the last action to finish before // a repeated start can occur while(!di2c.startMasterRead(address, quantity)); do { status = di2c.getStatus(); } while(status.fMyBus && !status.fNacking); while(!di2c.stopMaster()); return(di2c.available()); }
// must be called in: // slave rx event callback // or after requestFrom(address, numBytes) uint8_t TwoWire::available(void) { return (di2c.available()); }