Example #1
0
  byte Fastwire::write(byte device, byte address, byte value)
  {
    byte twst,retry;

    retry=2;
    do
    {
      TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO) | (1<<TWSTA)   ; 
      if (!waitInt()) return 1;
      twst=TWSR & 0xF8;
      if (twst != TW_START && twst != TW_REP_START) return 2;

      TWDR = device&0xFE; // send device address without read bit (1)
      TWCR = (1<<TWINT) | (1<<TWEN);
      if (!waitInt()) return 3;
      twst=TWSR & 0xF8;
    } 
    while (twst == TW_MT_SLA_NACK && retry-- > 0);
    if (twst != TW_MT_SLA_ACK) return 4;


    TWDR = address; // send data to the previously addressed device
    TWCR = (1<<TWINT) | (1<<TWEN);
    if (!waitInt()) return 5;
    twst=TWSR & 0xF8;
    if (twst != TW_MT_DATA_ACK) return 6;

    TWDR = value; // send data to the previously addressed device
    TWCR = (1<<TWINT) | (1<<TWEN);
    if (!waitInt()) return 7;
    twst=TWSR & 0xF8;
    if (twst != TW_MT_DATA_ACK) return 8;

    return 0;
  }
Example #2
0
  byte Fastwire::readBuf(byte device,byte address,byte *data,byte num)
  {
    byte twst,retry;

    retry=2;
    do
    {
      TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO)  | (1<<TWSTA)  ; 
      if (!waitInt()) return 16;
      twst=TWSR & 0xF8;
      if (twst != TW_START && twst != TW_REP_START) return 17;


      TWDR = device & 0xfe; // send device address to write
      TWCR = (1<<TWINT) | (1<<TWEN);
      if (!waitInt()) return 18;
      twst=TWSR & 0xF8;
    } 
    while (twst == TW_MT_SLA_NACK && retry-- > 0);
    if (twst != TW_MT_SLA_ACK) return 19;

    TWDR = address; // send data to the previously addressed device
    TWCR = (1<<TWINT) | (1<<TWEN);
    if (!waitInt()) return 20;
    twst=TWSR & 0xF8;
    if (twst != TW_MT_DATA_ACK) return 21;




    /***/

    retry=2;
    do
    {
      TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO) | (1<<TWSTA)  ; 
      if (!waitInt()) return 22;
      twst=TWSR & 0xF8;
      if (twst != TW_START && twst != TW_REP_START) return 23;

      TWDR = device|0x01; // send device address with the read bit (1)
      TWCR = (1<<TWINT) | (1<<TWEN);
      if (!waitInt()) return 24;
      twst=TWSR & 0xF8;
    } 
    while (twst == TW_MR_SLA_NACK && retry-- > 0);
    if (twst != TW_MR_SLA_ACK) return 25;

    for(uint8_t i=0;i<num;i++)
    {
      if (i==num-1)
        TWCR = (1<<TWINT) | (1<<TWEN) ;
      else
        TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
      if (!waitInt()) return 26;
      twst=TWSR & 0xF8;
      if (twst != TW_MR_DATA_ACK && twst != TW_MR_DATA_NACK) return twst;
      data[i]=TWDR;
    }

    return 0;

  }
byte Fastwire::readBuf(byte device,byte address,byte *data,byte num)
{
  unsigned long t=micros();
  byte twst,retry;

  retry=2;
  do
  {
    
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO)  | (1<<TWSTA)  ; 
    if (!waitInt()) return 16;

    t=micros()-t;
    Serial.print("duration1:");
    Serial.println(t);
    t=micros();
    
    twst=TWSR & 0xF8;
    if (twst != TW_START && twst != TW_REP_START) return 17;

    t=micros()-t;
    Serial.print("duration2:");
    Serial.println(t);
    t=micros();

    TWDR = device & 0xfe; // send device address to write
    TWCR = (1<<TWINT) | (1<<TWEN);
    if (!waitInt()) return 18;
    twst=TWSR & 0xF8;
    
    t=micros()-t;
    Serial.print("duration3:");
    Serial.println(t);
    t=micros();
  } 
  while (twst == TW_MT_SLA_NACK && retry-- > 0);
  if (twst != TW_MT_SLA_ACK) return 19;
  
  t=micros()-t;
  Serial.print("duration4:");
  Serial.println(t);
  t=micros();
    
  TWDR = address; // send data to the previously addressed device
  TWCR = (1<<TWINT) | (1<<TWEN);
  if (!waitInt()) return 20;
  
  t=micros()-t;
  Serial.print("duration5:");
  Serial.println(t);
  t=micros();
  
  twst=TWSR & 0xF8;
  if (twst != TW_MT_DATA_ACK) return 21;

  t=micros()-t;
  Serial.print("duration6:");
  Serial.println(t);
  t=micros();

  /***/
  t=micros();
  retry=2;
  
  do{
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO) | (1<<TWSTA)  ; 
    if (!waitInt()) return 22;
    twst=TWSR & 0xF8;
    if (twst != TW_START && twst != TW_REP_START) return 23;

    TWDR = device|0x01; // send device address with the read bit (1)
    TWCR = (1<<TWINT) | (1<<TWEN);
    if (!waitInt()) return 24;
    twst=TWSR & 0xF8;
  }while (twst == TW_MR_SLA_NACK && retry-- > 0);
  
  t=micros()-t;
  Serial.print("duration7:");
  Serial.println(t);
  t=micros();
  
  if (twst != TW_MR_SLA_ACK) return 25;

  for(uint8_t i=0;i<num;i++)
  {
    if (i==num-1)
      TWCR = (1<<TWINT) | (1<<TWEN) ;
    else
      TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
    if (!waitInt()) return 26;
    twst=TWSR & 0xF8;
    if (twst != TW_MR_DATA_ACK && twst != TW_MR_DATA_NACK) return twst;
    data[i]=TWDR;
  }
  
  t=micros()-t;
  Serial.print("duration8:");
  Serial.println(t);

  return 0;

}