[求助] 问题描述的很详细,关于fpga配合spi通信

amsams   2016-9-30 11:19 楼主
悬赏 10 分 芯积分未解决
多谢各位了,感觉明明是能力范围内的东西,就是弄不出来。搞了好久了
下面介绍一下我的情况:(fpga有本地时钟,sck50M)1、用stm32和fpga通过spi通信。stm32的spi设置正确,spi2-mosi和spi2-sck和spi2-cs波形都正确。
2、本来fpga是有工作任务的,但是结果不正确。为了调试,我就写了一个fpga的调试vhdl程序。
2.1 调试程序的内容是:在spi-sck的上升沿,fpga接收stm32发送来的8bit数据,并将数据存储在rx寄存器里,然后将rx寄存器的值付        给 tx寄存器,然后在下一个byte的spi-sck里的下降沿把tx寄存器里8bit数据一位一位发送回stm32,从spi2-miso管脚。
2.2 这样stm32(设置的是spi-sck的空闲电平是高电平,第二个沿(即上升沿采集数据))就能接收并识别mosi发送的数据,就完成       了一次spi通信。
3、现在的情况是,spi的4个线,其他的都正常,miso波形全是低电平,没有正确返回mosi发送的数据。(是没有数据。不是数据左        移右移)。


4、贴出来我写的测试程序,想让大家帮帮我,看看是哪里的逻辑有问题(编译通过,无错误)


library ieee;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity hexx is
port (
                        spi_dout : out  STD_LOGIC;
                        spi_clk : in std_logic;
                        clk : in std_logic;
                        spi_cs : in std_logic;
                        spi_rst : in std_logic;
         spi_din : in  STD_LOGIC
                         );
end hexx;
               
architecture behavior of hexx is

signal spi_cs_d1,        spi_cs_d2: std_logic;
signal spi_cs_f_edge        : std_logic;
signal spi_clk_d1 : std_logic;
signal spi_clk_d2 : std_logic;       
signal spi_clk_r_edge : std_logic;
signal spi_clk_f_edge : std_logic;
signal number : integer range 0 to 7;
signal tx_shift_reg : std_logic_vector(7 downto 0);
signal rx_shift_reg : std_logic_vector(7 downto 0);

begin
    process(clk, spi_rst)       
    begin
        if(spi_rst = '1') then
            spi_cs_d1                                     <= '1';
            spi_cs_d2                                     <= '1';
            spi_clk_d1                                     <= '0';
            spi_clk_d2                                     <= '0';

        elsif rising_edge(clk) then
            spi_cs_d1                                     <= spi_cs;
            spi_cs_d2                                     <= spi_cs_d1;                  
            spi_clk_d1                                     <= spi_clk;
            spi_clk_d2                                     <= spi_clk_d1;
                  end if;
          end process;
          
    spi_cs_f_edge                                         <=  spi_cs_d2  and (not spi_cs_d1);                        --SPI CS 信号下降沿          
         spi_clk_r_edge                                  <=  spi_clk_d1 and (not spi_clk_d2);                        --SPI CLK 信号上升沿
    spi_clk_f_edge                                  <=  spi_clk_d2 and (not spi_clk_d1);                        --SPI CLK 信号下降沿
                               
                               
    process(clk, spi_rst)       
    begin                               
                if(spi_rst = '1') then
                        number                                  <= 0;

                        tx_shift_reg                            <= (others =>'0');
                        rx_shift_reg                            <= (others =>'0');
      elsif rising_edge(clk) then

                                if(spi_clk_r_edge= '1') then

                                        if (number = 7) then
       
                                                number                                        <= 0;
                                                tx_shift_reg                                                                  <= rx_shift_reg(6 downto 0) & spi_din;
       
                                        else
                                                rx_shift_reg                                  <= rx_shift_reg(6 downto 0) & spi_din;
                                                number                                                                                  <= number + 1;
                                        end if;
                                 end if;
               
                                 if(spi_clk_f_edge = '1') then
                               
                                                spi_dout                                      <= tx_shift_reg(7);
                                                tx_shift_reg                                                                  <= tx_shift_reg(6 downto 0) & '0';
                                 end if;
                 end if;          
                 end process;

end behavior;


谢谢各位了

回复评论 (1)

VHDL看不懂,你时序仿真看过么?拿示波器看过么?
点赞  2016-10-2 10:28
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复