EDA365电子工程师网
标题:
SPI程序问题
[打印本页]
作者:
jiaohuang2004
时间:
2011-3-19 05:12
标题:
SPI程序问题
library IEEE;
- v6 C3 |+ } {& M) t5 K; T6 |, z
use IEEE.STD_LOGIC_1164.ALL;
3 T# b: P2 z& {
use IEEE.STD_LOGIC_ARITH.ALL;
& Q; b; L5 z& F5 t8 f2 A
use IEEE.STD_LOGIC_UNSIGNED.ALL;
4 ~6 I1 }/ K3 s+ }1 O# d
entity spi is
; C: Y! [( _% G- Y! w/ E
port
' z3 U# o8 U2 p+ p9 ?
(
3 y2 n _# z1 a" o- F
reset : in std_logic; --global reset signal
i- S5 M, V! z- T1 B; m7 [
sysclk : in std_logic; -- systerm clock
8 s4 h$ A5 z8 b- {' c
data_in : in std_logic_vector(13 downto 0);
$ \/ a9 z& j& Q% D1 ]2 M
spi_o : out std_logic;
9 I2 t c; {/ }/ a( `
sck_out : out std_logic;
# I" A$ w+ N% [+ ~; d
ss_n : out std_logic_vector(1 downto 0)
- v; f# A) K9 s0 K9 i" ?' {1 O
);
^, d7 a9 I4 P2 O, W% G% F
end spi;
% a- H. @* B' W0 D M2 `3 L
architecture b of spi is
7 ^ L2 l6 o h# @
type state_type is (idle,shift,stop); -- data type define
0 y3 p/ ~; N: r7 I4 e
signal state : state_type;
$ N2 [6 l0 u% K+ `. B8 M1 q" D
signal out_reg : std_logic_vector(13 downto 0):=(others=>'0');
( o/ R' u" N7 ]4 h1 O
signal clkdiv_cnt : std_logic_vector(3 downto 0) :=(others=>'0');
$ a/ u- f/ d. M+ g+ i6 x: o
signal bit_cnt : std_logic_vector(3 downto 0) :=(others=>'0');
+ Q2 i0 F& {4 C# v5 U) b# F3 }
signal sck_o : std_logic;
# V' t' m* l. p7 F; C. @& f
signal full : std_logic;
$ G: e+ |0 @$ T- g3 ]- \% v
9 v1 h& L. v& Z4 a) E2 B; D' ~
begin
# M$ P# s, k: F
sck_out <= sck_o;
7 Q6 r9 K5 x- N P7 F' o/ _
process(sysclk)
* t) P+ d) j1 X+ |
begin
! Y! z$ V! Q8 z# t4 O% y
if (sysclk'event and sysclk = '1') then --reset
Z+ r5 f, f1 D& R+ K z
if (reset = '1') then
. A3 N( }* Y0 p" B# x/ i5 W
ss_n <= (others=>'1'); --AD5553 idle CS =1
, @8 B, I+ p) z+ i) r
out_reg <= (others=>'0');
2 U& n- }" K) y* L4 {8 ^
clkdiv_cnt <= (others=>'0');
$ j* L+ W3 J, e o. M: f) S
bit_cnt <= (others=>'0');
* Q: \ V6 h5 |
spi_o <= '1';
7 G* K7 L- D" ~- r' q
sck_o <= '0'; -- AD5553 SCK idle is 0
3 Z% [! E* H) g6 N4 _8 p8 |- O
state <= idle;
% g$ S$ Q' E4 I* I; Z- _; A& ^ ?# r3 Z
full <= '0';
) c9 D ~9 V9 g; m7 S& n! |
else
3 {9 i. r b3 ^3 ]
if(full = '0') then
6 L+ y6 I, i4 u9 C0 q
out_reg <= data_in ;
8 G# J# U3 `" h/ A1 F# l; l6 o
full <= '1';
9 O, V$ ?, h4 d& n& t. v
end if;
; e' I* d, k6 `- k3 x7 r3 n' M" z
7 i* \' o- {0 ~( L+ m
case state is
6 G, `! H% x: a' u2 X$ t# A9 I: e
when idle =>
* q- g+ a' a2 U
7 T$ O9 k4 w9 l$ g2 p
state <= shift;
) Z( i7 i$ U! M* i6 A8 @" U p( ^
spi_o <= out_reg(13);
4 N4 j$ c) V" q0 p$ R
out_reg <= out_reg(12 downto 0) & '0';
n. C; [3 b) V( i0 |
sck_o <= '0';
8 {6 U4 d' o% R0 u& y
when shift =>
, c$ ^ H2 Y7 `; P( b6 P
clkdiv_cnt <= clkdiv_cnt + '1';
% Y, T" }& `! c* N' B
if (clkdiv_cnt(2 downto 0)="111") then
; x c$ Z) A! h% b. d
sck_o <= not sck_o;
7 e% t5 ? `+ D5 f% H
end if;
9 ]$ n, p9 L' L) H; c l5 j4 l5 p
# A& i5 n; i b7 e* ]+ X F
if (clkdiv_cnt = "1111") then
8 @/ y7 C# Z/ M" v
spi_o <= out_reg(13);
/ }, X( g7 k7 u( o% p. R
out_reg <= out_reg(12 downto 0) & '0';
* @4 S! ]5 d% w1 q3 a
bit_cnt <= bit_cnt + '1';
) L- R8 _- K5 q+ D0 B
end if;
/ R1 m7 ^- ~' _3 F& x
4 V0 U, J+ S* M6 `0 G
if (bit_cnt="1110" and clkdiv_cnt = "1111") then
, I1 P( A7 U) a& {1 J, W0 i- N+ N
state <= stop;
' x7 Z8 U0 R" U
sck_o <= '0';
6 B5 R, u9 X( c. X5 S; Q
spi_o <= '1';
+ X" e Y O* V6 }, V
end if;
8 F& }0 d" }; E% J( _
$ ~! D9 Q5 ?/ K& S; {
when stop =>
2 s( Q# \4 w1 C4 q/ o" f( a* k0 p
state <= idle;
8 Z8 _* U. S; H6 a* t$ u6 }/ Y
sck_o <= '0';
! }4 P& x! ^) w& A( ~
spi_o <= '1';
) D5 P- _% p$ t
clkdiv_cnt <= (others=>'0');
& G3 c9 r( q/ ~" k* f
bit_cnt <= (others=>'0');
9 r3 J: b2 Q f3 _' P- k% I+ c+ K) r
full <= '0';
; z' p5 q# n, t+ e1 M0 m1 r
when others =>
2 ?5 }5 Y0 u2 v2 M" n) L
state <= idle;
9 X: x, h( l4 @
end case;
% T; r: n" {# `, Q& n0 f
end if;
2 j& T' u, l$ N+ q5 b" v
end if;
9 C& n' i. k, {1 U. q5 T# n
end process;
8 [- x' X, h7 z7 n4 K z d7 G
end b;
9 ^1 x9 V. p# z1 N+ z# V4 j
$ d7 u% [2 C [7 A- f+ R
* U$ x( t- c& e
其中out_reg 一直是0,在idle状态赋不上值,大家看是怎么回事
. L4 W; ^' h& D' |3 X S. @9 l3 I
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2