Datum:
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.
Datum:
> 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?
Datum:
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...