EDA365电子工程师网

标题: msp430 模拟spi实现对flash的读写 [打印本页]

作者: hefuzhang    时间: 2017-5-31 21:37
标题: msp430 模拟spi实现对flash的读写
#include <msp430.h>/ j" u5 `( c' t7 p# s. V
char readdata=0;0 N+ \+ V8 r) h2 h* _- a) `1 q
char busy_data=0;
6 ]( [! B) A! R" f! ^/ Kvoid write_byte(char data_byte);
/ N7 g, T* d2 X0 ~# t% Uvoid send_command(char address1,char address2, char address3,char data);// command and address and data- M1 C& C  ^2 G1 [; p( ?, Q
char recive_data(char read_address1, char read_address2,char read_address3);
& d6 o  W/ O1 c( |+ l7 M" H7 u) Zvoid delay();
8 I. h) P- m% t- s7 D- t3 P8 G+ lvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);
/ m% o' `7 k7 e  |. fvoid read_busy(void);
7 q* Z! d' v( X$ W5 i8 C: x4 jint main( void )5 H; _8 o: k% E4 U, g
{7 X2 D) f: p# |8 h
  // Stop watchdog timer to prevent time out reset
( x$ N# S9 @" }; S$ M: u" E   
2 k0 m5 R. b1 {; Y' _    WDTCTL = WDTPW + WDTHOLD; ) u( E' ^9 G3 u) n8 K1 A) \) K
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
$ }2 O+ m$ P( ~$ v    P4DIR|=BIT2+BIT3;   //flash  wp si output) d, o  [) X0 M
   
! @  y  g  w7 W    P4REN|=BIT1;            // so pull up  m- _: A$ B" n( {) `
    P4OUT|=BIT1;             //flash so pullup  selected p4.1  ^$ v' f8 m8 V, ^
    P4OUT|=BIT2;             //wp=10 S2 [8 q* `" A1 \$ p- G
   
' |# q" E. Q2 F9 E- t    P6DIR=BIT4;/ c- w1 c2 b- D' G9 }% H6 S. e$ ?
    P6OUT=BIT4;            //led% B- C7 C6 S6 }# S' a/ U/ x/ n
    P2OUT|=BIT0 ; //CS=1;  
$ V% U7 f* C) v9 m: m, N# a    P2OUT|=BIT5;  //sck=1;
0 d% R) h4 H# T  j: }: w2 _    //P2OUT|=BIT4;  // hold =1
7 V: ^/ g  Q# F+ M5 o, ?    _NOP();# j- u6 Q" H: h! M
    _NOP();  s3 m- A; M! D( J: y* k: A
    P6OUT^=BIT4;
$ P( e9 m( q  P" [, |, G    erase(0x20,0x00,0x00,0x00);      ; h5 Y: _9 l* r  K+ T# p- p" U
    read_busy();   7 b* S! r( O9 m' Y% i% |) g
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
$ q1 {8 T; `4 L* g, x    read_busy();  
3 A# |% P' F3 h# i; v     readdata=recive_data(0x00,0x01,0x01);   
- i: H+ t$ v. D' J1 V# F; H4 M4 b+ U    while(1)/ L4 O0 z- i7 J; }7 E
    {
6 M8 s4 Y- [/ [. x* a" W7 G% n1 i     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling! T/ ]3 ^8 J  H4 a2 o: K" d
           
9 D7 f1 O0 |& i* W, l      // if(readdata==0x00)7 M# D# F; B; Q) ^! C- t
       P6OUT^=BIT4;6 T& M' ?3 s- ~# T# n
       delay();
! `, N7 {* k9 ^7 S( C' [; t    //  readdata=recive_data(0x00,0x01,0x01);  
8 U+ r3 X; K- Y" w    }
  W( t8 T- G& {  
5 f/ x- B( L$ ?* l}9 z# C$ o7 L9 z9 [1 C
void write_byte(char data_byte)
4 i: d6 l2 |% @3 T& M, }% Q4 W{
5 c- s" Y/ _# P$ { char num=0;  - H  f6 F& |# F2 ]( b
for(num=0;num<=7;num++)8 n4 e. V( }6 b3 G: C4 C0 d
   {
! l( w& H( R9 g4 B% h' ?/ w  
, s: r  p+ q" m; l. o1 ~# g     if(data_byte&0x80)2 `2 D+ p) s1 d$ @( o
       P4OUT|=BIT3 ;                //si=1;
: U& {& c( f* L% Z     else
$ w7 a& c5 Z+ E8 @- b7 [       P4OUT&=~BIT3;              //si=0;  3 _, f2 R5 {  ^) `
       P2OUT&=~BIT5;             //sck=0;0 i/ G8 r( `7 j% X' s4 f' o
       _NOP();  
( U# z8 A4 G/ b$ i: O8 {$ {" E       _NOP();2 E( [, D" E. o3 p6 Y& ?: j& n
       _NOP();+ S: S, k) q: c# K, [9 t
       _NOP();9 \" u) B) |( x. |2 I
        data_byte=data_byte<<1; //数据从高位传输  - N8 A0 A- X( b7 s1 x& w# p& V
       P2OUT|=BIT5;        //sck=1;   
% Z4 w5 N  D# r1 |/ {5 ?        ( R1 x2 ?& g' [6 n  M8 l! b7 `
       1 Q: H' j) ?/ v' L7 O% U, ^
   }
& S, c( p5 c; t/ |( t' [+ v. X8 k}5 N$ O! X. p! v8 D* b6 z
void send_command(char address1, char address2 ,char address3 ,char data)
! s& ~- [; k& U7 ]& Q& y) [{# H) H! P' x- `9 f0 x3 W5 b
  P2OUT|=BIT0 ; //CS=1;  5 k1 _8 ?* j3 p1 U# l# z- P
  P2OUT|=BIT5;  //sck=1;; D' X" ]- T# s: D4 G' h
  _NOP();
- d8 p- J: r2 I" k) Q8 b; q  P2OUT&=~BIT0 ; //CS=0;+ r9 r7 h$ A$ I' _& P1 @" T
  write_byte(0x06);   // write command
2 J8 O& J: S  G6 c& @0 e  write_byte(address1);
$ `; n% o3 X- a' }- M, j  write_byte(address2);( Q: t7 @9 |5 O! L1 l
  write_byte(address3);' r8 v) C  H# p' U
  write_byte(data);7 f6 E+ }. Q3 O1 ^( v9 {& m
  P2OUT|=BIT0 ; //CS=1;
: B/ ^$ E2 p. i  _NOP();7 a# Z% Z. I- k" B+ ~# `' V
  _NOP();  v. |3 M! {: x* n/ w. e$ K! @" h
  _NOP();
1 ~+ M/ B/ q+ G7 F( u}$ k- j( Y8 t( ]/ I/ |: i
7 Q/ D  ]# {, z6 x5 F4 l4 M% f, C
char recive_data(char read_address1,char read_address2, char read_address3)
& x' w& y; k' D" ]6 w{7 \  N3 ~% b0 o) {( _1 i
   char read_data=0;   
$ B) K  ~* @0 ^. i4 c   char num=0;
6 h+ {; S8 J+ A. G% B1 Q5 c  0 G/ q- S( Z* @* H9 _4 S, `( [
  P2OUT|=BIT0 ; //CS=1;  
7 h5 x8 u4 r9 ]3 p5 `  S/ }  P2OUT|=BIT5;  //sck=1;6 E2 M+ E, M4 K
  _NOP();
7 S# X+ s: x5 |  W" W+ e  n. Q  P2OUT&=~BIT0 ; //CS=0;
: n$ U  O% P6 @# O# ~  write_byte(0x03);
0 r8 R. o6 F& l5 g  K  write_byte(read_address1);  
/ Z4 `- L% R% G, F1 h2 R& g; i" T  write_byte(read_address2); " m) ^' b) t6 C( ]& ~
  write_byte(read_address3);
& K( [: b' K  c: {" G2 M  
( c& d8 o% b! h) p! m8 {  for(num=0;num<8;num++)
  V' o6 j& d9 p* X* e! q$ z( P   {
" b! x. s  g' A, Z' v     P2OUT|=BIT5;        //sck=1; - B  w( E9 v  h) E( t
      read_data<<=1;* X2 ]; P$ E/ j& @( D, z
      _NOP();  a7 w4 }5 E( J9 Z/ s, m
      _NOP();! Z$ B8 V9 Y# J- W
      _NOP();
" @1 ]* M0 u, n+ Z- M1 n  A% m      _NOP();
# J( n1 [4 O: b5 J4 C/ c      P2OUT&=~BIT5;       //sck=0;8 t9 Y* x+ v3 X% @
    if(P4IN&0x02)
' L  |9 }! C3 z* I       read_data|=0x01;
0 X' Z/ W4 d1 W1 C0 i" A4 j    else3 E6 X: _# m" H3 x
       read_data&=0xfe;     
" R; {8 T/ }- Q2 _      _NOP();
! o3 L: D/ ~1 x# ^. D; e4 x      _NOP();
- P! h% G8 B7 ]0 ]4 u( O     } - g/ R" A0 J1 r7 e4 v" R3 @. b
   P2OUT|=BIT0 ; //CS=1;/ G2 r. d8 X/ a% }. ]1 N) r3 K& Y0 S1 ]: R
    _NOP();1 }- d; r$ t; C; Q2 W0 Y
    _NOP();
. r; ?3 D; y  e. k    _NOP();
3 L; Q" l$ w# y. }   return read_data;
4 Y5 Y8 }8 _1 }* i  o! G! S2 S0 \  : t* I6 {6 \4 F; ?6 |; @! q- C
   
$ @  K" m7 }& m& f9 _% V# O$ u9 }8 R: |}
, U2 W( u1 D/ d. evoid erase(char command,char erase_address1,char erase_address2,char erase_address3)
2 H( N2 ^! q/ F$ ?: ]{
$ H! w$ `3 p  n+ V  P2OUT|=BIT0 ; //CS=1;  
5 O0 j+ R3 n. x+ l( m  P2OUT|=BIT5;  //sck=1;
* P* f, O* P1 b# |  X  _NOP();
) b7 U( H1 `& @* ~- n  P2OUT&=~BIT0 ; //CS=0;( F7 Y1 m1 D0 l! p8 n, O
  write_byte(0x06);/ m4 _8 i* W) @5 d/ g( F
  write_byte(command); 4 R5 r# B6 S1 i9 R
  write_byte(erase_address1);
' [$ p3 u( E  t2 j. A  write_byte(erase_address2);
$ Y, E( w8 I! o0 ]# N! M  write_byte(erase_address3);" f" x: L3 K4 F6 M: `" h
  P2OUT|=BIT0 ; //CS=1;  h* \! ~. @# u/ ^# F# ^2 N
  _NOP();% S% o' A& w7 z* h
  _NOP();
& X: E/ U# H$ M% j" U7 K- l  _NOP();
! I6 e8 ?. r: d6 `4 q! ?}0 q2 y. K/ S+ I' }6 u
void delay()  m9 u) s8 f4 w0 q7 y
{
& e+ b# A( @# ^, L  X: w unsigned  int i=0;5 X3 a+ b, T8 x, x
unsigned  int j=0;4 q$ D8 b; f) b$ j
   for(i=0;i<=500;i++), A4 f: B& V. G- s
      for(j=0;j<=250;j++)
' Z! J9 I. a' k( J5 C        ;
$ J6 A( [) S/ }/ |- s}8 Y, g. e: O5 b0 i) K
void read_busy()- q& K: U( e3 I' h
{
6 _# i# h- N4 `* G* z' F; x   char read_data=0;   : s! Z0 [0 }6 y( A. i: R
   char num=0;
' L" D. h2 G; q% A, a5 v, K1 R' m   P2OUT|=BIT0 ; //CS=1;  $ }" ?8 |* b1 i" |% |' f& J: r
   P2OUT|=BIT5;  //sck=1;* E! o0 X$ e$ @# K, t
   _NOP();. }; b; E7 P( k0 W# r
   P2OUT&=~BIT0 ; //CS=0;% S0 Y8 D2 O/ G0 e2 `4 U" a
   write_byte(0x05);        // read the SR1  2 ^* _, {3 T& [- q2 _
   do{( a! I3 D/ v' p* g( S) ~
                  
% `1 w  F4 @# a' V  p            for(num=0;num<8;num++)
7 O5 q6 F, H* N9 u: W             {
5 V+ f# f6 j1 A  [% `1 x% ^( b               P2OUT|=BIT5;        //sck=1;
/ _6 o; ~1 O. j6 D9 T) h+ J                _NOP();               
3 e  `/ o6 @  q3 j+ M+ ]" n                _NOP();7 i4 X. [, k- \7 _
                _NOP();
0 N' {  O' S8 ~6 s2 l+ a0 U                _NOP();
4 n' ^9 E8 Z# ^& S                P2OUT&=~BIT5;       //sck=0;              
0 C- f' {7 l  A" K                if(P4IN&0x02)# i' a, e' q  x6 b6 U( j. r* @; g
                 read_data|=0x01;
8 B- K" f, O; ^& Q! S                else2 p& X! D7 l$ m" ?" E
                 read_data&=0xfe;               
6 \1 U& u, p% L: R2 F- t6 `% w                 read_data<<=1;
6 F. d8 T8 y# [6 t6 |! r) \              } $ N' H& h) u  d: r
            _NOP();! k& Z5 Y" I5 c) z! Z9 \6 W
            _NOP();* K" T) @# m) A7 [# M
            _NOP();           
8 s5 t) v* Q  w6 C9 M2 b          busy_data=read_data;  
8 V$ }6 d) _9 V2 o     }
) [) p) i7 p" B1 [7 ~8 p   while((busy_data&0x03)!=0x02);2 g, C2 G# J, S. {
  P2OUT|=BIT0 ; //CS=1;. m/ N) R; Q2 k* X
    9 h/ c+ j* _+ _$ d
  " o& v7 i" W# M' o
}
0 `1 t8 g4 Y: r' w% d
0 L. u3 H9 T9 P6 Z用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!' a% p. U% D$ b: L/ l
$ ^. v7 i; C9 d& E





欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/) Powered by Discuz! X3.2