// must be called in: // slave tx event callback // or after beginTransmission(address) void TwoWire::send(uint8_t data) { if(transmitting) { // in master transmitter mode // don't bother if buffer is full if(txBufferLength >= BUFFER_LENGTH) { return; } // put byte in tx buffer txBuffer[txBufferIndex] = data; ++txBufferIndex; // update amount in buffer txBufferLength = txBufferIndex; } else { // Secure I2C power management Wire.secureBegin(); // in slave send mode // reply to master twi_transmit(&data, 1); // Secure I2C power management Wire.secureEnd(); } }
// must be called in: // slave tx event callback // or after beginTransmission(address) size_t TwoWire::write(uint8_t data) { int master, writeLenght; master = transmitting; writeLenght = txBufferLength; if(master){ // in master transmitter mode // don't bother if buffer is full if(writeLenght >= BUFFER_LENGTH){ setWriteError(); return 0; } // put byte in tx buffer txBuffer[txBufferIndex] = data; ++txBufferIndex; // update amount in buffer txBufferLength = txBufferIndex; }else{ // in slave send mode // reply to master twi_transmit(&data, 1); } return 1; }
size_t TwoWire::write(const uint8_t *data, size_t quantity){ if(transmitting){ for(size_t i = 0; i < quantity; ++i){ if(!write(data[i])) return i; } }else{ twi_transmit(data, quantity); } return quantity; }
// BUS TRANSMIT // =============================================================== // =============================================================== void processTx(void) { key_send[0] = 255; if(key_read != key_write) { key_send[0] = key_changes[key_read]; key_read++; key_read %= 128; } twi_transmit(key_send, 1); }
// must be called in: // slave tx event callback // or after beginTransmission(address) void TwoWire::send(uint8_t* data, uint8_t quantity) { if(transmitting){ // in master transmitter mode for(uint8_t i = 0; i < quantity; ++i){ send(data[i]); } }else{ // in slave send mode // reply to master twi_transmit(data, quantity); } }
int twi_tx_slave_address(unsigned char address, unsigned char mode) // complete { // transmit slave address and mode. twi_transmit(address | mode); // check return code if( (mode == TWI_WRITE_MODE) && ( (TWSR & 0xF8) != TWI_TX_SL_ADD_WRITE_SUCESS) ) return 1; if( (mode == TWI_READ_MODE) && ( (TWSR & 0xF8) != TWI_TX_SL_ADD_READ_SUCESS) ) return 1; return 0; }
// must be called in: // slave tx event callback // or after beginTransmission(address) size_t TwoWire::write(const uint8_t *data, size_t quantity) { if(transmitting){ // in master transmitter mode for(size_t i = 0; i < quantity; ++i){ write(data[i]); } }else{ // in slave send mode // reply to master twi_transmit(data, quantity); } return quantity; }
size_t TwoWire::write(uint8_t data){ if(transmitting){ if(txBufferLength >= BUFFER_LENGTH){ setWriteError(); return 0; } txBuffer[txBufferIndex] = data; ++txBufferIndex; txBufferLength = txBufferIndex; } else { twi_transmit(&data, 1); } return 1; }
// must be called in: // slave tx event callback // or after beginTransmission(address) void twi_send_byte(uint8_t data) { if(transmitting){ // in master transmitter mode // don't bother if buffer is full if(txBufferLength >= BUFFER_LENGTH){ return; } // put byte in tx buffer txBuffer[txBufferIndex] = data; ++txBufferIndex; // update amount in buffer txBufferLength = txBufferIndex; }else{ // in slave send mode // reply to master twi_transmit(&data, 1); } }
// must be called in: // slave tx event callback // or after beginTransmission(address) void TwoWire::send(uint8_t* data, uint8_t quantity) { if(transmitting) { // in master transmitter mode for(uint8_t i = 0; i < quantity; ++i) { send(data[i]); } } else { // Secure I2C power management Wire.secureBegin(); // in slave send mode // reply to master twi_transmit(data, quantity); // Secure I2C power management Wire.secureEnd(); } }
// must be called in: // slave tx event callback // or after beginTransmission(address) size_t TwoWireMaster::write(uint8_t data) { if(transmitting){ // in master transmitter mode // don't bother if buffer is full if(txBufferLength >= BUFFER_LENGTH){ setWriteError(); return 0; } // put byte in tx buffer txBuffer[txBufferIndex] = data; ++txBufferIndex; // update amount in buffer txBufferLength = txBufferIndex; }else{ // in slave send mode // reply to master #if ORG_FILE twi_transmit(&data, 1); #endif // ORG_FILE } return 1; }
// Private function i2c_write_data size_t i2c_write_byte(uint8_t data) { if(transmitting) { // in master transmitter mode // ignore if buffer full if(txBufferLength >= BUFFER_LENGTH) { // TODO: setWriteError // create a callback singaler return 0; } // put byte in tx buffer txBuffer[txBufferIndex] = data; ++txBufferIndex; txBufferLength = txBufferIndex; } else { twi_transmit(&data, 1); } return 1; // Placeholder }