Hallo, ich habe mal ein kleines SPI- Modul im Internet gefunden und
leider funktioniert dieses nicht so wie es sollte. Könnte bitte jemand
drüberschauen und mir sagen wo da der Fehler ? :) -Danke
Wenn möglich würde ich es super finden wenn ihr mir den Code auch näher
erläutert denn zu 100% verstehe ich ihn nicht.
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.numeric_std.all;
|
4 |
|
5 | entity spi is
|
6 | Generic (Width : integer := 8);
|
7 | Port ( Clk_i : in STD_LOGIC;
|
8 | Reset_n_i : in STD_LOGIC;
|
9 | Data_i : in STD_LOGIC_vector(Width-1 downto 0);
|
10 | SClk_o : out STD_LOGIC;
|
11 | MOSI_o : out STD_LOGIC;
|
12 | MISO_i : in STD_LOGIC;
|
13 | SS_o : out STD_LOGIC;
|
14 | Ready_i : in STD_LOGIC);
|
15 | end spi;
|
16 |
|
17 | architecture rtl of spi is
|
18 |
|
19 | type States is (Idle, Data_transfer, Stop);
|
20 | signal State: States := Idle;
|
21 | signal Tx_reg : unsigned(Width-1 downto 0);
|
22 | signal Count: unsigned(Width-1 downto 0);
|
23 |
|
24 | begin
|
25 |
|
26 | MOSI_o <= Tx_reg(Tx_reg'left); -- Data from Master to Slave
|
27 | SCLK_o <= Clk_i; -- Master Clk_i send to SCLK
|
28 |
|
29 | spi : process(Clk_i,Reset_n_i)
|
30 | begin
|
31 | if Reset_n_i = '0' then
|
32 | Count <= (others => '0'); -- Init Data bit counter
|
33 | State <= Idle;
|
34 | Tx_reg <= unsigned(Data_i); -- Load parallel data
|
35 | SS_o <= '1'; -- Deselect Slave
|
36 | elsif rising_edge(Clk_i) then
|
37 | case State is
|
38 | when Idle =>
|
39 | if Ready_i = '1' then
|
40 | SS_o <= '0'; -- Select Slave aktive
|
41 | State <= Data_Transfer; -- Change state
|
42 | else
|
43 | State <= Idle;
|
44 | end if;
|
45 | when Data_transfer =>
|
46 | if Count < (Width-1) then
|
47 | Count <= Count+1;
|
48 | Tx_reg <= Tx_reg(Tx_reg'left-1 downto 0)& MISO_i;
|
49 | else
|
50 | State <= Stop; -- Change state
|
51 | end if;
|
52 | when Stop =>
|
53 | SS_o <= '1'; -- Deselect slave
|
54 | end case;
|
55 | end if;
|
56 | end process;
|
57 | end rtl;
|