weixin_41621432
鐵帅
2019-03-29 11:25

如何通过FSMC实现STM32与FPGA的同时相互读写数据?

50
  • github
  • c++
  • c语言
  • 人工智能

如何通过FSMC实现STM32与FPGA的同时相互读写数据?

1.问题背景:
本人设计的数据采集模块:STM32F407为主控芯片进行数据分析和处理,FPGA(EP2C8)负责外接ADC的控制和数据缓存。
STM32与FPGA之间设计的使用FSMC通信,本人已经实现单方面的数据传输:即FPGA将ADC采集的数据通过16位的数据总线传输给STM32里面。
但是,当我想在STM32接收数据的同时,向FPGA发送两次数据 以改变FPGA控制ADC的采样频率。这时候,出现问题。

2.出现的问题:
FPGA的SignalTap显示,数据总线没有出现我STM32发送的数据,反而是地址总线出现了数据,但地址总线从此开始自己加一地变化下去?

3.STM32的发送数据的程序代码

条件判断后,直接赋值给地址0x60000000。

if(freq == 3000)
         *(volatile int16_t *)0x60000000=0x0B;
if(freq == 800000000)
         *(volatile int16_t *)0x60000000=0x0C;

4.FPGA的接收数据的程序代码

其中** FSMC_XA **是FSMC的20位的地址总线。
_ FSMC_XD 是FSMC的16位的数据总线。_
AD_DIVCLK_REG1 和 AD_DIVCLK_REG2 是控制ADC采样的分频计数器_。
_

if (rising_edge(CLK)) then  

       if(AD_EN_WORK='0' and CS ='0' and WE = '0')then 

             case FSMC_XA(17 downto 11) is

                 when "1100000" =>AD_DIVCLK_REG1                                    <="0000000000110001";   

                 when "1100001" =>AD_SAMPLE_DEPTH_REG(11 downto 0)          <=FSMC_XD(11 downto 0);                                          

                 when "1100111" =>AD_DIVCLK_REG2                                    <="0000000000110001";   

                 when others     =>AD_DIVCLK_REG1<=AD_DIVCLK_REG1;

             end case; 

         end if;

            case FSMC_XD(15 downto 0) is

                 when "0000000000001011" =>AD_DIVCLK_REG1                                   <="0000000000000011";   

                 AD_DIVCLK_REG2                                 <="0000000000000011";       

                 when "0000000000001100" =>AD_DIVCLK_REG1                                   <="0000000000000001";   

                 AD_DIVCLK_REG2                                 <="0000000000000001";    

              when others    =>AD_DIVCLK_REG1<=AD_DIVCLK_REG1;

          end case;                       

    end if;    

5.SignalTap的监测图
图片说明

由SignalTap可以看出,
1. FSMC_XA作为地址总线,它出现了STM32的数据,但出现一次后就开始一直自加一了?我在STM32里面明明只赋值了两次?
2. FSMC_XD作为数据总线,一直是FPGA采集得到的ADC的数据,并成功发送给了STM32。但他为什么没有出现STM32里面,条件判断后所赋值的数:0x0B和0x0C呢?
3.FPGA里面的REG1明明初始值设了49(110001b),却显示为1,并且没变化。不应该先开始就是49,然后收到STM32的值后,就相对应地改变吗?
注:STM32程序的FSMC相关配置都配置好了,两个芯片的程序都没有报错,程序都正常下载到了芯片上。

                         希望大神能够抽时间解决一下,具体有细节问题还请随时问我。留言或者微信都行(微信:13438912526)。
  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

0条回答