Hallo,
um meine Schaltung und Platinenlayout zu prüfen, habe ich den AT42QT1070
an einen STM32F4 Discovery angeschaltet.
Beschaltung (mehrfach geprüft/gemessen)
Discovery -> AT42Qt1070
GND -> Pin2 & Pin14
+3V -> Pin1 (100n Blockkondensator in unmittelbarer Nähe zu Pin1&14)
PinB6 -> Pin3 (SDA)
PinB9 -> Pin 6 (SCL)
PinB0 -> Pin 5 (change)
At42Qt Pin4 Floating. Vormals hatte ich Pin4 vom At42 direkt auf +3V
gelegt, habe die Leiterbahn aber unterbrochen, da im Datenblatt immer
ein Widerstand gegen Vdd abgebildet ist (laut Db ist aber eine direkte
Beschaltung kein Problem). Um einen Hardware-Reset durchführen zu
können, werde ich im finalen Layout dann den Widerstand vorsehen.
SDA und SCL habe ich jeweils per 4K7 auf +3V gezogen.
Nach einem anfänglichen Lötfehler (Brücke), der dazu führte das ich kein
EV5 Event bekam, bin ich dann wenigstens über EV5 hinweg gekommen und
beim Debuggen bin ich dann bis zum Senden der 7bit Adresse gelangt.
Folgende Initialisierung nutze ich:
1
voidinitI2C(){
2
GPIO_InitTypeDefGPIO_InitStruct;// this is for the GPIO pins used as I2C1SDA and I2C1SCL
3
I2C_InitTypeDefI2C_InitStruct;// this is for the I2C1 initialization
In der main wird dann folgendes aufgerufen (verschiedene Adressen, um
sicher zu gehen), um einen initialen Software-Reset des AT42
durchzuführen:
1
initI2C();
2
volatileint8_tretValue=writeI2C((0x1B<<1),0x39,0xFF);//reset device; sieht gut auf dem Logik-Analyzer aus (0x36, bit0 = 0, da schreiben)
3
retValue=writeI2C(0x1B,0x39,0xFF);//reset device, nicht schön, 0x1A übertragen wird.
Mein Logikanalyzer (siehe Beispiel als Anhang) sagt mir bei allen
gesendeten Adressen immer, dass kein ACK erfolgt. Im Programm geht er
auch auf einen Timeout bei "-2", also kein Event nach dem Senden der
Adresse.
Nachdem quasi nichts funktioniert, habe ich mal die Spannungen am AT42
gemessen:
Pin1 ~2,95V
Pin3 ~2,25V
Pin6 ~2,25V
Evtl. sind 4k7 zuviel. Ich werde morgen mal 1K ausprobieren.
Hat irgend jemand eine Idee, was ich falsch mache, bzw. was ich noch
überprüfen kann/sollte?
Besten Dank um voraus.
Jörg
Sorry, beim Schreiben habe ich doch PinB6 und PinB9 miteinander
vertauscht.
Sind aber anders herum beschalten (hatte aber zur Vorsicht mal beide
getauscht und kein anderes Ergebnis bekommen).
Hmm, habe gerade nochmal versucht im Datenblatt zu finden, dass man den
auch nicht beschalten braucht, aber hab nix gefunden.
Werde morgen einen Widerstand anlöten und gleichzeitig einen für Change
einbauen (das geht glücklicherweise einfacher per Breadboard)
Melde mich morgen mit neuen Erkenntnissen.
Vorerst besten Dank bis dahin.
Grüße
Jörg
Nach nochmaligem Lesen fiel mir auf, dass deine Adresse wohl noch um 1
nach links geschoben werden muss. Das R/W-Bit kommt nämlich noch vor dem
NACK, ist aber bei dir Teil der Adresse, oder?
Der AT42 hat die feste Adresse 0x1B.
Da ich gelesen habe, das in der Bibliothek in bestimmten Versionen das
erste Bit (Bit0) überschrieben wird, habe ich in der ersten Zeile die
Adresse um 1 Bit geshiftet. Kein ACK vom Device, daher der Test der
zweiten Zeile ohne Shift. Aber auch hier kein ACK.
So, habe heute mal 1K für SDA und SCL genutzt. Damit komme ich dann an
den Pins auf 2,7V bei Vdd 2,95V.
Pin4 (/RESET) des AT42 hab ich per 10K auf Vdd gezogen. Messe dort auch
~2,7V. /CHANGE habe ich auf floating gelassen.
Anbei die Versuche mit verschiedenster Adressierung.
Keine Antwort. Vielleicht ist der Chip übern Jordan. Muss mal schauen ob
ich noch einen rum liegen habe.
Es sei denn, ich hab noch immer einen Schnitzer in meiner Anwendung?
Gruß
Jörg
Bei den beiden linken Bildern ist die Adresse jetzt richtig.
Im Datenblatt ist in allen Beispielschaltungen extern immer ein Pullup
am Reset. Bevor du den Chip auslötest, würde ich vorschlagen, diesen
Widerstand auch nochmal extern dran zu hängen. Vielleicht ist es ja doch
das Problem, auch wenn im Datenblatt ein interner Pullup erwähnt wird.
Ansonsten ist mir leider nichts aufgefallen, was den Fehler produzieren
könnte.
Okay, dann ist es wohl der Chip. Hatte ja wie geschrieben den /Reset
auf Vdd per 10k gezogen und geprüft.
Schade, ist schwierig an die Dinger zu kommen....
Hier gibt es ein Tutorial:
http://diller-technologies.de/stm32.html#i2c_config
Da wird das noch gesetzt: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |
RCC_APB2Periph_AFIO, ENABLE);
Und die NVIC-Routinen sehe ich auch nicht bei Dir.
Pete K. schrieb:> Hier gibt es ein Tutorial:> http://diller-technologies.de/stm32.html#i2c_config>> Da wird das noch gesetzt: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |> RCC_APB2Periph_AFIO, ENABLE);>> Und die NVIC-Routinen sehe ich auch nicht bei Dir.
Das Tutorial bezieht sich auf einen anderen stm32. Die Unterschiede
können wie bei Diller erwähnt nicht unerheblich sein. Gerade bei den
clocks...
Nichts desto trotz prüfe ich mal, ob die nvic Routinen möglich und
sinnvoll sein könnten.