www.mikrocontroller.net

Forum: Codesammlung Frage zur I2C Adressierung QT1070


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: AleX A. (highfly3r)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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/Pr...

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
i2c_init();                                // init I2C interface
ret = i2c_start(0x1B+I2C_WRITE);       // set device address and write mode
if ( ret ) {
  /* failed to issue start condition, possibly no device found */
  i2c_stop();
  PORTB=0x00;      // activate all 8 LED to show error */
}
else {
  i2c_stop();
  i2c_start(0x03+I2C_READ);
  input = i2c_readAck();
}

als retval bekomme ich immer eine 1 geliefert.
>> Auszug aus twimaster.c
/*************************************************************************  
  Issues a start condition and sends address and transfer direction.
  return 0 = device accessible, 1= failed to access device
*************************************************************************/
unsigned char i2c_start(unsigned char address)
{
  uint8_t   twst;

  // send START condition
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

  // wait until transmission completed
  while(!(TWCR & (1<<TWINT)));

  // check value of TWI Status Register. Mask prescaler bits.
  twst = TW_STATUS & 0xF8;
  if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;

  // send device address
  TWDR = address;
  TWCR = (1<<TWINT) | (1<<TWEN);

  // wail until transmission completed and ACK/NACK has been received
  while(!(TWCR & (1<<TWINT)));

  // check value of TWI Status Register. Mask prescaler bits.
  twst = TW_STATUS & 0xF8;
  if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;

  return 0;
}
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.

Autor: Torsten S. (tse)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: AleX A. (highfly3r)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net