Hallo,
ich möchte einen ADC vom Typ MCP3008 per SPI ansprechen. Dazu benutze
ich folgenden Prozess, um eine Kommunikation zu erreichen, wie sie in
FIGURE 6.1 auf Seite 21 des Datenblatts zu sehen ist:
1 | process(fxclk_signal)
|
2 | variable delay_counter0 : integer := 0;
|
3 | begin
|
4 | if rising_edge(fxclk_signal) then
|
5 | case state is
|
6 |
|
7 | when 0 =>
|
8 | TX_Data0_signal <= "000000011000000000000000";
|
9 | TX_Start0_signal <= '1';
|
10 | lsi_in_strobe_signal <= '0';
|
11 | if TX_Done0_signal = '1' then
|
12 | state <= 1;
|
13 | end if;
|
14 |
|
15 | when 1 =>
|
16 | TX_Start0_signal <= '0';
|
17 | state <= 2;
|
18 |
|
19 | when 2 =>
|
20 | TX_Start0_signal <= '1';
|
21 | if TX_Done0_signal = '1' then
|
22 | state <= 3;
|
23 | end if;
|
24 |
|
25 | when 3 =>
|
26 | TX_Start0_signal <= '0';
|
27 | state <= 4;
|
28 |
|
29 | when 4 =>
|
30 | TX_Start0_signal <= '1';
|
31 | if TX_Done0_signal = '1' then
|
32 | state <= 5;
|
33 | end if;
|
34 |
|
35 | when 5 =>
|
36 | led2(9 downto 0) <= RX_Data0_signal(9 downto 0);
|
37 | lsi_out_data_signal(9 downto 0) <= RX_Data0_signal(9 downto 0);
|
38 | lsi_out_adress_signal <= std_logic_vector(to_unsigned(0, 8));
|
39 | --lsi_in_strobe_signal <= '1';
|
40 | TX_Start0_signal <= '0';
|
41 | state <= 6;
|
42 |
|
43 | -- delay
|
44 | when 6 =>
|
45 | if delay_counter0 = delay0 then
|
46 | delay_counter0 := 0;
|
47 | state <= 0;
|
48 | else
|
49 | delay_counter0 := delay_counter0 + 1;
|
50 | end if;
|
51 |
|
52 | when others =>
|
53 |
|
54 | end case;
|
55 | end if;
|
56 | end process;
|
Ich habe noch nicht ganz begriffen, wie genau die SPI-Schnittstelle des
MCP3008 arbeitet, insbesondere, weil es anscheinend einen Modus gibt,
bei dem eine Abfrage 24 Takte braucht und einen, bei dem es 16 sind.
Egal, ich habe das mit 24 Takten versucht: Hier wird also
"000000011000000000000000" zum MCP3008 geschoben. Die erste '1' ist das
Startbit. Die folgenden Bits '1000' bewirkt, dass Channel 0 single-ended
abgerufen wird. Das funktioniert auch alles einigermaßen. Allerdings ist
folgendes Problem aufgetreten: Ich habe versucht, in den Prozess direkt
dahinter eine weitere Abfrage eines anderen Channels einzubauen, also
die Anzahl der states verdoppelt und beim zweiten Durchlauf einfach die
Bits angepasst. Es sollte also immer nacheinander ...Ch0-Ch1-Ch0-Ch1...
abgefragt werden. Komischerweise kam dabei aber die Abfragesequenz
...Ch0-Ch0-Ch1-Ch0-Ch0-Ch1... raus. Ich hab absolut nicht verstanden,
wie das sein kann. Deshalb habe ich das ganze wieder auf eine einzige
sich wiederholdende Abfrage reduziert und hinter die Abfrage mit einem
counter ein delay gesetzt. Auch hier zeigt sich ein Fehler. Er ist aus
den angehängten screenshots vom LA ersichtlich: Auf dem ersten Bild ist
eine Abfrage zu sehen. Das Funktioniert grundsätzlich. Auf dem zweiten
Bild habe ich etwas herausgezoomt. Man man sieht, dass nach jedem
zweiten Durchlauf der delay nicht greift. Das kann ich mir nicht
erklären, aber ich vermute, dass es die selbe Ursache hat wie mein
Problem bei zwei Abfragen hintereinander. Was mach ich falsch?
VG