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.