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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "fsmc.h"
) Q, {% U8 Z$ [/ n" ~( P5 h8 e#include "delay.h"8 D  r' E6 G% _" {- j0 q
3 M* O1 q6 T/ O$ s. N0 `' T
#define Bank1_SRAM1_ADDR ((u32)(0x60000000))
: O+ q( H' X; N' C: Q/ Q. |" M. c' g7 |* \  F/ L2 j1 j
void FSMC_Init(void)
% k  W' a# l  F5 m7 W1 l{, b" E4 A* C& m: e8 E* M( v
        FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;                   //定义FSMC初始化的结构体变量( O- F6 i# C6 M! B+ F8 |
        FSMC_NORSRAMTimingInitTypeDef readWriteTiming;                       //用来设置FSMC读时序和写时序的指针变量( Z# e' q" @. z
        GPIO_InitTypeDef GPIO_InitStructure;                                 //初始化FSMC总线的IO口
) H$ U- T9 {7 n& [- u$ x8 W' `        
  L( C6 z% P, H9 [7 @        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);! C4 D; i1 u" n8 O
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);0 c; W7 m  ]$ l- U
        9 x1 U- m7 M. L. e
//----------------------------初始化GPIO_D GPIO_E---------------------------
$ Z( n; k6 h1 i4 |; O0 u- e        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;
3 w/ L( t4 C0 x  E( U8 b& Y        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;                      //IO口配置为复用推挽输出
7 q% W$ L" I; n6 x; j        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 d, |, B! G& [/ u
        GPIO_Init(GPIOD, &GPIO_InitStructure);/ s3 c+ d! b3 a3 M
        
, j! ?+ h0 N4 ~        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;
$ H  _# F  i5 k7 M7 S: R        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;  n( _0 Z7 A2 b
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 x! {! G! @8 s
        GPIO_Init(GPIOE, &GPIO_InitStructure);/ i7 a* Z- D# Y, F# ^: k7 I6 Y
        
0 E8 H' E, z; ?0 c# D7 d% e        
1 r- k4 f; C2 ?+ l//---------------------------读写时序----------------------------------------
1 x$ }1 l. _1 r9 D1 b$ E( x9 c        readWriteTiming.FSMC_AddressSetupTime      = 14;                                              //地址建立时间(ADDSET)1 d* p6 r7 V" ]& M; W* q
        readWriteTiming.FSMC_AddressHoldTime       = 0;                                               //地址保持时间(ADDHLD)模式A未用到
7 c  ]) ?: Y# B6 g3 o- B        readWriteTiming.FSMC_DataSetupTime         = 15;                                              //数据保持时间(DATAST)
7 `4 p/ ]% {' H% c8 q' g        readWriteTiming.FSMC_BusTurnAroundDuration = 0;                                               6 _2 ], m7 n9 i7 ]7 |1 a
        readWriteTiming.FSMC_CLKDivision           = 0;                                               
( _  w. s0 g" B% \. u1 J; X        readWriteTiming.FSMC_DataLatency           = 0;                                                 y1 v9 i& W3 F4 K- J
        readWriteTiming.FSMC_AccessMode            = FSMC_AccessMode_A;                               //模式A
" o6 c( Y+ ^3 ]9 K7 b4 V2 `( g        & H  K1 S4 C0 A% s6 o$ w% ^
//----------------------------FSMC初始化---------------------------------------        + j, _. z* V% q9 x/ d, p
        FSMC_NORSRAMInitStructure.FSMC_Bank                  = FSMC_Bank1_NORSRAM1;                   //这是使用NE1, ?2 g: C: `5 y0 p- y$ m3 Q6 g6 T
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux        = FSMC_DataAddressMux_Disable;           
5 X6 l- M0 B3 `# B/ o. J1 x        FSMC_NORSRAMInitStructure.FSMC_MemoryType            = FSMC_MemoryType_SRAM;                  
: O6 f! B6 U$ T" [& m        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth       = FSMC_MemoryDataWidth_16b;              + ^+ y, z+ \! O3 M+ F3 T+ @
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode       = FSMC_BurstAccessMode_Disable;         
: e/ S8 t( c) ?5 Y        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity    = FSMC_WaitSignalPolarity_Low;           , N) c) z. b' d9 c8 F2 P
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait      = FSMC_AsynchronousWait_Disable;         
7 ^$ c, e1 k1 Q/ \        FSMC_NORSRAMInitStructure.FSMC_WrapMode              = FSMC_WrapMode_Disable;                 5 W3 F; U& ~! {! ?/ |! u( V% l
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive      = FSMC_WaitSignalActive_BeforeWaitState;
% T8 N3 W7 q0 u" c! a        FSMC_NORSRAMInitStructure.FSMC_WriteOperation        = FSMC_WriteOperation_Enable;            ) h. l$ X3 b7 H- ?3 Y5 g
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal            = FSMC_WaitSignal_Disable;               
, ]" G1 B, w$ M  }! Q1 P2 x        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode          = FSMC_ExtendedMode_Disable;             ' P0 c# Y4 J0 \4 \- s; j  s
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst            = FSMC_WriteBurst_Disable;               1 p7 _9 Z; ~% U  W; m; S4 y
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;                     
0 ]3 R! H& _% E% [  q        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct     = &readWriteTiming;                     
- o1 b0 G, X# h" u' V        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); . l7 q. p0 j/ o* M$ E2 S
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);              3 t$ ]+ u6 R" h9 Y# _
        delay_ms(20);
- ~! J" {1 V9 S+ l" e- E- {}$ G! Q9 @9 j# o' x. o
/ J2 m" Y" V( ~7 W
//写函数
. Q4 o, X& o  ?8 zvoid FSMC_FPGA_WriteByte(u8 WriteAddr,u16 data)
, E8 @# z# z' T' i, K9 s{% W! {/ K) ^; G# O
        *((volatile unsigned short int*)(Bank1_SRAM1_ADDR + (WriteAddr<<17))) = data;& j' B% I6 Q0 {* m8 B
        3 s2 h' y- v' D- y, J
}
0 H- y5 u  c8 `  x- v6 z8 I& Y//向指定地址发送数据
! J8 T9 q+ x* ?9 S  J; e               int main(void)
: c) H# J( {9 m* A" `/ Y{
2 H7 P- Z2 H# w9 F4 T8 v* p        delay_init();               //延时函数初始化         
) y' m; x0 z1 W7 |% [9 d! Y        uart_init(115200);          //串口初始化为115200
2 l5 C; a5 f1 P2 Q! C        FSMC_Init();                //初始化FSMC接口' u7 |7 I- a) n2 r
        while(1)4 P5 x, b* e+ ]9 I
        {$ E( @  \  C% ~  V; e
                FSMC_FPGA_WriteByte(0,0x2000);
, Y, f: m7 O) S8 Z) ~1 G                FSMC_FPGA_WriteByte(1,0x3000);
( {8 M5 ~* _' s; b, l                FSMC_FPGA_WriteByte(2,0x4000);! t1 k& @* F2 ]& e3 b2 {9 S; w
                FSMC_FPGA_WriteByte(3,0x5000);$ J  X+ k* G% X) [8 i/ f4 O5 R
                FSMC_FPGA_WriteByte(4,0x6000);
( k' U& P8 |" K' h                FSMC_FPGA_WriteByte(5,0x7000);
1 {  d/ Y6 z! V0 O- R                 FSMC_FPGA_WriteByte(6,0x8000);% ^8 j+ n& L+ [' F
                FSMC_FPGA_WriteByte(7,0x9000);2 q, t7 _! K4 ~/ l( i
}
7 i% o: ]2 e$ T* d4 ^7 a. @//------------------------------------下面为FPGA接收STM32发送数据的程序-------------) ]- x& t- F9 E! R  o' ]# }
module fsmc(8 e! x( ^) b) I- Q
    clk,
( l  v" B- O; `/ X3 o    ab,               //address
( J4 w, A# P$ |# b    db,               //data
. J( S0 s+ {# T! ]9 D    wrn,              //wr
% V- Q  X3 L/ H+ S    rdn,              //rd
% r& z0 E6 G- B0 t    rst_n,            //resetn& V) j% Y* l# i; l
    csn               //cs+ _) Z+ _& X, a; X3 S9 ~
    );( _/ B9 `& ^6 T
input[2:0]    ab;7 T. i- E8 W  Q9 N: z' I
inout[15:0]   db;  //inout 定义db为双向端口
2 i0 |2 E7 k  D; ninput wrn;
% @4 h$ U% t( O. c: U+ J* Vinput rdn;
( J: o( F( A# }0 q7 Xinput rst_n;
. Q1 i# {; ~. \' Ainput csn;
2 D# U7 U& y2 q: Y+ ?$ F! dinput clk;  9 O$ z' H2 |3 G2 U  r

# N. S9 p8 \5 I. N2 v1 ureg [15:0] outa;
; M( f/ F' J4 xreg [15:0] outb;' ^# L; Z8 f. G0 W
reg [15:0] outc;) o; X4 ]& k! w+ k1 t! M  q  G
reg [15:0] outd;
+ Y# J2 f* k: j) o5 K  g  r* treg [15:0] oute;
5 c: t- B2 U9 H/ O- Zreg [15:0] outf;0 Q6 o+ N. j3 M; B+ U0 u- Q
reg [15:0] outg;. _9 q, I) L3 {8 D3 c5 F6 z/ c' Q8 ^
reg [15:0] outh;   
$ L" B3 w) c& }5 W- |. Mwire rd;
& h3 w- x" l2 A2 P4 @, q2 ?# Lwire wr;   5 O( [. M% {, P. `" E; T+ A" o
reg [15:0] indata;  \6 k+ L& d2 C4 s, l0 l. w

3 x* |/ I; k7 u8 V' K0 C8 preg wr_tmp1;
8 _( h7 f2 C4 e, k. n* [reg wr_tmp2;
, }7 J* H5 u6 X. U- y! v! Y1 A
! @4 m* m3 ]+ V% f2 K0 o( a8 Q' a! d//assign wr = !(csn & wrn); //低电平使能 -> 高        * ?9 S6 D, S& m2 e8 @+ A
assign rd = ~csn & ~rdn; //低电平使能 -> 高        
) E( K9 q. Y* H/ @& l//assign db = rd ? indata:16'hzzzz;//三态门
/ X5 ]* v& \# u& G) i3 b        
1 F4 F1 X3 w" c$ ~7 x& [/ Yalways @(posedge clk) //注意这里是为了与时钟同步        + b- R. W; _, U* i+ t
begin
( y9 `9 [; |8 r( t& B# U. zwr_tmp1 <= wr;4 d$ P  s0 g" Q; A* T) w' i
wr_tmp1 <= wr_tmp1;  ~3 R0 F0 P4 o+ d
end  # b  W/ E' P! u: O# p) n; T: H% a
wire WR_FALLING = wr_tmp2 & ~wr_tmp1;//下降沿写* d9 r. o0 P+ P5 H( ]) {7 |; F

* J& n( }, B4 b8 e+ F/ Dalways @(*) //组合电路,只要变化就写8 n4 a/ S& ^. \) a/ C
begin1 `5 u5 o. O# P' p! L6 ~
if(!rst_n)begin- T+ d+ g0 w5 E" B
outa<=16'h0000;2 m$ t! _+ e) d1 }& x: {
outb<=16'h0000;6 A. k5 b* D* T6 E8 H) [3 U
outc<=16'h0000;4 K) _! `2 `; H2 h8 y- M+ i" ?
outd<=16'h0000;2 W; x, y  K3 |$ D$ D% |4 J
oute<=16'h0000;
+ ~. X+ Y& i  q: m! noutf<=16'h0000;- N  m/ D9 y' I4 P
outg<=16'h0000;
0 o3 h4 P2 x! B6 s* Q/ gouth<=16'h0000;
9 k! h( E# T) N+ c9 |4 I# Iend   
3 O1 }1 P) v" R% y( }else  begin6 w8 F/ j( v6 J% X1 I  s
if(WR_FALLING)begin2 W* f: Q$ ~6 w8 N, f
case (ab)            
# A0 U9 E: b( E* f3'b000uta <= db;" G. K/ G  D9 ~9 C9 a
3'b001utb <= db;4 V1 t* D8 a0 n5 ^
3'b010utc <= db;
, a" V9 R, y2 B3'b011:outd <= db;
3 e4 e5 Q% W4 ]5 }) j3'b100:oute <= db;
; v7 |# A$ F) D3'b101:outf <= db;
- k+ J: o* ]( d9 ^4 {3'b110:outg <= db;
6 v# q* n# T( v' W8 H' ?1 e3'b111:outh <= db;- A1 G2 a6 ?7 x6 Y7 c9 u
default:;
( V* r( h8 e6 ?endcase
3 u0 S$ ^* p8 Y: fend$ l. z/ m  i- u  V6 H% Z/ O
end1 x; b  c: }' _' I" I
end
$ z" H8 z1 L( ]0 F) g8 Z) e
2 G* y- G# a, e" L+ k1 V

% g) P8 u! N1 k' c; L/ t4 _9 W//下面为Signaltap的仿真图,问题来了,发送的数据2000,3000.........都变成2140,3140等,这是为啥???& a+ S5 G3 O: e( o& r" b$ R& J! E0 {
花费了很多时间,还没解决,真心求帮助啊
4 J! u2 m8 ^  h# `4 g) Z

" r% u( D2 D, K  M) w; d 5 l  ?! \3 S* c' }5 N
4 m! E. W1 o; O) `
4 ?% H/ s2 N; g$ m

* U3 }" f/ V1 B% N% G
4 g) l, F: p( T) k7 o5 W6 E4 H* u" w+ j2 f) k. [6 D

该用户从未签到

2#
发表于 2019-7-23 18:23 | 只看该作者
一下几点供参考:
- R$ s* e+ i( i; w3 G9 @4 u7 S1. 看看问题是不是出到40上了   也就是数据总线上后面都是40   也就是有一个bit一直是1    在这个bit上找问题;; ^* B8 t3 \! y* ^2 m3 }# E2 R* ]+ C
2. 看看db这个总线上的数据    是不是有两个bit位短接了或其他原因  不受控;  L, t7 ]- ]* f  ~9 I* }' u
3. 建立时间和保持时间,看看够不够。如果不够也会出问题。& \  f6 b" g7 ]- E$ m1 `8 z
4. 地址长度搞对没有哦?

点评

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

该用户从未签到

3#
发表于 2019-7-23 18:39 | 只看该作者
kinidrily 发表于 2019-7-23 18:23
+ D4 U0 m- A9 k7 ^+ k: Q0 D一下几点供参考:8 U8 I2 j) z) |' {. `+ B& f
1. 看看问题是不是出到40上了   也就是数据总线上后面都是40   也就是有一个bit一直是1  ...

8 M8 r* C3 V' d0 N大神
! Q0 B' j+ ^/ a
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-12 17:37 , Processed in 0.171875 second(s), 30 queries , Gzip On.

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

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

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