uint8_t I2C::write(uint8_t address, uint8_t registerAddress, uint8_t data) { returnStatus = 0; returnStatus = start(); if(returnStatus){return(returnStatus);} returnStatus = sendAddress(SLA_W(address)); if(returnStatus) { if(returnStatus == 1){return(2);} return(returnStatus); } returnStatus = sendByte(registerAddress); if(returnStatus) { if(returnStatus == 1){return(3);} return(returnStatus); } returnStatus = sendByte(data); if(returnStatus) { if(returnStatus == 1){return(3);} return(returnStatus); } returnStatus = stop(); if(returnStatus) { if(returnStatus == 1){return(7);} return(returnStatus); } return(returnStatus); }
uint8_t I2C::write(uint8_t address, uint8_t registerAddress, uint8_t *data, uint8_t numberBytes) { returnStatus = 0; returnStatus = start(); if(returnStatus){return(returnStatus);} returnStatus = sendAddress(SLA_W(address)); if(returnStatus) { if(returnStatus == 1){return(2);} return(returnStatus); } returnStatus = sendByte(registerAddress); if(returnStatus) { if(returnStatus == 1){return(3);} return(returnStatus); } for (uint8_t i = 0; i < numberBytes; i++) { returnStatus = sendByte(data[i]); if(returnStatus) { if(returnStatus == 1){return(3);} return(returnStatus); } } returnStatus = stop(); if(returnStatus) { if(returnStatus == 1){return(7);} return(returnStatus); } return(returnStatus); }
uint8_t I2C::read(uint8_t address, uint8_t registerAddress, uint8_t numberBytes, uint8_t *dataBuffer) { bytesAvailable = 0; bufferIndex = 0; if(numberBytes == 0){numberBytes++;} nack = numberBytes - 1; returnStatus = 0; returnStatus = start(); if(returnStatus){return(returnStatus);} returnStatus = sendAddress(SLA_W(address)); if(returnStatus) { if(returnStatus == 1){return(2);} return(returnStatus); } returnStatus = sendByte(registerAddress); if(returnStatus) { if(returnStatus == 1){return(3);} return(returnStatus); } returnStatus = start(); if(returnStatus) { if(returnStatus == 1){return(4);} return(returnStatus); } returnStatus = sendAddress(SLA_R(address)); if(returnStatus) { if(returnStatus == 1){return(5);} return(returnStatus); } for(uint8_t i = 0; i < numberBytes; i++) { if( i == nack ) { returnStatus = receiveByte(0); if(returnStatus == 1){return(6);} if(returnStatus != MR_DATA_NACK){return(returnStatus);} } else { returnStatus = receiveByte(1); if(returnStatus == 1){return(6);} if(returnStatus != MR_DATA_ACK){return(returnStatus);} } dataBuffer[i] = TWDR; bytesAvailable = i+1; totalBytes = i+1; } returnStatus = stop(); if(returnStatus) { if(returnStatus == 1){return(7);} return(returnStatus); } return(returnStatus); }
uint8_t I2C::beginTransmission(uint8_t address) { returnStatusWire = 0; returnStatus = 0; returnStatus = start(); returnStatusWire = returnStatus; if(returnStatus){return(returnStatus);} returnStatus = sendAddress(SLA_W(address)); returnStatusWire = returnStatus; return(returnStatus); }
bool read_registers_uint16_le(uint8_t addr, uint8_t reg, uint16_t* data, uint8_t size) { QASSERT(s_is_initialized); QASSERT(s_is_locked); QASSERT(data && size > 0); if (!data || size == 0) { return 0; } uint8_t* data_ptr8 = reinterpret_cast<uint8_t*>(data) + 1; //the data_ptr8 will advance like this //1, 0, 3, 2, 5, 4, 7, 6, 9, 8 if (!_start()) goto error; if (!_send_address(SLA_W(addr))) goto error; if (!_send_byte(reg)) goto error; if (!_start()) goto error; if (!_send_address(SLA_R(addr))) goto error; { uint8_t i = size - 1; while (i > 0) { if (!_receive_byte_ack()) goto error; *data_ptr8 = TWDR; data_ptr8 -= 1; if (!_receive_byte_ack()) goto error; *data_ptr8 = TWDR; data_ptr8 += 3; --i; } } //last bytes { if (!_receive_byte_ack()) goto error; *data_ptr8 = TWDR; data_ptr8 -= 1; if (!_receive_byte()) goto error; *data_ptr8 = TWDR; //data_ptr8 += 3; } if (!_stop()) goto error; return true; error: s_lockup_count++; return false; }
bool read_registers(uint8_t addr, uint8_t reg, uint8_t* data, uint8_t size) { QASSERT(s_is_initialized); QASSERT(s_is_locked); QASSERT(size > 0); if (size == 0) { return 0; } if (!_start()) goto error; if (!_send_address(SLA_W(addr))) goto error; if (!_send_byte(reg)) goto error; if (!_start()) goto error; if (!_send_address(SLA_R(addr))) goto error; if (data) { uint8_t i = size - 1; while (i > 0) { if (!_receive_byte_ack()) goto error; *data++ = TWDR; --i; } //last item { if (!_receive_byte()) goto error; *data = TWDR; } } else { uint8_t i = size - 1; while (i > 0) { if (!_receive_byte_ack()) goto error; s_i2c_null_sink = TWDR; --i; } //last item { if (!_receive_byte()) goto error; s_i2c_null_sink = TWDR; } } if (!_stop()) goto error; return true; error: s_lockup_count++; return false; }
bool write(uint8_t addr, const uint8_t* data, uint8_t size) { QASSERT(s_is_initialized); QASSERT(s_is_locked); QASSERT(data && size > 0); if (!_start()) goto error; if (!_send_address(SLA_W(addr))) goto error; for (int8_t i = size; i > 0; i--) { if (!_send_byte(*data++)) goto error; } if (!_stop()) goto error; return true; error: s_lockup_count++; return false; }
int I2C::ping(uint8_t addr) { returnStatus = 0; returnStatus = start(); if (!returnStatus) { returnStatus = sendAddress(SLA_W(addr)); } if (returnStatus) { if(returnStatus == 1) { return -1; } else { return 0; // no response } } stop(); return 1; }
void I2C::scan() { uint16_t tempTime = timeOutDelay; timeOut(80); uint8_t totalDevicesFound = 0; Serial.println("Scanning for devices...please wait"); Serial.println(); for(uint8_t s = 0; s <= 0x7F; s++) { returnStatus = 0; returnStatus = start(); if(!returnStatus) { returnStatus = sendAddress(SLA_W(s)); } if(returnStatus) { if(returnStatus == 1) { Serial.println("There is a problem with the bus, could not complete scan"); timeOutDelay = tempTime; return; } } else { Serial.print("Found device at address - "); Serial.print(" 0x"); Serial.println(s,HEX); totalDevicesFound++; } stop(); } if(!totalDevicesFound) { Serial.println("No devices found"); } timeOutDelay = tempTime; }
uint8_t I2C::write(uint8_t address, uint16_t registerAddress, uint8_t data, boolean mode) { returnStatus = 0; returnStatus = start(); if(returnStatus){return(returnStatus);} returnStatus = sendAddress(SLA_W(address)); if(returnStatus) { if(returnStatus == 1){return(2);} return(returnStatus); } if (!mode) returnStatus = sendByte(registerAddress); else { returnStatus = sendByte((registerAddress >> 8) & 0x00FF); returnStatus = sendByte(registerAddress & 0x00FF); } if(returnStatus) { if(returnStatus == 1){return(3);} return(returnStatus); } returnStatus = sendByte(data); if(returnStatus) { if(returnStatus == 1){return(3);} return(returnStatus); } returnStatus = stop(); if(returnStatus) { if(returnStatus == 1){return(7);} return(returnStatus); } return(returnStatus); }