如何通过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)。