Hallo, Zuerst erst mal ich habe noch nicht viel Erfahrung mit VHDL, aber ich dachte mir, ich spiel mich mal mit dem G-Sensor der das DE0-Nano board drauf hat. Ich will die Kommunikation über I2C machen. Und habe mal die Daten die geschickt werden auf die LEDs gelegt. Doch mein Problem ist, dass ich keine Daten bekomme. die LEDs sind immer dunkel. Ich habe mein Programm und das I2C Modul angehängt. Vielleicht kann mir da jemand Helfen. Danke im vorraus :)
Michael schrieb: > Doch mein Problem ist, dass ich keine Daten bekomme. Hast du ein Oszilloskop oder enen Logicanalyzer? > Ich habe mein Programm und das I2C Modul angehängt. Funktioniert das Zeug? Hast du das mal simuliert? Die "Testbench" hier ist ja relativ einfach: mal einen Takt an GSENSOR CLK sowie jeweils 'H' an I2C_SCLK und I2C_SDAT anlegen und schauen, was passiert... > das I2C Modul angehängt. Das Modul ist Käse: unnötigerweise 2 Takte. Und zudem sowas:
1 | PROCESS(data_clk, reset_n) |
2 | BEGIN
|
3 | IF(reset_n = '0') THEN --reset asserted |
4 | ----
|
5 | ELSIF(data_clk'EVENT AND data_clk = '1') THEN |
6 | ----
|
7 | END IF; |
8 | |
9 | IF(reset_n = '0') THEN --reset asserted |
10 | ----
|
11 | ELSIF(data_clk'EVENT AND data_clk = '0') THEN |
12 | ----
|
13 | END IF; |
14 | END PROCESS; |
Steigende und fallende Flanke in einen Prozess reingematscht. Unübersichtlicher gehts kaum noch. > Ich habe mein Programm Es ist kein Programm, denn es heißt nicht "VHPL"... > I2C_SCLK ... I2C_SDAT Beim I2C heißen diese Signale immer SDA und SCL. > stage "Stage" bedeutet "Bühne, Theater..." Du meinst vermutlich "State" was u.a. "Zustand" heißt.
:
Bearbeitet durch Moderator
Wo hast du das I2C Module her, selbstgemacht? Ich habe es nicht ins letzte Detail angeschaut, aber ich sehe nicht wo die I2C-Startcondition erzeugt wird.
Danke für die schnelle Antworten: Nein, das I2C Module ist nicht bin mir, ich habs von http://www.eewiki.net/display/LOGIC/I2C+Master+(VHDL) herunter geladen. Mit keine Daten bekommen hab ich gemeint, dass die LEDs alle nichts anzeigen Ich hab das I2C Module nicht direkt getestet, aber wenn ich das Register 0x00 auswähle sendet er mir die Device ID ("11100101") zurück. Also sendet er im prinzip. Nur halt nicht die Daten für X,Y und Z. I2C_SCLK verbinde ich zu scl und I2C_SDAT zu sda, dann ist doch die Namensgebung egal, oder? hoppla, stage war ein tippfehler, der sich dann durchzog :) PS: Weil ich das zum Posten vergessen hab: der Accelerometer ist ein ADXL345
Michael schrieb: > I2C_SCLK verbinde ich zu scl und I2C_SDAT zu sda, dann ist doch die > Namensgebung egal, oder? Im Prinzip ja, aber es ist unnötig, die "quasigenormten" Signale umzubenennen... Solltest du statt von Adresse 0x1D nicht eher an der Adresse 0x32 und folgende zu lesen versuchen? Siehe Datenblatt Tabelle 19.
:
Bearbeitet durch Moderator
0x1D ist die Adresse des Chips. Das zu lesende Register steht in data_wr und ist 0x32.
Hi, mann muss noch das DATA-Format setzen Datenblatt seite 26 Register 31
Mikse schrieb: > Hi, > > mann muss noch das DATA-Format setzen Datenblatt seite 26 Register 31 Der Resetwert ist allerdings für den Anfang brauchbar. In POWER_CTL (Register 0x2D): Measure Bit A setting of 0 in the measure bit places the part into standby mode, and a setting of 1 places the part into measurement mode. The ADXL345 powers up in standby mode with minimum power consumption. Ausserdem: It is recommended that a multiple-byte read of all registers be performed to prevent a change in data between reads of sequential registers. Es ist schwer zu sehen was der I2C Core kann, aber ich vermute stark dass damit mit jedem Zugriff nur ein Byte gelesen werden kann. Jede Zeile zu kommentieren ist kein Ersatz für eine gute Dokumentation, weniger ist oft mehr, denn zuviel verstellt den Blick aufs Wesentliche.
Hey, Danke für die ganzen antworten, wir kommen der Sache näher :) Ich hab jetzt den Code abgeändert und POWER_CTL und DATA_FORMAT berücksichtigt. Wenn ich nun 0x32 bzw 0x33 abfrage erhalte ich "1000011". Hier ist der neue Ablauf:
1 | process(busy) |
2 | begin
|
3 | if rising_edge(busy) then |
4 | stage <= stage +1; |
5 | end if; |
6 | if stage = 0 then |
7 | ena <= '1'; |
8 | addr <= "0011101"; |
9 | -- POWER_CONTROL
|
10 | rw <= '0'; |
11 | data_wr <= x"2D"; |
12 | elsif stage = 1 then |
13 | data_wr <= x"08"; |
14 | elsif stage = 2 then |
15 | -- DATA_FORMAT
|
16 | rw <= '0'; |
17 | data_wr <= x"31"; |
18 | elsif stage = 3 then |
19 | data_wr <= x"40"; |
20 | elsif stage = 4 then |
21 | -- DATA_READ
|
22 | data_wr <= x"32"; |
23 | elsif stage = 5 then |
24 | rw <= '1'; |
25 | elsif stage = 6 then |
26 | ena <= '0'; |
27 | if busy = '0' then |
28 | output <= data_rd; |
29 | end if; |
30 | end if; |
31 | end process; |
Lg, Michael
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.