|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 ygcgsa 于 2019-4-22 11:16 编辑 * Q! }. t9 A& ~
3 e" F3 R" q, V: A2 F. n, A
2 }; f/ G7 e+ b. w3 c4 x
我是用STM32和EPM240做SPI通信,STM32为主SPI,cpld为从SPI,8位通信,将always@(posedge CS_N or negedge rst_n) 下的 o. B( i% z9 I4 u Y- z' ]' \
else
; g+ K6 p% \$ v* y begin7 E5 q P8 k9 h) V. b5 p0 R
txd_data <=txd_data+1'b1;
5 @- I* T2 w1 E* N end+ G, x8 R, ?: G& v3 b
换成 txd_data <=5'b11100;(固定赋值)或txd_data <=rxd_data,数据都可以正常传输给STM32,但是当换成txd_data+1'b1后,每次加的值都不对,我实测了几组数据大概如下:
; C) X$ N4 B( A+ c4 s" [; q1,5,9,13,17,22,24,27,30,16,35,38,41,46,48) g: i% O& \ A8 P
1,5,9,13,17,22,24,27,30,16,35,39,42,47,51有一定的重复规律性
2 G+ O+ U% X7 g+ |4 Q+ T H& d查了CS_N信号的边沿,也没有发现有多个上升沿,百思不得其解,情高手帮忙看看代码有没有问题6 \5 V" W3 j2 U3 O, m
* F3 T3 P/ N2 Dmodule spi(clk,rst_n,CS_N,SCK,MOSI,MISO,rxd_data);5 Z# ~: W1 ?% u( N
input clk; //CPLD时钟,50MHZ3 s8 V3 d/ c8 p4 h) y' t
input rst_n;8 t+ W" g6 X6 Q7 `$ a9 b% X X
input CS_N;
! O2 F+ ^6 p( l# V! Zinput SCK; //STM32发送的SPI时钟,实测周期2uS. a2 p. c+ l: y9 M/ b$ Q
input MOSI;; G/ G5 y/ J( a3 l0 u
reg [7:0] txd_data;
. b' L# ?6 N+ J# Zoutput reg MISO;
, }7 Z" k \: ?$ nreg [7:0] rxd_data;
. q( I) V3 S7 T' \. i9 x: h) Toutput [7:0] rxd_data;& ?/ {8 n9 C& v' B$ o+ e9 m
1 Y3 ^* V5 j1 B" o; X% |3 n
+ N- k. M+ n& h- [( b
; `0 R6 b% a9 q+ Q6 d4 J! h//-------------------------capture the sck-----------------------------
3 f9 t9 F9 O9 q8 _reg sck_r0,sck_r1;+ S1 r. I" _' {' {
wire sck_n,sck_p;
5 F3 b+ ^6 X I% @9 {always@(posedge clk or negedge rst_n)/ |8 p9 t0 T- d
begin
4 |5 b% Y0 F3 o- b if(!rst_n)
: U, K6 `1 G* G/ g( O: D begin
4 J: T8 P* c1 h, k. c$ Y sck_r0 <= 1'b1; //sck of the idle state is high
7 d% I* `" s" j9 F sck_r1 <= 1'b1;
* J9 w1 O' s8 Y- L/ e; | end7 w. N1 e- I8 P; `/ a
else
; _+ w1 e7 n' k* G) d8 s. O begin
# p( I. L: |4 O' V5 x3 ` sck_r0 <= SCK;# E: Z/ x# ~, [8 P
sck_r1 <= sck_r0;, M: O! _2 _* I" y- s) A) j
end
7 U) I0 H. r0 |* R# V7 P! T ?end
2 N2 p; b" S6 `: |2 g! w! d2 l b
assign sck_n = (~sck_r0 & sck_r1)? 1'b1:1'b0; //capture the sck down
" z0 `) M! `+ r5 hassign sck_p = (~sck_r1 & sck_r0)? 1'b1:1'b0; //capture the sck up) [8 T3 L# p- n" M1 Q9 l
' m* I) b2 `0 h) {& t9 T, ^' I/ H) E# l0 e2 m& z
//-----------------------spi_slaver read data-------------------------------
. J" a+ M$ X! q4 _7 W8 V4 e9 Vreg rxd_flag_r;
* q/ O( W u1 _reg [2:0] rxd_state;: I. ]0 `6 x: N: g8 A( m4 }* i& I3 b
always@(posedge clk or negedge rst_n)9 a& R P' `: f
begin
* { J3 M4 z% R: T4 m if(!rst_n)3 n& ^' f+ M [4 G( F0 w$ ?% _& D
begin
- G( I9 P# i: O rxd_data <= 1'b0;" K" \+ }' k' H3 X
rxd_flag_r <= 1'b0;- \2 P) Z* V7 S7 D2 X
rxd_state <= 1'b0;% o* L6 G$ T# L6 }4 k0 ?! a
end5 W+ t! }, W! u. h
else if(sck_n && !CS_N)
. f/ H! k* z% {6 w begin6 e6 A' Z2 M2 D( `$ y, m
case(rxd_state)
, E" ~3 Z X; Q3 I+ Z0 \0 w" u* Q 3'd0:begin
: C* N$ |: w2 j5 J9 |- f rxd_data[7] <= MOSI;/ O7 W# S+ b% `# d& D8 H R/ \6 ~# k
rxd_flag_r <= 1'b0; //reset rxd_flag
: X4 Z' c. g( z- F% q3 S( V rxd_state <= 3'd1;
% K' W& u/ Y" {+ G3 |# S% f& I end: j0 G# \6 }" I' K' w/ t! m& G
3'd1:begin
3 V0 B8 Q3 A# d9 U/ d% \ rxd_data[6] <= MOSI;5 B2 H! j- `9 u& b3 ^' V5 h
rxd_state <= 3'd2;+ e% Y% i2 c$ v h# T( |# o% X \6 E" w
end3 b, n! F+ Z7 z, h: X
3'd2:begin/ a4 @: d6 G! _, Z
rxd_data[5] <= MOSI;. U. p0 n# g) s V* g, x6 S
rxd_state <= 3'd3;
3 ^& v/ U0 Q1 I( s% R# H- j end* b0 X. v. Z* H5 q# x
3'd3:begin
|* g, Z8 k: I0 {" m) J rxd_data[4] <= MOSI;+ j' }% r& j* l3 m2 T& N( F, l- ` q
rxd_state <= 3'd4;, V. l2 |. r$ U' D" D+ o& ^% ~
end
) b v, h' W: E5 r' H5 L* W$ W 3'd4:begin
8 t: h& D; k6 l3 N rxd_data[3] <= MOSI;
* g. n; N: D1 |: }$ ~ rxd_state <= 3'd5;
, Y/ _ `$ u" d, S; N: k' _6 `1 z end- g# A$ d$ K2 \- k% Z. p+ N
3'd5:begin$ k1 k2 _0 a3 {, T o4 w: o
rxd_data[2] <= MOSI;1 s7 R, o. Y* ]% U, P. w
rxd_state <= 3'd6;
( w/ u1 v. l" l. ] end+ S- O5 C& r X9 S; o. @
3'd6:begin
. w6 T! e3 f2 N5 b4 k7 T rxd_data[1] <= MOSI;
6 K, Y! y( q" D, H; Y( ? rxd_state <= 3'd7;
6 n* o) v' A J h7 a8 W end% [* B5 |2 f( J3 G
3'd7:begin) U9 u6 K2 m, K* r+ z6 a
rxd_data[0] <= MOSI;) M& }$ o" [7 R& O2 q
rxd_flag_r <= 1'b1; //set rxd_flag7 v0 s+ Q' c3 a6 O5 x
rxd_state <= 3'd0;
: w7 j1 A+ N9 s2 P$ A7 V end3 k, v2 d- B% u( U6 p$ {1 f9 A
default: ;+ Q6 u4 R9 V# V7 ]& K" n
endcase& @* R$ A3 R; q+ f1 o5 M, F
/ T2 n3 z$ a- s) o( e( l
end
$ p& N. F! x- r! Q6 K- R. E; y6 H8 jend, `% s8 ?0 X6 }' B _
always@(posedge CS_N or negedge rst_n) //当CPLD捕捉到SPI_CS信号的上升沿时,要给STM32发送的数据加1' A3 u4 t4 R: r! v% Q0 f
begin" h. O% d% V5 J5 R
if(!rst_n)
4 e' W& }* o$ `; \6 P2 P/ w begin. ^" m3 G% p' L0 i% E/ { b7 V3 j
txd_data <= 1'b0;2 \' R+ V/ X0 L% m) F4 ?8 K
end p4 X% W6 L0 X3 T
else$ B4 R7 |: P# k
begin; h5 I1 i5 x$ r4 y
txd_data <=txd_data+1'b1; 6 d" G4 _: v5 l: w
end9 ^9 [5 j1 G( r& Z) `& Z( C+ _
end
$ j& D I R) Q9 N; |1 L) m7 b//---------------------spi_slaver send data---------------------------8 e$ |0 |, t9 f6 q
reg [2:0] txd_state;
! n; V) q# X; E! J1 A2 malways@(posedge clk or negedge rst_n)2 R' ^4 m9 O' \, g
begin# Z# X% ^# ~) f* D3 `
if(!rst_n)
8 }% T, k9 X E3 r/ V/ a$ z5 n6 e6 H; R begin( X5 S9 w) O) ^0 V( K
txd_state <= 1'b0;2 ], c: U) ]4 o/ Y9 a5 R
MISO <=1'b0;
2 a# s, n, g6 G$ V4 C- l
' w$ F! i4 y/ B end- b! R3 K# s) y5 E0 |) _) X4 J
else if(sck_p && !CS_N)
: n. {) _# r# d* T6 S( y begin/ t# ^, _9 O6 C L3 A) z7 H
case(txd_state)7 {: ]. k% L3 j4 s3 C0 O/ p
3'd0:begin0 U. U9 S: K% L' _
MISO <= txd_data[7];, N0 R4 n) g- }4 X; s
txd_state <= 3'd1;3 ?$ D" b& b) o5 n7 Q: b% r
end
# B' Q; L$ F/ y5 S 3'd1:begin
6 E+ Y1 T# |7 J: h MISO <= txd_data[6];
- r3 c" [9 J, b8 x( v) ^ txd_state <= 3'd2;0 G$ s: ~, H$ B: ?* x
end
: G3 B# o/ e" |% z8 ^ 3'd2:begin& O- J' j) e7 M
MISO <= txd_data[5];
$ t2 e# b3 G4 L0 j g txd_state <= 3'd3;0 M, {' a% U0 F. H9 S9 z3 h
end
" ?; @3 \% F& V J0 `. U3 M 3'd3:begin/ ?5 G3 J% X8 K8 h( a' C) u
MISO <= txd_data[4];6 ^7 a4 \! D* U! y- Y/ a
txd_state <= 3'd4; v5 Z0 H$ v5 ^+ A2 e& j
end
1 M& ]; U6 j1 L+ D 3'd4:begin' h0 {' @3 P* _! x) I
MISO <= txd_data[3];
' o) d! f( }% E( p' P/ N& H txd_state <= 3'd5;1 u* d* R/ v& p7 P) q
end+ P4 B i4 l6 }' x# I, v' d
3'd5:begin
9 ^# j4 n, l3 L* f MISO <= txd_data[2];
: S: r, T6 j! o# k8 q" n# T txd_state <= 3'd6;& V/ S0 A2 @0 l9 \5 a a
end/ X3 O' R; ]/ Q, L2 O
3'd6:begin* O' ?. u, H' O
MISO <= txd_data[1];
& |" L, w0 D. z8 s& J3 ? txd_state <= 3'd7;
) g1 D5 I: V% G) M/ V! ]2 Z end; C& E: }. S! o! Z3 R9 F
3'd7:begin
) z% J7 g& l: |: N! ? MISO <= txd_data[0];
& Z* `3 i+ }+ X2 f2 @/ J txd_state <= 3'd0;
& F. l- O$ z1 U1 b$ I
: r. G6 ~6 [. e, w! K w# E ?' Z end4 M4 D6 X: {$ k6 d* C @
default: ;
{$ K1 O0 U' L V+ q: P endcase
+ C- z* P9 g# Y" g; c end+ {6 T N3 M- ]" }* Z3 U& Q$ W
else if(CS_N)' D& Y' E6 k/ S8 v0 M& F
begin
, a: v3 [% ^0 j* B; P) v MISO <=1'b0;/ ~/ O0 A7 |9 E; u0 T# A1 `$ ^
end! \5 l* ]1 K4 f% G: r( {
, x; V+ \- h: r$ K
* F1 ^& E6 z9 d6 J q+ P" I& D! Rend! b) b( `4 O9 G6 J
& D% G' p& A! C1 @# d; Y0 o+ d5 a; f: B# n1 S, q, O0 K% [+ K
endmodule |
|