Forum: FPGA, VHDL & Co. De0-Nano Accelerometer: keine Antwort


von Michael (Gast)


Angehängte Dateien:

Lesenswert?

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 :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von Lattice User (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
von Michael (Gast)


Lesenswert?

0x1D ist die Adresse des Chips.
Das zu lesende Register steht in data_wr und ist 0x32.

von Mikse (Gast)


Lesenswert?

Hi,

mann muss noch das DATA-Format setzen Datenblatt seite 26 Register 31

von Lattice User (Gast)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.