Forum: Projekte & Code Frage zur I2C Adressierung QT1070


von AleX A. (highfly3r)


Lesenswert?

Hallo an alle,

ich habe den Touch-IC AT42QT1070 von Atmel.
http://www.atmel.com/Images/doc9596.pdf

Seine Adresse ist fest vorgegeben (0x1B == 0b00011011), welche nicht 
verändert werden kann.
Laut Datenblatt auf Seite 15 muss ich die Slave-Adresse plus R/W-Bit via 
I2C schicken.
Num meine Frage:
Muss ich dazu die Adresse erst um 1 Bit nach links schieben und 
anschließend das Byte mit dem R/W-Bit "verodern"?
Die Idee dazu kam aus dem Beispiel zur Ansteuerung eines Port-Expanders.
http://www.mikrocontroller.net/mc-project/Pages/Projekte/ICs/Port%20Expander/Portexpander%20Beispiel.zip

Nach der Lib von Peter Fleury wird die Adresse zum R/W-Bit addiert, was 
ich nicht nachvollziehen kann, da das R/W-Bit das 9te lt. Datenblatt 
sein soll.

>> Auszug aus test_i2cmaster.c
1
i2c_init();                                // init I2C interface
2
ret = i2c_start(0x1B+I2C_WRITE);       // set device address and write mode
3
if ( ret ) {
4
  /* failed to issue start condition, possibly no device found */
5
  i2c_stop();
6
  PORTB=0x00;      // activate all 8 LED to show error */
7
}
8
else {
9
  i2c_stop();
10
  i2c_start(0x03+I2C_READ);
11
  input = i2c_readAck();
12
}

als retval bekomme ich immer eine 1 geliefert.
>> Auszug aus twimaster.c
1
/*************************************************************************  
2
  Issues a start condition and sends address and transfer direction.
3
  return 0 = device accessible, 1= failed to access device
4
*************************************************************************/
5
unsigned char i2c_start(unsigned char address)
6
{
7
  uint8_t   twst;
8
9
  // send START condition
10
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
11
12
  // wait until transmission completed
13
  while(!(TWCR & (1<<TWINT)));
14
15
  // check value of TWI Status Register. Mask prescaler bits.
16
  twst = TW_STATUS & 0xF8;
17
  if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
18
19
  // send device address
20
  TWDR = address;
21
  TWCR = (1<<TWINT) | (1<<TWEN);
22
23
  // wail until transmission completed and ACK/NACK has been received
24
  while(!(TWCR & (1<<TWINT)));
25
26
  // check value of TWI Status Register. Mask prescaler bits.
27
  twst = TW_STATUS & 0xF8;
28
  if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
29
30
  return 0;
31
}
Aus dieser Funktion fliege ich durch das letzte "return 1;" raus. Ich 
weiß auch nicht, was die if-Bedingung bewirken soll?

Kann mir vielleicht irgendwer bei diesen Problemen helfen ???
Wäre auf jedenfall sehr dankbar dafür!!!

Ich nutze Testweise einen Atmega32 auf Breadboard mit AVR-Studio 5 und 
JTAGICE3 als Debugger.

von Torsten S. (tse)


Lesenswert?

> Muss ich dazu die Adresse erst um 1 Bit nach links schieben und
> anschließend das Byte mit dem R/W-Bit "verodern"?

ja

> Nach der Lib von Peter Fleury wird die Adresse zum R/W-Bit addiert, was
> ich nicht nachvollziehen kann, da das R/W-Bit das 9te lt. Datenblatt
> sein soll.

Seit wann hat ein Byte 9 Bits?

von AleX A. (highfly3r)


Lesenswert?

Hallo Torsten,

sry, da habe ich mich falsch ausgedrückt. Deutsche Sprache, schwere 
Sprache :-)
Ich weiß nicht aus welchem Timing-Diagramm ich das her habe. 
ursprünglich meinte ich bei dem 9ten SCL-Puls. Aber im Datenblatt steht 
das das RW-Bit mit dem 8. SCL-Puls übertragen wird.

Was ich herausgefunden habe ist, das P. Fleury die Adresse vorher 
schiebt (also mit dem Taschenrechner und dann abgeändert der Funktion 
übergibt), sodass die Addition mit dem RW-Bit natürlich dann auch 
funktioniert.

Auf jedenfall kann ich jetzt diverse Sachen aus dem Speicher des QT1070 
auslesen.

Als nächstes werde ich versuchen den Key-Status via ISR auszulesen.

So denn, schönen Abend noch...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.