悬赏
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;
谢谢各位了