找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
449
跳转到指定楼层
1#
发表于 2017-5-31 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

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

x
#include <msp430.h>
4 P( O& o: m- v% T  ~. Zchar readdata=0;
, J6 a# y0 N; l1 r2 O+ g' Dchar busy_data=0;
) }% Q) K2 g% [& S: a2 \void write_byte(char data_byte);) L; V0 f- q4 P( F9 ]/ g4 O
void send_command(char address1,char address2, char address3,char data);// command and address and data
4 \9 B! K5 J/ ]1 tchar recive_data(char read_address1, char read_address2,char read_address3);* u8 ~, X3 s  @/ g- ?( C
void delay();
. Z# s# m1 F/ |* Nvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);
' r) k3 g0 c/ e. a6 D6 ^' u% z% fvoid read_busy(void);
# \0 M$ a! v8 t* u, Fint main( void )
6 G9 W6 ^/ o) Y& c1 ?{
$ p9 e* @1 w( L  // Stop watchdog timer to prevent time out reset0 k0 D9 w6 |$ U+ G; s
   
+ }, ?1 S8 k9 q    WDTCTL = WDTPW + WDTHOLD; " H- o* U  S' G1 m
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out# e9 J6 T2 d+ i1 `) u
    P4DIR|=BIT2+BIT3;   //flash  wp si output1 N7 e+ J- b' y6 ?  H6 ]+ z/ K
   ( u* d9 O0 R" u4 Q: P# M& R
    P4REN|=BIT1;            // so pull up
& _3 \0 S! j- L2 A$ N/ C    P4OUT|=BIT1;             //flash so pullup  selected p4.13 B$ u: ~# O' o# ~
    P4OUT|=BIT2;             //wp=1  A2 r3 Q( a5 L  ^9 K$ Z+ G2 d0 K
     S) W0 R# v. Z; I, {
    P6DIR=BIT4;
4 B0 K3 t# }5 b3 S    P6OUT=BIT4;            //led
8 \! Q$ J" s- i    P2OUT|=BIT0 ; //CS=1;  # p  [  }& y$ _. b6 q7 l* G
    P2OUT|=BIT5;  //sck=1;
1 f( L8 p% t  H( f    //P2OUT|=BIT4;  // hold =1# H7 X6 d: V( Z1 g1 Y
    _NOP();4 y1 Z8 j1 ^, C
    _NOP();6 R0 L9 r2 |- ~9 H( R: K$ D' v5 \
    P6OUT^=BIT4;
, J- W9 W0 H' P# H    erase(0x20,0x00,0x00,0x00);      * \* T5 f/ o3 A" i9 H8 |
    read_busy();   6 Q6 t( \2 d5 y" w8 z/ m# @
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         ; U" i% Z1 Z: w4 Q* ^& w# G
    read_busy();  ) ?' m" T! _; A
     readdata=recive_data(0x00,0x01,0x01);   
* E# V  C8 A0 R, _$ P, `    while(1)+ L# a  P8 `% o. @6 Y  q
    {$ T; L, x; a9 y8 ~
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
8 C: c2 F' _& V. ]# F           9 \4 ^% g% Q& J5 s" o! M
      // if(readdata==0x00)# ^+ q+ R: K- l6 v7 X
       P6OUT^=BIT4;7 E* c& [( k/ W, ~2 n$ f# I
       delay();) A+ G8 B" L! Z" A! ^7 L! a
    //  readdata=recive_data(0x00,0x01,0x01);  1 W* g% D" F+ N- Y" p2 J
    }+ J9 Y: g! h) h; h8 c1 _4 o
  
+ D6 [3 e0 J" P; d}
1 b9 V% R: i: f6 t# t! Lvoid write_byte(char data_byte)6 L) A% p1 A3 d- F$ b
{' j# I5 H. {! _5 z
char num=0;  
6 I3 _  _& L1 P for(num=0;num<=7;num++)" n7 D. x: K+ e( X1 y
   {
8 }# U- \$ q) y/ M5 \  3 r' p, y) C2 ^  u( T
     if(data_byte&0x80). c/ Z# U% c- z' B# o
       P4OUT|=BIT3 ;                //si=1;8 }; Q% G& `+ q
     else0 p: a, w& P1 i
       P4OUT&=~BIT3;              //si=0;  ; `4 P! b: e' L( f
       P2OUT&=~BIT5;             //sck=0;9 p/ _0 Z$ k& z# u
       _NOP();  $ I6 _/ E4 q$ ^# x! j
       _NOP();# H5 ~; j; f6 a5 _& _
       _NOP();
7 d& R7 q; v- K( g) S& C       _NOP();
; [9 H6 L3 g3 P0 G' F        data_byte=data_byte<<1; //数据从高位传输  
" H$ ?7 ?# O% I, ^8 N2 F9 Q2 _       P2OUT|=BIT5;        //sck=1;   
, p4 O3 Y6 i9 d3 h9 K0 D        # c: c  t8 @" Z& U( e0 _* d; u$ Q
      
# C$ B4 _+ F) t& c   }
# |; y% S( }8 A: e0 X}
  S- h: K2 M. d' B$ T4 ~2 Avoid send_command(char address1, char address2 ,char address3 ,char data)3 X8 j1 i# K' q) n+ p/ p) D1 k
{
, U+ O+ X0 N- G& T$ F$ h  P2OUT|=BIT0 ; //CS=1;  ! X  O" y# O  g: r
  P2OUT|=BIT5;  //sck=1;3 E! x! y: A, n- ?, J% ^
  _NOP();6 M/ c$ V3 y% N+ N
  P2OUT&=~BIT0 ; //CS=0;
: b; j- c; V+ u6 n2 N3 b  write_byte(0x06);   // write command2 y, G* @9 J# f3 ^& u
  write_byte(address1);) A1 t! Q% I" ~4 p0 w# O) Q7 k
  write_byte(address2);
. L: B) J. b& N* S" R  write_byte(address3);$ i6 e9 m7 m9 I0 ~. L- F$ M+ c
  write_byte(data);$ J' \  n6 c/ ~2 b7 I4 F( J
  P2OUT|=BIT0 ; //CS=1;
. s4 }7 M# D) g* B  _NOP();
( \5 O- @! C! u- d& t5 K  _NOP();
" w9 r7 |, O% t1 b8 B( v  _NOP();& k4 U" Z% F$ n
}
# g. e  U9 b- @$ T8 @$ B3 d, r- B4 i
char recive_data(char read_address1,char read_address2, char read_address3)
; ~, T" }' i; P3 m5 o8 }' h{' V. `( X$ D, x: O
   char read_data=0;   + F3 w2 b8 }! x. b. i; ]# C" o% ^& f
   char num=0;# z& Y2 t5 R) P( d; e
  
6 Y. A. M- |) A& W( o  t  W7 D! d  P2OUT|=BIT0 ; //CS=1;  
$ d' L- ?1 A# o7 a+ k) @- r  P2OUT|=BIT5;  //sck=1;
& F  R- `7 @) d. \2 A  _NOP();( [: E/ B& g2 o& c, o" q
  P2OUT&=~BIT0 ; //CS=0; - P. M$ o" c2 L) n3 r
  write_byte(0x03);  ]# V* X+ V" M& j1 m; b( P& E5 X
  write_byte(read_address1);  1 A9 k7 ?  \, ~# x  D  N3 L
  write_byte(read_address2); ( p. m4 g  J* z: m
  write_byte(read_address3); 5 c* i8 d! l+ w+ B7 ?, d
  $ c- h9 I( q& Y; i+ b# W9 A
  for(num=0;num<8;num++)
7 q: Q3 K6 }3 ]+ |5 l) k   {
: _8 V. U& U( e8 v* m. o4 C     P2OUT|=BIT5;        //sck=1;
  m2 @; q+ V. z/ l" F) v. V. Q4 r7 h      read_data<<=1;
# s' [+ ]6 ^2 f+ x/ V8 S      _NOP();" _% v) e) A) m. w" H) @" T. b
      _NOP();" e$ d6 h' i) ?6 Z3 v, U
      _NOP();
, R' g. S4 X  y. f1 r      _NOP(); 0 t( |  E" g' `( [' ?- {7 _
      P2OUT&=~BIT5;       //sck=0;* r  l& _7 e2 Q/ F$ H+ K3 n: h
    if(P4IN&0x02)$ J7 h1 Y8 ~' F( b9 _6 x0 h! P! `1 k7 y
       read_data|=0x01;/ o% t2 g& T7 I  T# [
    else
( q6 x' N$ P: f; @4 Q6 c, e       read_data&=0xfe;     $ {; V# g# O+ z7 |3 t
      _NOP();1 y6 w; r' r+ [9 s: S( v
      _NOP();4 Y' d# F- j0 a; ?: |3 h2 Z
     } 3 ~' W8 T! R7 y- m" T1 A
   P2OUT|=BIT0 ; //CS=1;
$ |* }( }. }$ ~+ u! {# u    _NOP();8 T5 W* a4 v: Y( m. }3 W/ K, V
    _NOP();
7 F5 r# O9 c' d( w! x    _NOP();+ Z8 `: G0 _1 t3 I# a
   return read_data;
. g, r* u6 v& [6 d9 }- w% {  6 b: X* W+ ?1 B& u* S- k
    0 ]9 p. S, T5 P
}
  l" Y. v0 w1 L; i# |, X3 g+ E/ Zvoid erase(char command,char erase_address1,char erase_address2,char erase_address3)  N" f) l& O- o" E) @7 r- f4 F
{
7 v4 o. q" J0 O% \& t, c0 q! P  P2OUT|=BIT0 ; //CS=1;  
: X9 G" r: ?7 W% O3 e7 x2 ~7 ]( Z& l$ Y  P2OUT|=BIT5;  //sck=1;
! S5 p; J$ w+ V$ \( F: @1 T3 U  _NOP();# _9 G* B9 M0 X1 V8 m
  P2OUT&=~BIT0 ; //CS=0;: |, c# |3 }4 K) n5 D# ~
  write_byte(0x06);
2 C: J) [3 y. R: V7 D4 H! _) |  write_byte(command); 9 u: w' T1 B& |5 Y) r' L
  write_byte(erase_address1);
) A4 Y  Z8 x" m  write_byte(erase_address2);
8 U/ \# v) |% `  write_byte(erase_address3);+ L  w; @% ?1 ^2 h) R& L9 L
  P2OUT|=BIT0 ; //CS=1;7 I4 ~; k! C# ~$ c- [! j
  _NOP();
# o6 [+ x* F4 k- {: k  _NOP();
. z2 o0 X2 P3 X1 j, m  _NOP();
8 ^2 Y0 \7 A% ^  `! D}( W' Z5 m5 G+ h: P' J% O2 D! P
void delay()
; I1 a6 v  h# O1 i. D4 ]: f{
, T4 s3 ^8 ?6 C unsigned  int i=0;
& \/ K9 b, F7 @  {3 h! E+ h unsigned  int j=0;4 B; Z' D3 }/ h* N  E- A7 N
   for(i=0;i<=500;i++). ~, c0 P. ?4 I
      for(j=0;j<=250;j++)
4 q; f1 f- u- [: j        ;
3 {+ {; ?4 U4 c6 S4 Q% B2 Z}
, M' P6 p5 C0 _void read_busy(). J! i8 `6 g$ O& P$ j7 M+ t( |4 j- F
{" W' D$ H* @$ p) \+ o, C
   char read_data=0;   9 i: [3 u' P+ s5 z$ \
   char num=0;( ^3 m+ J1 }) j
   P2OUT|=BIT0 ; //CS=1;  6 U. j% w' ~) g7 N9 N
   P2OUT|=BIT5;  //sck=1;! l+ R. _/ M0 }  H' G  T6 R4 F
   _NOP();8 |" l' W: _: [) b: S/ t
   P2OUT&=~BIT0 ; //CS=0;# z# p( v" c% ~8 Z8 m* g$ H0 }
   write_byte(0x05);        // read the SR1  $ n! \( [  r' ^7 H/ F4 ]: M# i
   do{
+ ]0 _7 ]. q/ \: y7 b                   ! a' s7 y5 V- J- O3 ^3 {
            for(num=0;num<8;num++)5 p/ k0 M  a* k0 s
             {
4 C- a& n; h" w, E9 Z9 E7 n" @               P2OUT|=BIT5;        //sck=1;
" X8 U. t0 v3 q9 R9 ^/ r) e                _NOP();                8 k2 Z- Q* G2 W+ G# \
                _NOP();2 U! {9 a& |: f
                _NOP();
% \7 P$ n( b7 `1 q; r                _NOP(); & F9 b; F' v2 C* z6 t
                P2OUT&=~BIT5;       //sck=0;              
- E! E8 A1 z% _/ Y8 M' E                if(P4IN&0x02)+ O$ E0 Q2 K$ h
                 read_data|=0x01;
; D3 L$ H3 @$ W2 o- M                else; v' J1 U+ z0 |& i
                 read_data&=0xfe;                8 R  [; \( q( ?' t  c
                 read_data<<=1;# \( t5 m" ^& H9 o' c9 ?& r
              } ( J1 r! S  f% }& _
            _NOP();
! A: n9 ?: I& h  x/ j            _NOP();
- t  o% r  s+ ^9 X. q3 e; \; `            _NOP();           1 r: `! H7 a+ _  i
          busy_data=read_data;  2 X7 Z3 U7 n9 t9 b6 E
     }. A' t9 F' m- e0 D. e& m
   while((busy_data&0x03)!=0x02);, B, U+ _& _. Y5 M2 e
  P2OUT|=BIT0 ; //CS=1;3 f. y( I" ~; v: k) Q' H. m& U
    $ T# I4 c( l: j: h
  
; _" V1 K6 s, r1 |% Q}
8 n2 J& f/ F+ J
& I9 M* z0 e7 }; T用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
; Y2 Y* a- [: s/ O% `# J. t9 P$ s! n( k' e; O+ |4 i/ [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-19 09:53 , Processed in 0.056409 second(s), 32 queries , Gzip On.

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

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

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