Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}
Пример #8
0
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;
}
Пример #9
0
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;
}
Пример #10
0
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);
}