HUBTEXT int  i2c_in(i2c *bus, int i2cAddr, 
                     const unsigned char *regAddr, int regSize, 
                     unsigned char *data, int count)
{
  int n  = 0;
  i2cAddr &= -2;                                        // Clear i2cAddr.bit0 (write)
  i2c_start(bus);
  if(regSize) 
  {
    if(i2c_writeByte(bus, i2cAddr)) return n; else n++;
    n += i2c_writeData(bus, regAddr, regSize);
  }
  i2cAddr |= 1;                                       // Set i2cAddr.bit0 (read)
  i2c_start(bus);
  if(i2c_writeByte(bus, i2cAddr)) return n; else n++;
  n += i2c_readData(bus, data, count);
  i2c_stop(bus);
  return n;  
}
Example #2
0
HUBTEXT int  i2c_in(i2c *busID, int i2cAddr, 
                     int memAddr, int memAddrCount, 
                     unsigned char *data, int dataCount)
{
  int n  = 0;
  i2cAddr <<= 1;
  i2cAddr &= -2;                                        // Clear i2cAddr.bit0 (write)
  i2c_start(busID);
  if(i2c_writeByte(busID, i2cAddr)) return n; else n++;
  if(memAddrCount) 
  {
    int m;
    if(memAddrCount)
    {
      if(memAddrCount > 0)
      {
        endianSwap(&m, &memAddr, memAddrCount);
      }  
      else 
      {
        m = memAddr;
        memAddrCount = - memAddrCount;
      }  
      n += i2c_writeData(busID, (unsigned char*) &m, memAddrCount);
    }  
  }  
  i2cAddr |= 1;                                       // Set i2cAddr.bit0 (read)
  i2c_start(busID);
  if(i2c_writeByte(busID, i2cAddr)) return n; else n++;
  n += i2c_readData(busID, data, abs(dataCount));
  i2c_stop(busID);
  if(dataCount < 0)
  {
    dataCount = -dataCount;
    char temp[dataCount];
    memcpy(temp, data, dataCount);
    endianSwap(data, temp, dataCount);
  }
  return n;  
}