找回密码
 注册
关于网站域名变更的通知
查看: 470|回复: 2
打印 上一主题 下一主题

FSMC实现STM32与FPGA通信的问题???请路过的大神指导一下

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-7-23 14:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
#include "fsmc.h"4 u" F9 h* u3 w0 I& I5 l  P
#include "delay.h"
3 c) T3 @9 ^" B( ~( j* \& i
( M0 D3 n# S/ Q: x0 h#define Bank1_SRAM1_ADDR ((u32)(0x60000000))
" V+ t% t( Z: I2 O4 n2 m' A% n( {4 Q% n; S5 F0 R* q5 y# }) B
void FSMC_Init(void). T9 E# _# H; ]1 w( d$ C4 ~" A
{
) f& C8 S( J. K# F9 l$ ]        FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;                   //定义FSMC初始化的结构体变量5 i! Q+ J, m+ I5 @
        FSMC_NORSRAMTimingInitTypeDef readWriteTiming;                       //用来设置FSMC读时序和写时序的指针变量+ O  n3 l8 A* @6 w0 `
        GPIO_InitTypeDef GPIO_InitStructure;                                 //初始化FSMC总线的IO口
( q+ l6 y% r# u        
, d' l8 I2 S0 j. U0 |* ^        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);
- C% B( a$ W3 v/ e2 E7 S        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
1 k1 \: m5 \: n        
# S0 A5 E' C- c  e  _//----------------------------初始化GPIO_D GPIO_E---------------------------
8 [# E( m: s3 f/ x' @        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_14|GPIO_Pin_15|GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
. R3 u, u! D% h" I8 U        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;                      //IO口配置为复用推挽输出
5 Y# H9 y/ b9 n3 h        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;' ~" p8 ~6 {' L  R
        GPIO_Init(GPIOD, &GPIO_InitStructure);/ a6 }0 m& v, t9 m& f# v
        
" a" O. o) B8 W        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;6 @  u) E1 A& ~2 n
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
9 n& ~+ G$ r+ i. `3 J" o1 |        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! q  \& h2 Q8 b: S& y8 B& w, y
        GPIO_Init(GPIOE, &GPIO_InitStructure);$ o6 l5 Y" }. f$ H8 y' u: \: l
        
, x6 u- w; R+ Z" H/ O. J        
; I+ X( f+ Y% l8 w7 H//---------------------------读写时序----------------------------------------; Y! e; D: o/ P* B4 A  D
        readWriteTiming.FSMC_AddressSetupTime      = 14;                                              //地址建立时间(ADDSET)
1 t" H* V. \6 }: i" j/ _( C1 r        readWriteTiming.FSMC_AddressHoldTime       = 0;                                               //地址保持时间(ADDHLD)模式A未用到( g' E4 E) [" w5 n; Q; y  [
        readWriteTiming.FSMC_DataSetupTime         = 15;                                              //数据保持时间(DATAST)9 S! B; }9 O) F- r
        readWriteTiming.FSMC_BusTurnAroundDuration = 0;                                               
7 B/ n9 q# d- w+ B% U        readWriteTiming.FSMC_CLKDivision           = 0;                                               
& @2 A1 n; @: [; V; ]        readWriteTiming.FSMC_DataLatency           = 0;                                               
& L3 C, {7 U; t        readWriteTiming.FSMC_AccessMode            = FSMC_AccessMode_A;                               //模式A0 ]+ l$ b; u: {  x( q
        
$ i+ P" U6 ~4 O0 O8 a  F- i9 l( [5 G//----------------------------FSMC初始化---------------------------------------        
; H+ b/ x3 y1 t: e4 R        FSMC_NORSRAMInitStructure.FSMC_Bank                  = FSMC_Bank1_NORSRAM1;                   //这是使用NE13 i$ q, I' j- y* z$ k7 W
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;           
! F3 x2 l+ E6 M# `" x        FSMC_NORSRAMInitStructure.FSMC_MemoryType            = FSMC_MemoryType_SRAM;                  . m3 j# K& Z6 v0 T5 t* q3 q
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = FSMC_MemoryDataWidth_16b;              ; J$ `+ y: N  j. `1 Y2 r; D
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;          $ V' w& p: ~8 i! i4 i$ K& D2 r4 J
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;           0 P; K3 }4 ]$ d8 A& U) ?
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait      = FSMC_AsynchronousWait_Disable;         
' Y# ^6 _8 m1 a. {2 ~        FSMC_NORSRAMInitStructure.FSMC_WrapMode              = FSMC_WrapMode_Disable;                 
6 O" x# r  C* X        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive      = FSMC_WaitSignalActive_BeforeWaitState;
" o5 }* B, ~" u1 l        FSMC_NORSRAMInitStructure.FSMC_WriteOperation        = FSMC_WriteOperation_Enable;            4 g1 Q" o; C/ x6 e" Y0 P9 V; |/ k; u
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal            = FSMC_WaitSignal_Disable;               7 X/ @- G/ Y& @  X$ K9 j! y3 ]
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode          = FSMC_ExtendedMode_Disable;             + r# J. z0 n/ l  s
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;               
: a6 r; A  c( R% n2 ~        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;                      $ q+ B' e  L6 A5 ^& h
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = &readWriteTiming;                     
' E" y% k, @" ?0 j# A; f        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
3 d3 E% d5 S, y  E/ H% A) N  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);              . K/ f4 n5 W. y1 ?! R1 N8 P
        delay_ms(20);4 k1 }9 l8 I; X9 S  g& j
}
3 s1 b: Y  [0 r6 Y. U7 B% s; x5 I
0 `0 R5 p& d$ |//写函数
2 {- {: Y3 Q/ C4 G* b. h' Hvoid FSMC_FPGA_WriteByte(u8 WriteAddr,u16 data)  g" ?* [- v( T( z* L$ W, C
{
5 T  _* F# c/ [5 E1 G8 v        *((volatile unsigned short int*)(Bank1_SRAM1_ADDR + (WriteAddr<<17))) = data;
/ H' U  }0 T( g/ P9 l5 O% _  p5 u2 O        
0 Z8 C* d: ?9 \- I% q8 G3 o: \}+ I+ g5 B2 b9 h3 F0 ?
//向指定地址发送数据& k* ^, T4 {. @0 Y# a& i+ c
               int main(void)
6 L, W( z& M# D8 ]{! O, O, l# B% v5 Y: t) r1 N
        delay_init();               //延时函数初始化         
- m* X4 s/ Z; q3 ?- N8 q        uart_init(115200);          //串口初始化为115200
. t# L9 u$ v9 K        FSMC_Init();                //初始化FSMC接口
& l, C: ]! M2 r2 H  E        while(1)
& V: v& O; L# p  X: C/ V        {6 k* O- `+ p8 H
                FSMC_FPGA_WriteByte(0,0x2000);. y0 K$ o% _; w2 `. n9 r' R
                FSMC_FPGA_WriteByte(1,0x3000);" ?; T4 `' I" I( z% q
                FSMC_FPGA_WriteByte(2,0x4000);  K6 p! J0 ?! t: q9 o% H
                FSMC_FPGA_WriteByte(3,0x5000);2 r( g- l8 M) c9 Z$ g" l( |: Q8 L
                FSMC_FPGA_WriteByte(4,0x6000);) m2 i' Q; q* ^# Y8 l! o7 x0 S
                FSMC_FPGA_WriteByte(5,0x7000);9 z+ S) s, i% d/ D' W
                 FSMC_FPGA_WriteByte(6,0x8000);2 K, l4 C! |5 j% P* b/ e8 X2 e
                FSMC_FPGA_WriteByte(7,0x9000);
9 T/ f/ P# U  M) @}1 M, h# q4 v: v
//------------------------------------下面为FPGA接收STM32发送数据的程序-------------
: j7 f% ~# e4 y  @" X: F0 @module fsmc(2 @4 ], A& d  z; C  r) G
    clk,
- _6 H2 ?! S4 ]$ i0 K" G  c    ab,               //address6 G: O' T( W0 S1 E; {8 K
    db,               //data
, q$ w) D% S" N# y  b    wrn,              //wr$ Q% z3 P1 z9 V
    rdn,              //rd
# D6 N+ c3 D. a" \. q$ p    rst_n,            //resetn1 E! S( n: u# h" ^9 I
    csn               //cs! X- G/ Z( V( A' R* F
    );
$ x( u3 [* N' f% ]0 \: v* kinput[2:0]    ab;
+ I, j3 C! j, ?4 L- B7 ginout[15:0]   db;  //inout 定义db为双向端口
; k9 [$ Y3 v2 y* d# g% M9 tinput wrn;
. d% ]1 O- C  J( E* Y$ J1 a9 Qinput rdn;
" ?. L: S; j- k; s4 p0 Finput rst_n;% n! ~1 W! B; u( e( Y. I1 l
input csn;
: e9 q8 F. J  P* \7 G' oinput clk;  " Z+ Z6 ]3 n9 f( ?: A8 A! i

: E+ `6 s$ M; _6 R6 V) X: Kreg [15:0] outa;8 o+ x$ V8 F$ z3 |& `+ ]; M/ b# c
reg [15:0] outb;( b' ?9 h# {/ V5 d4 K2 l
reg [15:0] outc;
- L" o) b9 d- b- t: greg [15:0] outd;
* l2 b4 t. L6 N+ t& S& S2 Breg [15:0] oute;; U! i/ I# k6 P. X$ U) M
reg [15:0] outf;( }. }* i  n1 E# B
reg [15:0] outg;9 \9 |2 Y' L! m% C% F8 B6 e* l
reg [15:0] outh;   
" i4 P. K# x' v5 P* n4 g  O* \  |wire rd;7 O3 O0 Y* c8 C# W% L% ?+ a
wire wr;   
0 j# M0 L6 O7 k, t6 w6 `+ l8 E  V% z( Zreg [15:0] indata;
. i* g* n; `( Y2 N4 o( u! o% @6 P+ }: @- _+ }5 I; q" U
reg wr_tmp1;
( b; m) P" P& r: [reg wr_tmp2;* ^( L" I3 P5 w3 c5 \
) ^$ _+ m  z' ^- J4 C
//assign wr = !(csn & wrn); //低电平使能 -> 高        ! c# y  k: K7 u) W2 H# b
assign rd = ~csn & ~rdn; //低电平使能 -> 高        
4 l) C8 T% l3 O, m; H0 q//assign db = rd ? indata:16'hzzzz;//三态门) M+ w- v# p1 L' [$ |; ?6 f
        
- `  `) h/ o2 x+ p. \/ Qalways @(posedge clk) //注意这里是为了与时钟同步        
6 P# u7 j$ Q4 P" obegin: \3 N, @3 N2 H
wr_tmp1 <= wr;9 T/ d* @3 h4 Q1 }
wr_tmp1 <= wr_tmp1;0 c/ x" g/ m: q4 f, ^! p
end  
/ r4 m% g6 E  h( b+ ^wire WR_FALLING = wr_tmp2 & ~wr_tmp1;//下降沿写% o1 s# M+ j3 A4 ^4 f5 m# x4 g

# z" C$ K% \' i2 [% ~( S. Ialways @(*) //组合电路,只要变化就写0 |) z3 k: _4 p8 }2 \" l  ^
begin
0 X' c" t/ {- ?% ]if(!rst_n)begin$ v0 r" Q& o% Z  Y5 ~0 Z  N3 l
outa<=16'h0000;
7 X( g$ @1 n$ B& i( P  c; G- _outb<=16'h0000;( z, }8 @% z! r/ r" H- w3 b0 s4 x
outc<=16'h0000;9 r; z: A+ f2 ~% e7 b; D
outd<=16'h0000;6 D9 J$ t0 Y7 t- J
oute<=16'h0000;% I( o! X. L- B" }. f4 O% w* |" k' Z  `
outf<=16'h0000;" X( V* i* y  \
outg<=16'h0000;
  \3 K8 B3 T" i2 R% G( `outh<=16'h0000;& g( `' l# h5 j% F
end   $ W8 i6 W  ]/ V, H( s
else  begin
8 K* g3 ?1 W" Xif(WR_FALLING)begin% M% s* _- U3 v- }3 U! @8 [
case (ab)            
: X* j  W& z" ?# k$ f4 q3'b000uta <= db;
. o3 T- L3 _; V4 O" m3'b001utb <= db;
) _  q4 K- F5 i: [: D3'b010utc <= db;
- Z4 m, t2 M- N( N- P2 T8 W0 K) W3'b011:outd <= db;! V$ f- k7 h4 b, z* r1 k
3'b100:oute <= db;+ c. x% i8 ]) k0 F' d& ~
3'b101:outf <= db;
* v; C1 R4 g. F  O3'b110:outg <= db;& o: k" [7 A+ r2 U1 x8 B
3'b111:outh <= db;
, o# f6 @  O0 F- r3 C# ^; Cdefault:;. x7 e9 [( t' z3 [8 Y/ k( z
endcase
$ d5 [2 s* N  r7 Pend
$ d: @9 q5 N1 ^3 bend" S8 v) e  g# ^- D7 r+ v( J; R
end

' a. w3 |( i/ Y+ \/ u
, [, l; ~3 o! v4 s! f8 P2 \2 `

$ t' D4 x" L! b//下面为Signaltap的仿真图,问题来了,发送的数据2000,3000.........都变成2140,3140等,这是为啥???
& z/ J8 T7 {% |3 P" U7 m4 @花费了很多时间,还没解决,真心求帮助啊

! C  a0 F/ M% p- W/ x1 E  E( X0 F# M: w% K/ {# o, _- N

, ?4 _( p& o& ~  I) ?% s8 A5 [+ a8 }  L5 ~: [+ _$ M& z

" ~, L7 W! N: q, s
# S/ j% M, H2 H4 s( o1 I
% S: M9 }! `3 H) Z# Y6 j7 h7 T9 P+ u- K7 d

该用户从未签到

2#
发表于 2019-7-23 18:23 | 只看该作者
一下几点供参考:; l3 N" D& e7 Z5 Y
1. 看看问题是不是出到40上了   也就是数据总线上后面都是40   也就是有一个bit一直是1    在这个bit上找问题;
; B* f6 Q9 t- W" R6 U# K2. 看看db这个总线上的数据    是不是有两个bit位短接了或其他原因  不受控;' L* B2 n* p% }9 r: x' n) \3 e
3. 建立时间和保持时间,看看够不够。如果不够也会出问题。
# K8 c% N/ f" }3 b% Q) ^( W3 N4. 地址长度搞对没有哦?

点评

大神  详情 回复 发表于 2019-7-23 18:39

该用户从未签到

3#
发表于 2019-7-23 18:39 | 只看该作者
kinidrily 发表于 2019-7-23 18:23+ p3 t9 m" C! b! y0 \% C( C
一下几点供参考:3 g1 A+ C9 ^* y
1. 看看问题是不是出到40上了   也就是数据总线上后面都是40   也就是有一个bit一直是1  ...

% d+ W$ C, d5 I1 E. S& z; G/ X$ l6 q大神
  h( e! G% Q$ n( B
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-12 03:33 , Processed in 0.125000 second(s), 30 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表