0
votes

I have some troubles with my nexys 3 vhdl driver for the Pmod TMP. I would like to communicate with via SPI 3 wire (Clock, Reset and DQ (MISO/MOSI)) so I've wrote some code lines and test it using the leds to display receive data. But That don't work and I don't know why... I've made a state machine that, if it's the first time, send the configuration data and then send the word "start" to start convert, then I pass in receive configuration and take the convert data (temperature in binary) and finally send the "stop" word. And that start again without the send configuration because it's not the first time.

My state machine don't work, there is not receive data and I don't know why.

I'll be glad if you could help me.

Best regards.

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL;

entity SPI is port( CLK : in std_logic; RST : in std_logic; SPI_SCK : out std_logic; SPI_DQ: inout std_logic; SPI_RST : out std_logic; LED : out std_logic_vector(7 downto 0) :="00000000"
); end entity SPI;

architecture behavioral of SPI is

type State is ( IDLE , sendConf, sendBit , receiveBit, clockHigh , resetHigh); 
signal States       : State := IDLE;                                                             
signal Counter      : integer range 0 to 15 := 0;                                            
signal data_reg     : std_logic_vector(15 downto 0):="0000000000000000";             
signal data         : std_logic_vector(8 downto 0):="000000000";                         
signal data_trans : std_logic_vector(7 downto 0):="00000000";                        
signal first_time : std_logic := '1';                                                        
signal send         : std_logic := '0';                                                      
signal receive      : std_logic := '0';                                                      
signal right        : std_logic := '0';                                                      

begin

process(CLK, RST)
    variable conf : std_logic_vector(15 downto 0):= "0000110000000011"; 
      variable start: std_logic_vector(7 downto 0):= "01010001";                
      variable stop : std_logic_vector(7 downto 0):= "00100010";                

begin                                                               
      if rising_edge(CLK) then                                      
        if RST = '1' then                                               
            States <= IDLE;                                             
                 first_time <= '1';                                         
        else                                                                
            case States is                               
                when IDLE =>                                                    
                    SPI_RST <= '1';                                         
                    SPI_SCK <= '0';                                         
                    Counter <= 0;                                               
                                if first_time = '1' then                                
                                    data_reg <= conf;                                           
                                    send <= '1';                                                
                                    first_time <= '0';                                      
                                    States <= sendConf;                                     
                                else                                                            
                                    if send = '1' then                                      
                                        data_trans <= start;                                        
                                        send <= '0';                                                
                                        receive <= '1';                                         
                                        right <= '0';                                               
                                        States <= sendBit;                                      
                                    elsif receive = '1' then                                
                                        receive <= '0';                                         
                                        right <= '1';                                               
                                        States <= receiveBit;                                   
                                    elsif send = '0' and receive = '0' then         
                                        data_trans <= stop;                                     
                                        send <= '1';                                                
                                        right <= '0';                                               
                                        States <= sendBit;                                      
                                    end if;                                                     
                                end if;     
                when sendConf =>                                            
                    SPI_SCK <= '0';                                         
                    SPI_DQ <= data_reg(15);                                 
                    data_reg <= data_reg(14 downto 0) & "0";            
                    States <= clockHigh;    
                      when sendBit =>                                               
                            SPI_SCK <= '0';                                         
                    SPI_DQ <= data_trans(7);                                
                    data_trans <= data_trans(6 downto 0) & "0";     
                    States <= clockHigh;    
                      when receiveBit =>                                            
                            SPI_SCK <= '0';                                         
                            data <= data(7 downto 0) & SPI_DQ;                  
                            States <= clockHigh;                        
                when clockHigh =>                                           
                    SPI_SCK <= '1';                                         
                                if first_time = '1' then                                
                                    if Counter = 16 then                                        
                                        States <= resetHigh;                                        
                                    else                                                            
                                        Counter <= Counter + 1;                                 
                                        States <= sendConf;                                     
                                    end if;                                                     
                                else                                                            
                                    if right = '1' then                                     
                                        if Counter = 9 then                                     
                                            States <= resetHigh;                                        
                                        else                                                            
                                            Counter <= Counter + 1;                                 
                                            States <= sendBit;                                      
                                        end if;                                                     
                                    else                                                            
                                        if Counter = 8 then                                     
                                            States <= resetHigh;                                        
                                        else                                                            
                                            Counter <= Counter + 1;                                 
                                            States <= sendBit;                                      
                                        end if;                                                     
                                    end if;                                                     
                                end if;     
                when resetHigh =>                                               
                    SPI_RST <= '0';                                         
                    States <= IDLE;         
            end case;
        end if;
    end if;
end process;

end architecture behavioral;`

1

1 Answers

0
votes

The Maxim DS1626 does not communicate via SPI interface. So please look into data sheet pages 4, 5 and 10, 11. These timing diagrams are very different from SPI or I²C or whatever.