找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 1320|回复: 0
打印 上一主题 下一主题

SPI程序问题

[复制链接]

3

主题

37

帖子

-8929

积分

未知游客(0)

积分
-8929
跳转到指定楼层
1#
发表于 2011-3-19 05:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

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

x
library IEEE;
: E/ S  U, v. g1 Suse IEEE.STD_LOGIC_1164.ALL;. J9 ]7 ]) e1 Z$ n+ ]; i
use IEEE.STD_LOGIC_ARITH.ALL;) ~, S1 W" m% C3 W0 g: l
use IEEE.STD_LOGIC_UNSIGNED.ALL;6 y( r' l. y- J9 w
entity spi is - Z) c/ [0 A, X9 x4 Y# z" ^
port
0 X5 m: U# C/ s- P6 z* e  (/ ~! A1 \7 z0 a. K4 x* t! z
   reset       : in std_logic;  --global reset signal
7 I/ c3 k, _4 Y, l; y+ s   sysclk      : in std_logic;  -- systerm clock  i! K; S; Z, Y* p4 @) u4 K1 q
   data_in     : in std_logic_vector(13 downto 0);
$ S3 m1 {+ Q, F5 Z* p   spi_o       : out std_logic;1 Y. B& E* V1 L" m' m, `0 N
   sck_out     : out std_logic;
' _# |4 X8 \: _   ss_n        : out std_logic_vector(1 downto 0)& d4 Y9 A4 i( K  \
  );# n) Y' E- ?8 g. v& E' |" q' R- v& Q
end spi;% P: U( c5 J/ i; F" W
architecture b of spi is
$ _) g& ^3 y" C0 b! U! j" E0 N! b" g  type state_type is (idle,shift,stop);  -- data type define
5 f/ I8 t8 G# y, S5 S6 D' {  signal state             : state_type;
( T& A3 _. ~2 i+ I6 I. r( G  signal out_reg           : std_logic_vector(13 downto 0):=(others=>'0');) s/ Z7 l2 `! i0 g. h, R, S
  signal clkdiv_cnt        : std_logic_vector(3 downto 0) :=(others=>'0');- B6 g3 P1 h$ f% `7 [
  signal bit_cnt           : std_logic_vector(3 downto 0) :=(others=>'0');
$ y# S8 b: G& ^( ^; A* T  signal sck_o             : std_logic;. M+ h6 t* }! t8 `4 B7 T7 A
  signal full     : std_logic;' j. d5 @! s7 K/ q0 Z; D$ r( C
   # }( o) u, e1 W/ r
begin# P  J- M9 k% y
    sck_out  <= sck_o;
, E$ N* G( G% E6 C    process(sysclk)/ M; n$ @! J0 w9 ]( S9 N$ b2 v. P) @7 `
    begin; j( C" ~$ i8 U/ E
        if (sysclk'event and sysclk = '1') then  --reset
4 h, V8 N" t' G& L) ?) f          if (reset = '1') then, U# Z9 p2 O- P$ q
              ss_n        <= (others=>'1');  --AD5553 idle CS =19 o  Z# O% g* A9 i5 o% _) d! G, H
              out_reg     <= (others=>'0');
8 s: o/ ~1 w: y. V              clkdiv_cnt  <= (others=>'0');
- @- e4 R+ r) o4 E  i4 Z5 k              bit_cnt     <= (others=>'0');8 k0 Z, B$ U1 A; i) X
              spi_o       <= '1';
( a! U3 b$ M7 g& z              sck_o       <= '0';      -- AD5553 SCK idle is 0: x( `6 @5 h# J  S9 x8 M
              state       <= idle;/ }& J1 h" v. X4 f- S
      full     <= '0';8 c' f. w0 u3 R2 o- M1 v
         else
/ L  E% a4 m% f$ X( {4 R% C    if(full = '0') then1 j' o. e+ ~0 ]& G% W
     out_reg    <= data_in ;
* M% }# l% S' K# H+ y6 t1 M* K2 O     full <= '1';
4 O3 a0 @& F' A  ]- A    end if;8 F; r5 d3 p+ ]0 _1 U
   
4 _- z" Q; Z1 T' k3 \2 x           case state is 7 T4 v# W8 \, Z5 j
             when idle =>* t; j1 i9 _7 U1 @' V* k$ s4 i
      
5 G8 X0 o: z+ q; x  I/ L8 z* x* Z% ]                     state      <= shift;3 q: W& m; l4 T7 o" n
                     spi_o      <= out_reg(13);( I/ V3 a( @- c4 q9 e& t
                     out_reg    <= out_reg(12 downto 0) & '0';
4 C$ G' \5 y; x& U/ e" Q8 j" q                     sck_o      <= '0';
0 s0 x# v8 a* z% N/ i: z* k             when shift =>* v) [: T! S2 i/ i! U
                  clkdiv_cnt <= clkdiv_cnt + '1';
! [8 f5 B3 ?1 ^+ W' M                  if (clkdiv_cnt(2 downto 0)="111") then
' ~( t; ]0 k* T% _; A7 R+ o* `                      sck_o      <= not sck_o;
% R- v( z% x) _! h) R/ C- b$ n- a                  end if;
$ Z4 e" e2 Z! F) D9 K6 L, e2 _                  
9 {0 `9 w0 T/ h3 ?( M5 y      if (clkdiv_cnt = "1111") then
0 z1 a8 u/ `! _                      spi_o      <= out_reg(13);
- H: Z/ d& V+ k, n* e; g8 x6 q( L                      out_reg    <= out_reg(12 downto 0) & '0';# j6 b$ G: g( ^) f
                      bit_cnt    <= bit_cnt + '1';/ p) y* V* b, T4 q, B* O4 y
                  end if;
7 e$ v9 V: `- A+ b                  0 f/ a9 k9 A2 T
      if (bit_cnt="1110" and clkdiv_cnt = "1111") then
: @1 u, L3 S# t% w- n! @' t                      state      <= stop;) A6 c% w+ `- Q
                      sck_o      <= '0';
/ I- P5 E6 o! E* m" D! C, s0 Z9 s                      spi_o      <= '1';
0 n$ O# n  C+ z. p  ?. h5 O' r) D                  end if;& g& r4 e5 b8 E
            
* V$ H- x% t# f9 H     when stop =>
: P3 h: B0 N4 h' e2 k& \" a) s                  state       <= idle;, |  \2 T  |! t4 q  r: U- y
                  sck_o       <= '0';
* X& j& T+ z! y7 D" m! _                  spi_o       <= '1';
5 _" F; J; @3 t7 z" K" i8 s                  clkdiv_cnt  <= (others=>'0');
3 c4 O( A9 s9 m, |. h                  bit_cnt     <= (others=>'0');  u' }1 S1 Q& E( g
      full     <= '0';
& l, l- `( J9 {5 d, H3 \& c             when others =>) q# t) E8 x2 q, n( |; h
                  state      <= idle;' S$ i5 ~' j/ G$ v  n
             end case;
0 F5 b& Q5 M+ B+ s2 ?          end if;
5 R% x* T2 u2 m        end if;9 U2 w$ G' ]6 U) X0 m1 J
    end process;
$ E" o8 U0 \, |1 B1 M: M6 tend b;9 Y$ d9 J* t- R+ t% ^# }" T: i+ W) |

/ l+ N0 \! a% d9 C, ~
+ r3 n% ~  j* |其中out_reg     一直是0,在idle状态赋不上值,大家看是怎么回事
3 b4 a( u/ `+ x1 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏1 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-2-26 02:05 , Processed in 0.053650 second(s), 32 queries , Gzip On.

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

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

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