Hallo zusammen, ich bin momentan dabei eine Platine in Betrieb zu nehmen. Auf dieser befindet sich ein XMega192A3 (I2C Master) und zwei Signalprozessoren. Einen von Texas Instruments, welcher als I2C/TWI-Slave angesprochen werden kann, und einer der den (lesenden) Zugriff per I2C vehement verweigert. Es handelt sich bei dem zweiten um einen ADV7611. Die Schaltung habe ich laut Datenblatt aufgebaut (siehe Bild). Die PullUps an den I2C-Leitungen betragen jeweils 2,2kOhm an 3,3V. Das funktioniert mit dem TI-Prozessor einwandfrei. Ich habe auch 4,7k und 10kOhm ohne Erfolg beim Zugriff auf den ADV7611 getestet. Ein lesender Zugriff auf die Adresse 0x98 (default siehe Datenblatt ADV7611 UG-180, Rev. B S.173 mit 0x99 als "leseadresse") ist schlicht nicht möglich. Der XMega meldet bei jedem lesen ein NACK auf dem Bus. Als Software verwende ich den TWI-Master-Driver von Atmel aus der Application Note AVR1308: Using the XMEGA TWI in der Version 1569. Zur Initialisierung resette ich den ADV7611, indem ich den RESET-Pin für 10ms auf 0V setze und darauf hin wieder 3V3. Darauf hin folgt eine Sequenz von Schreibvorgängen in verschiedene Register der IO-Adresse 0x98 (laut Paper: ADV7611 Recommended Register Settings Rev. 1.4 S.4). Zudem setze ich Register 0x04 die Frequenz auf 24,567 MHz (Datenblatt ADV7611_UG-180.pdf S.19) bzw. wird diese Änderung nicht angenommen da der Zugriff auf den Baustein ja nicht möglich ist. Im Bild (Beschaltung des ADV7611) ist ein 28,63636MHz und zwei 47pF Kondensatoren zu sehen. Allerdings verwende ich einen 24,567MHz mit zwei mal 15pF. Das Quarz ist in der Liste der möglichen Frequenzen im Datenblatt angegeben und die Kondensatoren sind laut Datenblatt berechnet (Datenblatt ADV7611 UG-180, Rev. B S.178). An den Leitungen XTALN/P des Prozessors messe ich mit dem Multimeter eine Spannung von jeweils (etwa) 0,68V, was in etwa den Spannungen entsprechend welche ich am Quarz des anderen Ti-DSP gemessen habe (ich weiß, ist leider nicht sonderlich aussagekräftig). Ein entsprechendes Oszilloskop steht mir leider momentan nicht zur Verfügung. Elektrisch gesehen habe ich jedoch Kurzschlüsse oder Fehler in der Schaltung soweit möglich ausgeschlossen. Der Chip sitzt auf einer kleinen 4Layer Paltine mit kurzen Leitungswegen zwischen den Bauteilen usw... (http://1.bp.blogspot.com/-jhBLEBkuqmE/Ut10mCfFIJI/AAAAAAAAAMU/K2e0BKf1-bM/s1600/alle_bauteile_verloetet.png) Ich hoffe jemand von Euch kann mir einen Tipp geben was hier schief läuft oder ich schlicht vergessen habe um das Bauteil zum laufen zu bringen. Danke! Kai
:
Bearbeitet durch User
Hallo nochmal, hier ein kurzer Zwischenstand... Das ADV7611 scheint bei der Kommunikation per I2C im Lesevorgang etwas anders als vom I2C-Standard erwartet zu arbeiten, siehe [1]. Da ich (wie im vorherigen Post bereits beschreiben) den TWI-Master-Driver von Atmel verwende frage ich mich nun wie ich diesen dazu bringen die Kommunikation auf die benötigte Weise zu modifizieren. Der Code hierzu stammt von Atmel und wird mit den entsprechenden Parametern für lesende und schreibende Zugriffe verwendet. Ich sehe hier momentan keine Möglichkeit in die Kommunikation auf dem Bus tiefer einzugreifen. Ich hoffe weiter auf Tipps und Anregungen/Ideen zu meinem Problem. Danke! ---
1 | bool TWI_MasterWriteRead(TWI_Master_t *twi, |
2 | uint8_t address, |
3 | uint8_t *writeData, |
4 | uint8_t bytesToWrite, |
5 | uint8_t bytesToRead) |
6 | { |
7 | /*Parameter sanity check. */ |
8 | if (bytesToWrite > TWIM_WRITE_BUFFER_SIZE) { |
9 | return false; |
10 | } |
11 | if (bytesToRead > TWIM_READ_BUFFER_SIZE) { |
12 | return false; |
13 | } |
14 | |
15 | /*Initiate transaction if bus is ready. */ |
16 | if (twi->status == TWIM_STATUS_READY) { |
17 | |
18 | twi->status = TWIM_STATUS_BUSY; |
19 | twi->result = TWIM_RESULT_UNKNOWN; |
20 | |
21 | twi->address = address; |
22 | |
23 | /*char tmp[14]; |
24 | sprintf(tmp,"1> 0x%02x\r\n", address); |
25 | sys_log(tmp);*/ |
26 | |
27 | /* Fill write data buffer. */ |
28 | for (uint8_t bufferIndex=0; bufferIndex < bytesToWrite; bufferIndex++) { |
29 | twi->writeData[bufferIndex] = writeData[bufferIndex]; |
30 | } |
31 | |
32 | twi->bytesToWrite = bytesToWrite; |
33 | twi->bytesToRead = bytesToRead; |
34 | twi->bytesWritten = 0; |
35 | twi->bytesRead = 0; |
36 | |
37 | /* If write command, send the START condition + Address + |
38 | * 'R/_W = 0' |
39 | */ |
40 | if (twi->bytesToWrite > 0) { |
41 | uint8_t writeAddress = twi->address & ~0x01; |
42 | twi->interface->MASTER.ADDR = writeAddress; |
43 | /*sprintf(tmp,"2> 0x%02x\r\n", writeAddress); |
44 | sys_log(tmp);*/ |
45 | } |
46 | |
47 | /* If read command, send the START condition + Address + |
48 | * 'R/_W = 1' |
49 | */ |
50 | else if (twi->bytesToRead > 0) { |
51 | uint8_t readAddress = twi->address | 0x01; |
52 | twi->interface->MASTER.ADDR = readAddress; |
53 | /*sprintf(tmp,"3> 0x%02x\r\n", readAddress); |
54 | sys_log(tmp);*/ |
55 | } |
56 | return true; |
57 | } else { |
58 | return false; |
59 | } |
60 | } |
[1]: http://ez.analog.com/message/77452#77452
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.