3689|1

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

问题描述的很详细,关于fpga配合spi通信 [复制链接]

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;


谢谢各位了

此帖出自FPGA/CPLD论坛

最新回复

VHDL看不懂,你时序仿真看过么?拿示波器看过么?  详情 回复 发表于 2016-10-2 10:28
点赞 关注
 

回复
举报

1144

帖子

17

TA的资源

纯净的硅(高级)

沙发
 
VHDL看不懂,你时序仿真看过么?拿示波器看过么?
此帖出自FPGA/CPLD论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表