EDA365电子工程师网

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

作者: hefuzhang    时间: 2017-5-31 21:37
标题: msp430 模拟spi实现对flash的读写
#include <msp430.h>! ^0 x. b% [7 N# E6 Y) q- l* Q
char readdata=0;+ ?' c# U9 k, D7 e+ x
char busy_data=0;
; P8 K8 S" C3 jvoid write_byte(char data_byte);- H$ N5 r, {; {+ \5 F# ^% n0 s2 {
void send_command(char address1,char address2, char address3,char data);// command and address and data' X" E* x4 {  d! s  l0 j+ Y
char recive_data(char read_address1, char read_address2,char read_address3);% l1 u7 W% O2 P7 W3 G
void delay();
4 {3 h5 u1 p5 h; [  |, U$ Vvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);
( g& U4 G9 Y' a4 c6 vvoid read_busy(void);
% w4 T4 o2 A" y3 yint main( void ). E9 `3 S& h+ U; z4 |
{
: z8 W* d9 H0 ^3 h6 A  // Stop watchdog timer to prevent time out reset6 J, R3 q3 W. r! m' Y
    4 P; w% d0 J& }+ ]
    WDTCTL = WDTPW + WDTHOLD;
$ Y3 ?; X* v. {5 v0 x: v  l    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
- k2 J8 B( r9 `" S% {; D    P4DIR|=BIT2+BIT3;   //flash  wp si output9 G3 [9 t0 C" J7 N4 Q: N0 H; V
   
( D0 w# R5 _' L7 N4 x2 L    P4REN|=BIT1;            // so pull up
5 c+ {$ ?1 m2 _* p    P4OUT|=BIT1;             //flash so pullup  selected p4.1
2 a1 i9 o) E) m( P    P4OUT|=BIT2;             //wp=17 Q5 t2 U" C$ N3 ~- W- z8 H4 t
   0 r* l* B. ^* f) Y2 z% }
    P6DIR=BIT4;
9 F, N/ h5 X2 k3 i9 M& c) x    P6OUT=BIT4;            //led: L) Z. }8 i) P. U
    P2OUT|=BIT0 ; //CS=1;  : U# E' h! r) ~8 ]. V
    P2OUT|=BIT5;  //sck=1;
. j; F& |* U; T* O+ J& R! J/ O    //P2OUT|=BIT4;  // hold =1
$ L+ `9 ^/ V' v+ i& v    _NOP();
( X8 U! o- @% \    _NOP();. {) B- A* B/ K6 e  f3 F/ i
    P6OUT^=BIT4;$ n; z2 Y# ~8 n$ m
    erase(0x20,0x00,0x00,0x00);      
4 T& z# E4 ]! K' }' z# C2 y0 B    read_busy();   
% y4 ]* Y$ k& `6 \$ T& ?2 @    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
3 E0 `& Z1 f: k6 ~4 J8 W    read_busy();  
6 u7 _" Q7 ]( l$ P     readdata=recive_data(0x00,0x01,0x01);   4 s4 M( Z1 m  w: P
    while(1)
, z* o( h8 l1 U, i9 {. N    {: X: }) m3 x! j0 g$ z
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling9 @( Q2 a# l2 Y8 M
           
1 x# y  E6 A; I' N% p8 q6 P      // if(readdata==0x00)3 z; J: f" K/ S+ j* @
       P6OUT^=BIT4;
4 H) D6 H  E4 P       delay();6 r# d; C# v7 x) h
    //  readdata=recive_data(0x00,0x01,0x01);  
9 N' E6 [+ l& B9 a; a# R9 q6 d* p    }
" }! t0 h7 n1 C" [$ a' N! c+ b  
+ K: g" Y: N4 M8 K" m}
/ b3 t  b/ r# U( Nvoid write_byte(char data_byte)% P  [7 }% I" X: g6 r! G5 Y
{
& D# a- I" Z  h char num=0;  
  i6 a) q( n- L' t9 u for(num=0;num<=7;num++)
0 m7 {! R& j! n# s   {
7 o6 Z! h. ^. o2 K+ Q9 r  
3 h1 l, K2 ~* u0 @7 w1 c/ k  r1 ?     if(data_byte&0x80)* _5 \% J* v6 d. @; L7 U
       P4OUT|=BIT3 ;                //si=1;( k$ k9 D- ~( `7 b- R: r* @
     else
0 t- L, i0 S& G. _       P4OUT&=~BIT3;              //si=0;  0 |: i- p) o* K* R$ o+ x+ {, i
       P2OUT&=~BIT5;             //sck=0;
6 P8 S' j; F7 q/ }; X8 X+ b: V       _NOP();  3 k- D" a3 F, V" O! J
       _NOP();! o" j8 h- z6 `( v4 I  F8 u' d2 @  u
       _NOP();4 {: [- k! o3 H& q
       _NOP();
' x& f3 ]2 e/ L; Q0 V& N5 [        data_byte=data_byte<<1; //数据从高位传输  
" u. K6 C+ }) y4 Z* w       P2OUT|=BIT5;        //sck=1;   
5 i' T  V3 V$ p3 b% D3 m        8 M7 m7 V! K3 D& Q1 D
       8 y* ~, k8 _5 f- I
   } ( C) C: t# p4 a
}
5 `5 u9 y: p; W* f5 W4 Y1 jvoid send_command(char address1, char address2 ,char address3 ,char data)* R' c8 K% t& h
{) I+ \$ t! }( p# Y4 x& v* w
  P2OUT|=BIT0 ; //CS=1;  7 X9 u1 H. i* s, P/ {
  P2OUT|=BIT5;  //sck=1;
4 G* M4 {' ]; D  _NOP();
) B/ ?( i* W+ o$ o  P2OUT&=~BIT0 ; //CS=0;
/ l0 a1 p. E1 o2 R  write_byte(0x06);   // write command3 Z( u! K; b( x% i, k( R" i& F* G
  write_byte(address1);& p+ P* }) Y, n, c  x( m1 M+ I
  write_byte(address2);6 P, p9 q- Y8 d- V' {: I- f- G
  write_byte(address3);
' C+ _2 V: j; ^- j  write_byte(data);
$ u8 l& v! q; ^. ~  B  P2OUT|=BIT0 ; //CS=1;0 ]8 o% R1 ~+ s$ P. _) h
  _NOP();
& O# f2 s* v2 ?: s  _NOP();7 E; x2 f9 |  \( Q1 `  q% A( U
  _NOP();) n* f5 e# v5 E; y9 l% q
}
; h2 F: W5 m  w7 o( n, W, ]& H+ c- j+ \7 ~4 T0 y# q4 W6 L
char recive_data(char read_address1,char read_address2, char read_address3)1 n1 {* }$ R! R2 |
{
$ M+ \1 ~! {9 _' K/ z   char read_data=0;   2 c8 p: s+ Z9 y! [' ~* I+ K- _/ D
   char num=0;
) ]9 I# y$ U  u  {7 ]  
3 k# W4 x: ?. F) V6 {# [  P2OUT|=BIT0 ; //CS=1;  % j" T) G7 S, C" T& G( j
  P2OUT|=BIT5;  //sck=1;& l8 R$ a; J# B( g: P
  _NOP();! W/ o& n. ?- M" U2 L5 L# _! ]
  P2OUT&=~BIT0 ; //CS=0;
7 X/ @" o9 L0 y! R4 }# B  write_byte(0x03);! ?$ q4 `; ~, a1 S: O
  write_byte(read_address1);  ; ^. J: y& g2 d: f, ], s* W
  write_byte(read_address2); : V! ?. y6 y/ S9 v% B! K' A
  write_byte(read_address3); " ?# M8 N5 h: ~) X" T- k' _  \
  * m' A* \. E4 q, D6 q8 E, I3 E1 L
  for(num=0;num<8;num++)
  k8 c+ R4 j5 q+ V8 c   {
1 ^0 g* B4 x& d' H3 W1 }  ?. q     P2OUT|=BIT5;        //sck=1;
4 w2 f6 _" s2 N& q; W% p4 E8 U      read_data<<=1;' r# T/ T, ~' M, D
      _NOP();
% t9 _; f: q. e5 [7 f      _NOP();
/ B6 g# V. D) e      _NOP();
" }6 d1 s: c* t2 z  |( }6 G      _NOP();
4 C5 i2 T, q' `      P2OUT&=~BIT5;       //sck=0;6 _% c! W3 q4 O3 w
    if(P4IN&0x02)
/ v* [( E: V  k( ~7 I       read_data|=0x01;& {" z$ R: h+ {0 P
    else
# W1 u/ O% g: _( J. E3 z       read_data&=0xfe;     
! e) k2 o# e. v/ f6 r) C% s      _NOP();/ ]5 p" R. V$ _* S2 m
      _NOP();
- {9 o( x0 O' [- f+ w     }
7 `, b6 x/ {; @5 o$ i7 m# m   P2OUT|=BIT0 ; //CS=1;' ~9 E$ q7 ~# O3 p$ b: H  P
    _NOP();% u7 l) G' k1 Q; L3 K9 Q' C+ W+ P- F
    _NOP();
; \+ l# w$ X$ O5 X- n    _NOP();9 ]$ a& i1 Z4 |4 g5 `* t# `( m
   return read_data;+ e  `, D) _; }4 D
  . X# l: b8 j+ b- e- u6 n
    7 p2 q6 o$ ?3 [- s1 c
}
; S' M7 T; P. ?% Cvoid erase(char command,char erase_address1,char erase_address2,char erase_address3)
6 R* O5 Z$ w7 o" t{/ H& K( o3 |3 f; W7 r6 y
  P2OUT|=BIT0 ; //CS=1;  $ U% b  K$ e0 v: @, n9 d5 x1 j
  P2OUT|=BIT5;  //sck=1;
$ @" ^  f( o6 e& Z) Y) @  _NOP();
  Y! d, U: Q( C2 ]  P2OUT&=~BIT0 ; //CS=0;
: S/ w0 z5 y& k! X$ j  K. j  write_byte(0x06);
! G& d# a6 U# ]9 d+ `& j  write_byte(command); , x3 L( S8 o+ X( [  S9 C
  write_byte(erase_address1);. P' j) Q4 u, [
  write_byte(erase_address2);
; [: k+ t* |$ g' P  write_byte(erase_address3);
$ z; I) h. N7 w& w% b% o+ m% a  P2OUT|=BIT0 ; //CS=1;4 _1 u, `2 K, q4 |! M
  _NOP();
5 n! s$ ^- Z( T7 @  T7 e. C  _NOP();
$ F; U- _- j/ }, k  _NOP();& z* ]4 H/ ~- c7 y  @
}
4 _5 }) ]3 D% p; X( x7 ?8 [, }void delay()
  f6 f2 z/ A0 z0 c3 k{7 H& ^4 l3 K# \2 s9 F& s8 M$ ]
unsigned  int i=0;
" `6 x2 ~# d2 p6 G: @/ P unsigned  int j=0;+ K6 {- W$ Q' S4 w5 W9 y
   for(i=0;i<=500;i++)& }; N( h% Z' F! I
      for(j=0;j<=250;j++): [  n3 w: t8 I9 M2 S# Q' A
        ;
& z( q0 }0 E& j}! K/ E' d4 X+ V3 k- p" [
void read_busy()
5 W5 l" M5 W8 w( |{* t/ Y) k$ }# u! E4 |( a9 e# M
   char read_data=0;   
5 G1 F* h/ n, |/ I" t3 f   char num=0;
1 H: R8 Q' f: V5 `; n& _! K1 ?   P2OUT|=BIT0 ; //CS=1;  1 l. P5 V4 t/ G$ j) d6 c
   P2OUT|=BIT5;  //sck=1;
9 ?& L  |2 U7 c( _   _NOP();- {+ x' ~) N. C2 }- n5 Z$ B# P
   P2OUT&=~BIT0 ; //CS=0;
( C$ y$ d9 Y1 B: E3 C" F9 T   write_byte(0x05);        // read the SR1  
& D" I6 |, W. Z   do{
/ [9 j& k- B. p  K! w% D. G                   * Y: d8 Z. S, `* x4 F
            for(num=0;num<8;num++)( t, I! G1 e* X7 W9 T8 G
             {
1 v3 p% _1 ^. @; C$ R# R               P2OUT|=BIT5;        //sck=1;
5 U! D4 s% ?6 D) Z( c  A- T' K                _NOP();               
# e; h  t( i4 i                _NOP();; a- Z  P8 Q; U) Z7 @: }% L( p( B
                _NOP();
5 t  I* D+ l/ ^. Q' j3 m4 ]" I                _NOP();
8 n6 d" h9 ]' d# k. N, _                P2OUT&=~BIT5;       //sck=0;              
2 B  P5 M( X2 E) X( l9 e                if(P4IN&0x02)
# m5 ?, t8 I! W  T, y, e  ^& M                 read_data|=0x01;2 B2 t/ _2 X1 P9 z
                else( z$ U% |0 o! s
                 read_data&=0xfe;               
7 u7 ~7 m0 F; `                 read_data<<=1;( v' y$ A# W1 v3 Z% g0 i3 e
              }
2 \- ?- s3 m4 H" h            _NOP();
- ]: j0 g, E+ m, l. l) h2 a3 n            _NOP();
* C2 @/ ]$ I+ B0 b' J  O            _NOP();           
5 o1 r% }  ~( v5 Y          busy_data=read_data;  4 O, l$ Q# [& e( j1 Z, M' T/ r, W5 |
     }/ A! |, f5 R# Y
   while((busy_data&0x03)!=0x02);+ K7 `9 x5 p! J. F' d4 K/ T" j
  P2OUT|=BIT0 ; //CS=1;
0 v' [( e  ?3 E5 S* F/ |& ~7 p1 z   
2 u9 B# B( H9 M3 _  
- K" N/ j7 ^8 o5 x! U}
2 h2 Q3 _) _) F
/ `$ x6 u4 n/ S3 j9 K1 D用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
2 k0 l) f4 d; h5 r4 n9 L2 p/ C9 h& x9 O8 H





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