C AT42QT2120 -> GPIO

*Update*
-> Habe den Chip endlich mal erreichen können. Die Aktuelle Adresse auf die er reagiert lautet 56Dez.

Wieso ist das so? Das ist laut Datenblatt (0x1C) 1 x nach rechts verschoben.
 
*Update*
-> Habe den Chip endlich mal erreichen können. Die Aktuelle Adresse auf die er reagiert lautet 56Dez.

Wieso ist das so? Das ist laut Datenblatt (0x1C) 1 x nach rechts verschoben.

Hallo Jan,

in der ersten Antwort hatte ich dir schon geschrieben dass 0x38 als Adress+R/nW übertragen werden muss,
das entspricht 56d.

Dann hatte ich es noch mal genauer erklärt ...
Du möchtest doch eigentlich schreiben. Das WriteBit ist 0. Die Adresse ist 0x1C (28d)

0x1C+W = 0b00111000
= 0x38 (56d)

0x1C 1x nach rechts verschoben ist nicht 56d.
und wieso nach rechts?

0x1C ist die 7bit I2C Adresse.

In deiner twi_write Funktion musst du dies übertragen
twi->MASTER.ADDR = slave_addr<<1;
wenn slave_addr die 7bit I2C Adresse ist.

Es stimmt also mit 0x38 (56d) für Adresse + R/nW Bit.

Dirk :ciao:
 
Ja okay.
Woher aber weiß ich, dass das ich das nach links shiften muss? Woran erkenne ich das? Im Datenblatt habe ich davon nichts gelesen?
 
Woher aber weiß ich, dass das ich das nach links shiften muss? Woran erkenne ich das? Im Datenblatt habe ich davon nichts gelesen?

Im Datenblatt wird davon auch nicht drin stehen.

Die I2C Adresse ist 7bit "groß".

Das Adressregister ADDR des Mikrocontrollers erwartet diese Adresse auf den Bitpositionen 7..1
Auf Bitposition 0 ist das ReadWriteBit. Soll geschrieben werden ist das R/nW Bit 0.

Schaue in das Datenblatt des Xmega Mikrocontrollers (wahrscheinlich unter Register Description bei I2C), da wird das stehen.

twi->MASTER.ADDR = slave_addr<<1;

Wenn geschrieben werden soll, ist R/nW = 1...

twi->MASTER.ADDR = (slave_addr<<1) | 1;
 
Wenn ich jetzt einen I2C Scanner basteln möchte, welche Möglichkeit hätte ich da?
Könnte ich ein RepStart anwenden und das Statusregister auslesen vom xMega?



CodeBox C
Bit 4 – RXACK: Received Acknowledge
This flag contains the most recently received acknowledge bit from the slave. This is a read-only flag. When read
as zero, the most recent acknowledge bit from the slave was ACK, and when read as one the most recent
acknowledge bit was NACK.


Wäre das eine gute Idee? Um mal eben schnell den Bus zu scannen..
 
Woher aber weiß ich, dass das ich das nach links shiften muss? Woran erkenne ich das? Im Datenblatt habe ich davon nichts gelesen?
Weil wir Dir bereits mehrfach gesagt haben, daß die 7Bit linksorientiert gesendet werden müssen, und wo man das im Datenblatt ableiten kann:
Der wesentliche Hinweis findet sich in "Section A auf Seite 41" des Datenblattes, genauer A.4

Wenn ich jetzt einen I2C Scanner basteln möchte, welche Möglichkeit hätte ich da?
Könnte ich ein RepStart anwenden und das Statusregister auslesen vom xMega?
Hatte ich bereits hier angedeutet:
Als vorhergehenden Schritt könnte man auch nur die Adresse sen.den (mit Start, klar), und prüfen, ob der Touch-IC überhaupt ein ACK liefert.
Kannste natürlich auf ein Programm ausdehnen, welches alle 127 möglichen Adressen durchleiert
 
Danke an alle.
Jetzt klappt das lesen nicht..
Habe mit dem xMega noch nie I2C (TWI) gesprochen..

Mache ich was falsch von der Reinfolge her?


CodeBox C

TWIC_MASTER_ADDR = SLAVE_ADDRESS | 0x01;//Send Slave Add Read Bit


while(!(TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm));



TWIC_MASTER_DATA = 0x00; // Read Data @ Address "0"


while(!(TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm));



x = TWIC_MASTER_DATA;

TWIC_MASTER_CTRLC = TWI_MASTER_ACKACT_bp | TWI_MASTER_CMD_STOP_gc;
 
Hallo Dirk.

Die Adresse habe ich im #define schon so hinterlegt.



CodeBox C
#define SLAVE_ADDRESS (0x1C<<1)
 
Ich denke du musst zunächst erst einmal das Register adressieren und danach lesen.

Im obigen Code möchtest du lesen (Read Write Bit = 1) und schreibst in das TWI Datenregister 0,
das geht so nicht.

Prinzipiell sollte so ...
Versuche einmal die ChipID zu lesen (Register Adresse 0, Wert 0x3E)

Register Adresse
START
SLA+W
ACK
0x00 (Adresse)
ACK
STOP

Daten lesen
START
SLA+R
ACK
Datenbyte von RegAdresse 0 lesen (sollte 0x3E sein)
nACK
STOP
 
Probiere dies mal ...



CodeBox C
define SLAVE_ADDRESS 0x1C

//...

uint8_t data;

data = ReadRegister(0x00, SLAVE_ADDRESS);

// data müsste 0x3E sein

//...


uint8_t ReadRegister(uint8_t register, uint8_t slave_addr)
{

   TWIC_MASTER_ADDR = (slave_addr<<1);  // schreiben
   while(!(TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm)); 
                       
   TWIC_MASTER_DATA = register;         
   while(!(TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm));
     
   TWIC_MASTER_ADDR = (slave_addr<<1) | 1;  // lesen
   while(!(TWIC_MASTER_STATUS & TWI_MASTER_RIF_bm));
   
   TWIC_MASTER_CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
   
   return TWIC_MASTER_DATA;
}
 
Habe ich.
LED Toggelt... Das darf sie ja nicht. Wert müsste 0x3e sein



CodeBox C
/* Read from Register "0" */


IsStart = 1; // Start Condition (Flag for Routine)


TWI_WriteByte(SLAVE_ADDRESS);

TWI_WriteByte(0x00);

TWI_Stop();



IsStart = 1; // Start Condition (Flag for Routine)


TWI_WriteByte(SLAVE_ADDRESS | 0x01);

x = TWI_ReadByte(1); // 1 = Nack


TWI_Stop();



if (x == 0)

toggleled();
 
Damit klappt es.
 
Zuletzt bearbeitet:
Ok, das sind jetzt wieder neue Funktionen, die kenne ich noch nicht.

Soweit siehts gut aus, aber Funktionen, hmmm.

Probiere mal meine Version im Beitrag zuvor.
 
Funktioniert jetzt.
Danke!
 
Probiere dies mal ...



CodeBox C
define SLAVE_ADDRESS 0x1C

//...

uint8_t data;

data = ReadRegister(0x00, SLAVE_ADDRESS);

// data müsste 0x3E sein

//...


uint8_t ReadRegister(uint8_t register, uint8_t slave_addr)
{

   TWIC_MASTER_ADDR = (slave_addr<<1);  // schreiben
   while(!(TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm));
                      
   TWIC_MASTER_DATA = register;        
   while(!(TWIC_MASTER_STATUS & TWI_MASTER_WIF_bm));
    
   TWIC_MASTER_ADDR = (slave_addr<<1) | 1;  // lesen
   while(!(TWIC_MASTER_STATUS & TWI_MASTER_RIF_bm));
  
   TWIC_MASTER_CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
  
   return TWIC_MASTER_DATA;
}

Ich kann die GPIO´s etc. beschreiben. Wenn ich lesen von der Adresse "0x00" lesen will bekomme ich lediglich nur eine "0x01" wieder.

Was kann das sein?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)