EDA365电子工程师网

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

作者: hefuzhang    时间: 2017-5-31 21:37
标题: msp430 模拟spi实现对flash的读写
#include <msp430.h>1 J9 b; K7 L' y( p. K% ~
char readdata=0;
0 u- u+ o; J7 U" ?# fchar busy_data=0;0 \. A' O6 s! t
void write_byte(char data_byte);8 x& D' \. _, `9 Z
void send_command(char address1,char address2, char address3,char data);// command and address and data4 Z, B  Q& L6 G7 ~6 ?( _( Y
char recive_data(char read_address1, char read_address2,char read_address3);$ H2 l2 `5 _- h/ r6 t
void delay();
' l4 O3 A% l. p, s2 cvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);
% H" Z7 ]: i" Y7 wvoid read_busy(void);
' U4 h7 u7 q3 s% yint main( void ), o* H* a+ [4 W2 x# [0 C0 `
{
, d( n- ]1 j6 S' z9 p0 Q  // Stop watchdog timer to prevent time out reset
6 V- O( c: M9 G$ W$ N( ?/ i    2 ~- l$ h' p0 l, M4 T. R
    WDTCTL = WDTPW + WDTHOLD;
, B9 c3 S3 }# B% w+ ~0 H& Z- R    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
  c. t) V, z  x) K% g. ^4 M    P4DIR|=BIT2+BIT3;   //flash  wp si output
$ J* T* C1 F+ v8 y5 \* C+ i9 J   
0 s6 k$ O: T% E( b7 q" a    P4REN|=BIT1;            // so pull up
: E+ W& E. `* v) i* p/ T    P4OUT|=BIT1;             //flash so pullup  selected p4.1& X* Z1 V# |3 }+ @3 a3 ?
    P4OUT|=BIT2;             //wp=10 o  q, M; S0 z. j
   5 o" B$ \. N: K, A. J: z, k. B* L3 p
    P6DIR=BIT4;
5 S* S" l2 \) ]7 B+ q    P6OUT=BIT4;            //led
# B$ g8 V1 ^7 y* z$ C    P2OUT|=BIT0 ; //CS=1;  
9 [' Y" U& V# L$ `( ]5 h* u# C& b    P2OUT|=BIT5;  //sck=1;+ B- Y9 V: ^% o. e' [5 z% ^
    //P2OUT|=BIT4;  // hold =19 r2 `/ ~, Q% T2 z
    _NOP();: L" K" q( Q3 b8 g6 A2 H# [8 R
    _NOP();
1 I- h+ U: b  c$ m    P6OUT^=BIT4;' a4 D8 l0 Y: U
    erase(0x20,0x00,0x00,0x00);      9 e" _- W/ Q" I4 \6 d- w6 v
    read_busy();   
5 y) N9 r2 J! C' S( R    send_command(0x00,0x01,0x01,0x00); //xie,mingling         $ e, F/ u  R  N8 J5 |/ f
    read_busy();  
) b% ~  d, O& M/ ~! i     readdata=recive_data(0x00,0x01,0x01);   # n2 N6 {' `7 b" D+ e7 J+ n- D% _- F
    while(1)
% K2 e3 X2 ?1 p$ e: p0 d    {
$ n; p* a" x6 O6 _     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
2 i2 J/ A5 u6 e9 }2 {           
9 q  u1 D, G$ p* k) Y& y1 f! c      // if(readdata==0x00)
5 k' g" ?7 f# w7 }" v* P% A2 c       P6OUT^=BIT4;
- Q! G$ Z" W6 Q6 O; ]8 F       delay();! m' J' K! f3 \6 d; a7 G0 K" F% C
    //  readdata=recive_data(0x00,0x01,0x01);  ) _( y0 ^' m" F- E
    }) O4 v6 A: T3 w
  
5 R9 N5 `/ A2 X$ a  Z- D0 y3 Z}. U) e0 v. g* Y" f1 k- ?
void write_byte(char data_byte)) R4 e: b4 @' s0 e3 N$ Q" A1 M
{6 r/ @( k) O) Z+ `3 p4 y4 K
char num=0;  
9 F9 e  \) l; K2 Y& Y) A' c for(num=0;num<=7;num++)* x3 J5 O! f4 Z/ F; o! O+ v& ~, C
   {
8 o  Z" u# [$ [  * q+ T/ S$ {3 Y3 L& W2 P! }
     if(data_byte&0x80)
% O4 x+ ~, {2 R       P4OUT|=BIT3 ;                //si=1;
8 m1 B9 d6 q7 O, G0 F* r5 v5 J: f, B$ b     else1 U, x, K) g- c% O+ L
       P4OUT&=~BIT3;              //si=0;  & Y  W7 u5 P1 E- d6 x% Z
       P2OUT&=~BIT5;             //sck=0;1 \' o: h3 V: ~) w5 ~1 ~
       _NOP();  
6 s9 x. W+ ]  O! p. j: }' d       _NOP();5 w( X7 i* i' W* U0 s" z
       _NOP();
/ i' b6 ]' k, @! s: ]       _NOP();3 N5 G$ Q5 J1 ?8 b) T6 [- j1 b" i
        data_byte=data_byte<<1; //数据从高位传输  
9 f7 |" n7 ?; T: i# m       P2OUT|=BIT5;        //sck=1;   
+ ~. Q+ E3 s- G. b* C& M8 w        
3 S, P0 {. g+ l  u. G       8 S$ ?, m5 L0 X& y( g
   } " h( D1 ?' d8 [& h+ L! n" Z- r
}
' ?4 u+ ~3 ^! o3 Z! y. lvoid send_command(char address1, char address2 ,char address3 ,char data)
/ q5 n/ O) N: a1 V{; ~8 n% [/ Z% x7 V3 H7 H1 Q" a
  P2OUT|=BIT0 ; //CS=1;  
, V( E: w) Y" d6 y: d  P2OUT|=BIT5;  //sck=1;
% G8 I3 m, Y. s8 z8 H  _NOP();2 m' M, \! Y, O; h( U
  P2OUT&=~BIT0 ; //CS=0;8 f6 f9 d: T: I, l
  write_byte(0x06);   // write command+ h5 q: Y  Y) z6 ]
  write_byte(address1);
( m6 C9 h: n+ w$ N5 q/ o  write_byte(address2);  l# P! w$ f; V: Y) U  j& i
  write_byte(address3);
- p6 Y6 {% l2 n7 w( R7 L+ Q1 F  write_byte(data);
* M  ]4 y; m5 w, Y  P2OUT|=BIT0 ; //CS=1;
5 ?% i! W1 Y$ v: M& A  _NOP();6 y( K5 Z  ~) v8 n
  _NOP();
/ h, t* V6 g$ r! k2 V5 D) k+ {  Z  _NOP();0 t& ^0 n6 O9 P9 i
}7 k" o& H$ `* |
& o% u! l3 A  p/ i! c, f5 V
char recive_data(char read_address1,char read_address2, char read_address3)" g; d4 [+ L9 }0 v" R4 d  d* e
{1 w2 K7 w! M' H; z* S9 {# R; ]
   char read_data=0;   
& C9 [; E5 E1 K3 L3 M: E   char num=0;" ]1 N$ ]+ T/ G  `9 s, i7 i8 \
  + o, a8 L1 {0 s: l9 {# |
  P2OUT|=BIT0 ; //CS=1;  
7 w# n$ P: _! T, J4 y) a  P2OUT|=BIT5;  //sck=1;
+ |3 n; ~1 e5 M+ K9 V7 G  _NOP();: B6 B; C! x- I1 f! S: `6 Q
  P2OUT&=~BIT0 ; //CS=0;
7 p" @5 l; Z. q) b6 s  write_byte(0x03);% R" {! j- P: a/ a! ^" c
  write_byte(read_address1);  ! T8 V, o: f& t; p2 D: E
  write_byte(read_address2);
6 \& a( S9 n3 A5 i' M! T/ R  write_byte(read_address3);
' d: U% e: m( a! h. b( N  
, P- Q7 g$ R! {/ b9 g; w  for(num=0;num<8;num++)4 S7 X! U5 I1 u! k% p1 y7 g! s# G
   {$ e& X; l' r, T0 C7 a2 {) O; L
     P2OUT|=BIT5;        //sck=1;
" L) {. T; t% W4 F      read_data<<=1;
% s2 D" _% i1 D7 z      _NOP();
3 W% R) B# r/ a      _NOP();* T, L9 V1 a0 }1 x' H
      _NOP();- m0 X9 H  m2 e* u& i  R
      _NOP();
* f  }; r# |, F, q% u" B      P2OUT&=~BIT5;       //sck=0;0 Y1 f0 R* ~! ]
    if(P4IN&0x02)
5 c5 _8 ?$ s% c' ^0 F- r' P% c( G8 o       read_data|=0x01;7 A) a7 O( ^2 h' b: g; L1 Y
    else
8 C" `( O+ ]9 K% w( |; m       read_data&=0xfe;     2 A8 ?1 h' d8 C  \2 D2 J
      _NOP();
0 t. j" u. V& R3 I7 L/ \+ @      _NOP();
* N6 i- _" j3 O$ s+ k     }
: `! A# |- [5 F7 p$ i3 S   P2OUT|=BIT0 ; //CS=1;
: l- V* Z& m5 M! q5 `    _NOP();
9 G; ^/ O8 f# V+ U/ q; C    _NOP();- T- w  k' Y. [! z0 C2 t& r
    _NOP();; J, j. s/ |$ C; S. c/ w0 p: Q
   return read_data;% @( G3 G) `! W2 |; ]) c
  
4 U; K3 C) v8 Y& U+ b    7 N( n- W0 [9 M3 Y# a
}
0 g0 X  p( k# Ovoid erase(char command,char erase_address1,char erase_address2,char erase_address3)' Q$ m7 Q& m9 Z4 O
{9 s2 x% w+ _" I  O
  P2OUT|=BIT0 ; //CS=1;  , |0 D8 Q3 O. Q& f9 M" x
  P2OUT|=BIT5;  //sck=1;
* z4 _9 M, s0 w' B" d  _NOP();  Z  G9 e8 n5 j$ T, D. ?  X
  P2OUT&=~BIT0 ; //CS=0;. X) q# K  c' G& _1 e
  write_byte(0x06);2 n* k9 Z) E+ L0 r
  write_byte(command); 9 A, ?( Q( Q0 j8 s
  write_byte(erase_address1);
( W+ r/ P+ i' D  write_byte(erase_address2);
. \$ x, s8 C' l" k9 q1 B' x  write_byte(erase_address3);1 }5 ?3 j" q/ r# v) G, L6 c9 S+ A# F
  P2OUT|=BIT0 ; //CS=1;
# ], J, R% A' B1 z( W' l3 u  _NOP();1 t( e+ _) z5 O- X( V- h" e6 ?
  _NOP();4 O: ?' L. ~! A. ?. B* F  ]
  _NOP();# k7 P. q& ^, l
}5 l+ ?; r9 k* j9 p' I  ^
void delay()% i* z& B# @" S* M5 _. l8 `5 @4 d' V0 \
{
7 |0 h/ r: j) I+ q unsigned  int i=0;. X9 E: h4 `0 @
unsigned  int j=0;
. z/ Q" ?) e0 z& w3 B   for(i=0;i<=500;i++)
1 T, v8 \# n! a1 l! `      for(j=0;j<=250;j++): b4 s) ?% }- p% g$ F
        ;
; F2 ~* P' E: b8 E8 ?9 C}
: b/ w; g: w, J) Qvoid read_busy()7 F+ m2 Q# b) t! X) G
{2 G2 x8 c8 ~4 ~: X# o
   char read_data=0;   
/ W& F/ t& `* C3 b   char num=0;/ o" |. [6 N5 [. ?1 S' f/ [4 `
   P2OUT|=BIT0 ; //CS=1;  " E1 V1 P! j8 _5 F2 q2 w$ C  E
   P2OUT|=BIT5;  //sck=1;
3 d) y' u/ |$ f$ k8 |3 ?+ R; {   _NOP();
% `2 C7 @5 N2 `   P2OUT&=~BIT0 ; //CS=0;
3 R2 g/ n; S0 H   write_byte(0x05);        // read the SR1  
0 M; P" q8 j8 X   do{6 B. h1 i- _% q/ }
                  
) H. B. P2 s8 K3 S; T4 `            for(num=0;num<8;num++)" k' J: Q7 F" o9 n& N8 P
             {
% w( [4 S; m3 q; H2 C! l: a               P2OUT|=BIT5;        //sck=1;
8 U0 ]7 j8 L+ ~' P# i& k; \                _NOP();                7 P9 _" S; Z" _5 B& H: ^
                _NOP();+ N1 a* P1 C& p6 K* W+ I
                _NOP();
% e5 g3 g- |# z- B9 F                _NOP();
* D. C3 O  r, [' j4 p. V                P2OUT&=~BIT5;       //sck=0;              
' d( T( T" E7 ]                if(P4IN&0x02)2 `8 F; B* e  @! t1 r6 Y
                 read_data|=0x01;
" d  ?' T: c& O- z( G+ d" w) m# |                else
, A8 J( G2 L" D4 W, j# G                 read_data&=0xfe;                . |! H# K( V% k# L1 V
                 read_data<<=1;
: G" a/ I& u6 J" k( M; h  x              }
8 v+ I$ Z: e/ s" S9 g; d* R            _NOP();
* `1 A! o6 J5 H. o5 C# t4 O            _NOP();% l, @8 X" w, ]+ B6 E
            _NOP();           + f3 t- v; _3 Y5 }  E0 ?' X5 l
          busy_data=read_data;  
# J% X" }( J- o# e6 O% F     }
3 }$ w+ i; U  }3 Q4 `   while((busy_data&0x03)!=0x02);
4 T$ p( z0 v2 S  P2OUT|=BIT0 ; //CS=1;0 C. L; Q% R" T
   
8 A5 w2 E( m0 X6 }  / V/ b2 V  ~! Z' K* D/ C7 S
}
, m) [3 C4 ~% `: {3 ?# {
: M5 f" Y6 G- ]" c% T  `用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
/ a4 l% ?) ^7 n  W
4 p' G. l, S+ G* Q




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