找回密码
 注册
关于网站域名变更的通知
查看: 405|回复: 0
打印 上一主题 下一主题

msp430 模拟spi实现对flash的读写

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <msp430.h>
: r1 j' F& D/ m; k! vchar readdata=0;
' }, q4 v7 h# c4 f6 _& Bchar busy_data=0;
# {5 Z$ h- K: V" m- s. a+ ?void write_byte(char data_byte);, ?1 B) r5 |4 ^: b. T/ E
void send_command(char address1,char address2, char address3,char data);// command and address and data: `8 T2 c/ B3 D, x# q5 J4 K
char recive_data(char read_address1, char read_address2,char read_address3);: s+ L+ |- }* X  j) }" K
void delay();
4 d) T) G* ^4 v) c# W9 l, _* rvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);
9 P; |+ A& [. N4 e  G+ wvoid read_busy(void);
9 r) m. D0 f2 Nint main( void )
) J  ]3 u9 D5 @8 B% G1 h% j- N{
: h9 a( @9 z& z) t( C* y% s  // Stop watchdog timer to prevent time out reset
1 o6 a& `, W( }+ B    - P( U: D( y- E# [: O4 A% |& o
    WDTCTL = WDTPW + WDTHOLD;
. k7 `- n! s0 P    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out2 f1 t! O. o% A0 Y
    P4DIR|=BIT2+BIT3;   //flash  wp si output
0 e9 m- J5 x7 k7 W4 X* o   
+ u  v: C7 T, _/ P& z  _5 S; L    P4REN|=BIT1;            // so pull up- m; b* I% v9 s$ d# M* L1 |
    P4OUT|=BIT1;             //flash so pullup  selected p4.1
! ~' l/ b' Z9 q# N    P4OUT|=BIT2;             //wp=1
) D1 W* N* p) L2 M4 ~) {/ ?) @  l   & @) R- b! h4 I- r$ p7 }
    P6DIR=BIT4;8 D, R, s  Q" M9 p# C0 w9 Z
    P6OUT=BIT4;            //led5 G1 x8 l* D9 }2 l7 ?. L: b, O! Y
    P2OUT|=BIT0 ; //CS=1;  + H2 @5 S* ~  [! a, G; Q
    P2OUT|=BIT5;  //sck=1;& A& d! Q; q, u) F' o' a
    //P2OUT|=BIT4;  // hold =15 _( ^  N  z+ U( g
    _NOP();
6 s1 }: b3 X1 v# K6 {9 N  M0 [    _NOP();! T! j' L. i' W; p& l' K3 B) q
    P6OUT^=BIT4;( @5 s* @- M% b! ~8 f3 _& w
    erase(0x20,0x00,0x00,0x00);      
$ P# b7 [. j% o# e8 `9 Z    read_busy();   ( m6 [4 g( G) Z6 \" C1 q; X
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
1 G3 D1 @6 j: @    read_busy();  
  k8 C- n% b7 W& M% A     readdata=recive_data(0x00,0x01,0x01);   ; F5 m' q; O2 Q6 }0 n
    while(1)
( |5 B% Z& I& D4 h5 T/ ?0 E    {
+ @3 h2 P; Y4 \1 o- w$ C     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
1 {0 T* D' l; l  T& t           
2 z7 Q$ L1 ?# p  X" A1 ?  {# ^      // if(readdata==0x00)1 L' K: k8 B1 e5 S' ]
       P6OUT^=BIT4;7 |; J; D5 G5 z& U
       delay();
. X, ~6 g8 ^* [6 }    //  readdata=recive_data(0x00,0x01,0x01);  6 |, b, e/ \, k  z
    }
( f0 d  U3 r1 A. A& D5 n  7 ~9 A$ P! k- v1 l. n  i
}& d9 j0 a; Q" x; j0 X: I+ @# k
void write_byte(char data_byte)
1 P1 W+ t; S" S+ M; w& }! F# h{+ P: m8 n! ^5 y3 F9 s) }; {/ a
char num=0;  
( d4 S1 u' T4 G2 H0 h5 }) l) R: D for(num=0;num<=7;num++)& O4 u! B4 [4 o+ w) O' h
   {
" s, L/ t$ l1 g) |/ |" n  f" ?  
5 ]' ~9 i3 X: q, w' Z     if(data_byte&0x80)
4 c$ o, ~6 Q& Y& t6 D       P4OUT|=BIT3 ;                //si=1;
% A: n$ ^" w8 f: z$ Y# \% b0 E     else! s  z) c$ B% ?! n/ U) J
       P4OUT&=~BIT3;              //si=0;  2 z2 y2 I) x7 o8 \$ s3 _+ }5 C
       P2OUT&=~BIT5;             //sck=0;6 k* E' c% K4 h0 H5 }" ?. s  m4 X1 a
       _NOP();  
. `0 c* {1 k6 h2 c( s; S5 Y       _NOP();3 F5 U8 t6 ]) y6 i
       _NOP();
% U7 v3 }5 q: ]% c$ W- p       _NOP();
, s" ?$ K" D. I) B        data_byte=data_byte<<1; //数据从高位传输  " ^: G5 H- Z# h
       P2OUT|=BIT5;        //sck=1;   
9 P3 t1 p" g' W- w6 o7 X3 Y        
* w) l0 i3 ~' D# g' b3 R       9 C: n# ]0 |2 v8 \: f
   } * e3 ?8 }! O0 y6 E8 f, y  x
}
- m$ P% u+ t  q* Ovoid send_command(char address1, char address2 ,char address3 ,char data)2 d$ W' F% O9 n
{* r/ F' r' [( ?/ ?6 V
  P2OUT|=BIT0 ; //CS=1;  + S% F5 Q* {' L4 b
  P2OUT|=BIT5;  //sck=1;
" @; ?4 d6 [8 d# w2 C  _NOP();
5 \1 T) N" k) F0 J; F' N6 N4 J& r+ ^  P2OUT&=~BIT0 ; //CS=0;$ F% b% ~' b9 T  L8 m
  write_byte(0x06);   // write command
; b2 W, y7 M" Z9 i8 ^0 F6 ?/ p/ Y  write_byte(address1);0 Q" v. V: W1 P4 ]( [
  write_byte(address2);
& ~$ [1 `- N* @% C  write_byte(address3);
" q6 j# [+ b6 M# K6 q* h6 C! _  write_byte(data);: o. y5 ], c, K" u/ F) n
  P2OUT|=BIT0 ; //CS=1;
; y- {& w, `3 t6 h% S4 I  _NOP();/ f2 n# q; Q" W8 ]* b
  _NOP();
) F0 D" U5 J; m( c  _NOP();
( k4 f, J5 H5 ]; h( ]* g6 h7 s/ {1 N}: _1 ~" H3 {4 j4 ]
* U% h1 o7 H) n3 S8 K
char recive_data(char read_address1,char read_address2, char read_address3)+ [9 Y" C; T2 y- ?7 V* P/ `
{; K3 ^! F8 P! C. d% ]( c" {1 m
   char read_data=0;   : D/ T% t# D- W8 j' S
   char num=0;
7 T; T0 J- M- _/ z  . {. F' v9 ^8 v8 w  t( A% h
  P2OUT|=BIT0 ; //CS=1;  
: I! F2 O" b% S8 r" V( ~  ^  P2OUT|=BIT5;  //sck=1;% G/ h1 n/ Z+ ~) G
  _NOP();
2 N6 n% T, k: H& C! S  P2OUT&=~BIT0 ; //CS=0; 6 C; r5 m6 K3 y- ^+ \; ]
  write_byte(0x03);
' d8 k) h* K7 `0 ~$ A, G6 {  write_byte(read_address1);  
) Q! f0 [* I7 z: p: h0 ]' y2 K  write_byte(read_address2); $ ?; L  }5 U, b# U
  write_byte(read_address3); 2 |/ [# ?. P5 h$ J( b( Y; f# ?) }; w
  & ^( t! E  y( u2 |- ]
  for(num=0;num<8;num++)
" C: t5 x; _- D) y   {3 b" y/ F3 K1 L( e
     P2OUT|=BIT5;        //sck=1;
  S( V5 b: |0 T4 b) L- {      read_data<<=1;
' r' F. U, r) g8 z8 P& d7 s      _NOP();/ u& c& U# C0 m+ u1 ]
      _NOP();8 ]7 `0 I- e3 F+ E) [! w
      _NOP();
3 o9 Q- O$ k% M, d      _NOP();
7 Y, Q% w! m" o. E2 M! u- x( h, T      P2OUT&=~BIT5;       //sck=0;
$ v1 C9 [2 o% T) T5 d* G    if(P4IN&0x02)
2 ?. `+ o$ H3 w$ B0 D# H       read_data|=0x01;
7 c% u. z9 l' k; e. d5 I    else
: X+ l, v& e0 o0 Q9 d3 q       read_data&=0xfe;     . [+ @, x: s  _, f6 q+ X3 [- {
      _NOP();
4 {, r7 t0 r" ?- D' W      _NOP();4 [6 m* n& D+ z; \( \2 t# y
     }
( _1 n* L$ U! S; Z2 R   P2OUT|=BIT0 ; //CS=1;2 r/ d4 {. P( F- f- g8 d+ @
    _NOP();
9 }# C/ B4 m0 V1 \    _NOP();$ |0 a0 c$ P" Y$ k. q
    _NOP();
) P7 p* X0 ^  E8 J% G   return read_data;
5 Q& ?$ ^  K, S: H' e! ]  
* Q$ o5 ^' l+ Z3 Z' [   
6 y, Q+ K, ^0 ?}
5 k% O6 o) v  s9 O5 Z% \( tvoid erase(char command,char erase_address1,char erase_address2,char erase_address3): E) [8 ^) Y0 \+ m6 V* H7 j% S5 C  b
{
- ], N+ C- W1 S& ]9 d3 ]# d  P2OUT|=BIT0 ; //CS=1;  # }. ^5 u: q' D: k
  P2OUT|=BIT5;  //sck=1;8 S3 o2 U2 e9 i2 p4 u& u4 t. v/ W
  _NOP();
  W1 d0 @, H" o& f* i( w  P2OUT&=~BIT0 ; //CS=0;
; Z5 m; U" {! j- |' q  write_byte(0x06);$ ]" }  A" a* _) w
  write_byte(command); 5 F  C- F; J  @9 G" G8 U. ~& z
  write_byte(erase_address1);1 R/ J' Y: q4 w( a( j2 P
  write_byte(erase_address2);- e" _  o/ M7 {9 J
  write_byte(erase_address3);
2 H+ ~4 a& `$ Z, O2 r2 c  P2OUT|=BIT0 ; //CS=1;
7 P/ v/ p, N7 O4 U  _NOP();
& e% `3 t& Z1 P$ X) ]  W  _NOP();/ I1 ]% k) ?' g& @* `8 Q  x" n8 J
  _NOP();
* a/ @3 ?$ s1 F' I5 W( }}6 o$ N# R" C& o% x2 J2 i
void delay()
% S2 u+ U  A3 H) R8 A- |4 V{) N! h5 A8 {/ G: T; j0 S
unsigned  int i=0;
! L' s4 `' N0 v( M9 U unsigned  int j=0;
0 x* ?$ g  G9 Q% p! Y   for(i=0;i<=500;i++)
7 y0 f' b4 M% b* H' O  K0 ]& ]      for(j=0;j<=250;j++)8 m7 S! M" Q* h6 j% ]8 _
        ;3 v' h* p$ u# }' o
}
2 t* f4 x/ ~: x& h; Vvoid read_busy()
2 p- _* ?- [( Z/ N+ h! \; _: F{% K- H6 ?$ C; Q
   char read_data=0;   
  g+ a+ W7 E+ V7 h6 h6 r& d1 a' }1 Y   char num=0;: }& Z3 W* ]- @4 `1 z- f
   P2OUT|=BIT0 ; //CS=1;  
" [* o0 s" |# u5 v   P2OUT|=BIT5;  //sck=1;" \; p4 |0 v9 d
   _NOP();
) B& Q, I$ u) |% U0 S' }0 a0 c   P2OUT&=~BIT0 ; //CS=0;( `1 _! q7 w5 g$ X0 ]8 Z
   write_byte(0x05);        // read the SR1  % C* S2 \, K8 Z- i$ {$ j& f+ r2 {: w0 P+ F
   do{! x  j6 ]3 D! N; P. s5 T4 i
                  
7 ]3 N3 N0 Z1 X" N! H+ p            for(num=0;num<8;num++)
, e* d) J5 O/ M# B             {
( p  x+ ?6 q# s# k9 v8 x1 ?  ^               P2OUT|=BIT5;        //sck=1; * V& W( ^5 I1 Q" O7 _
                _NOP();                0 }# Y2 R7 Q: ]( z# n
                _NOP();
7 ~* l. M' g* I3 p$ K% z, \* e2 n+ t' Q2 |                _NOP();, G3 z  Z0 G8 t& D6 `; h# N
                _NOP(); ( ?3 p, m% k- Z
                P2OUT&=~BIT5;       //sck=0;              
- O3 L1 r5 [. z3 }, N" Z                if(P4IN&0x02)
6 H* v* q9 C6 L, }                 read_data|=0x01;( Z, g: S* [" m6 n( x8 J! c* E
                else$ T- x) }; I; w) k6 n, n, t8 n
                 read_data&=0xfe;               
8 N- h3 n& N. i6 \+ o' d$ X4 H                 read_data<<=1;
0 V9 @% ?$ k+ J) i              }
  j% S1 j+ T1 A5 D& \8 x            _NOP();
/ D: F0 g) c: G7 C            _NOP();! u- m3 J' J) d  `" r# U
            _NOP();           ( P5 F5 M/ Q/ ]5 D
          busy_data=read_data;  * T9 y3 ~5 ~* T; z5 y
     }
. ^' e' D' q0 E# f/ v   while((busy_data&0x03)!=0x02);
" K- O  v  C5 S* k2 \9 ?1 @, X( m$ Z  P2OUT|=BIT0 ; //CS=1;9 L5 Q6 y' o0 ^& W  S  }5 H
   
( L2 J2 ]; ~! u5 q; _! J  9 _5 K, I$ u, W+ R3 X
}$ s, s$ _! R, K0 Q+ ?, ?2 F8 F' L8 }
: {1 |" K2 ]$ c6 s0 e: l2 ?  k& u
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!8 c1 n3 y  S, {6 e/ ^/ i( m+ i
/ O* @$ F- G+ @- W5 r! l/ c+ W
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-6 12:11 , Processed in 0.109375 second(s), 24 queries , Gzip On.

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

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

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