EDA365电子工程师网

标题: SPI程序问题 [打印本页]

作者: jiaohuang2004    时间: 2011-3-19 05:12
标题: SPI程序问题
library IEEE;
- v6 C3 |+ }  {& M) t5 K; T6 |, zuse IEEE.STD_LOGIC_1164.ALL;3 T# b: P2 z& {
use IEEE.STD_LOGIC_ARITH.ALL;
& Q; b; L5 z& F5 t8 f2 Ause 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 clock8 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 is7 ^  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') then6 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") then8 @/ 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