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

msp430 模拟spi实现对flash的读写

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <msp430.h>$ f  d" B) U4 k8 L
char readdata=0;
$ S7 _% w9 W' xchar busy_data=0;3 P. x( a8 f, o( i$ _7 n7 C2 Y9 ]
void write_byte(char data_byte);  c$ v6 U6 F0 [( m. d0 s6 `$ t$ ?
void send_command(char address1,char address2, char address3,char data);// command and address and data5 E$ f( f: P$ ~, p1 ]
char recive_data(char read_address1, char read_address2,char read_address3);
3 W* Z' a$ Y$ R' kvoid delay();4 O* u+ I/ y& |3 i- s; [5 }- O
void erase(char command,char erase_address1,char erase_address2,char erase_address3);; r& m5 T, V" s! p6 k0 Q8 Y
void read_busy(void);
9 a, Z, ~6 G/ zint main( void )- A' a  s$ N6 l# K$ `# r7 o$ g
{
7 M. \) ?' f. A6 M. s5 _9 _  // Stop watchdog timer to prevent time out reset
0 w+ V/ h6 C7 D   
8 z$ k, a) Q: I, N" ~    WDTCTL = WDTPW + WDTHOLD;   L9 V; r9 H7 b  ?+ j- e
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out3 ?; {7 o$ [: i6 ?2 c) I6 a* {
    P4DIR|=BIT2+BIT3;   //flash  wp si output* c" i4 E1 o3 L9 ]/ Z; ~5 W
   / {. d8 P$ f0 ~+ w/ F; b
    P4REN|=BIT1;            // so pull up: C: Y9 P& I5 h: @* I0 ^& Y6 G
    P4OUT|=BIT1;             //flash so pullup  selected p4.1+ j# s& N1 E( |! U
    P4OUT|=BIT2;             //wp=1
8 V! C% A7 ]5 H2 ^1 M# l$ }* m3 }6 O   . O8 z7 w0 i8 A+ k9 \* f7 v* U3 i
    P6DIR=BIT4;: j! v) I) w" Q
    P6OUT=BIT4;            //led
' f8 F) [5 T* k: a- [7 \    P2OUT|=BIT0 ; //CS=1;  
, l7 }9 r3 k3 [- H  M- [9 {    P2OUT|=BIT5;  //sck=1;
- p$ N! ~- A" @    //P2OUT|=BIT4;  // hold =1
0 v4 S, G$ P- Z9 G4 R0 h$ Y4 q' p    _NOP();% s4 M* K* z, \8 R. H
    _NOP();; H. i3 p8 m  o' H8 Q! _
    P6OUT^=BIT4;6 Q+ \6 \: Z3 w* y8 c; J4 z
    erase(0x20,0x00,0x00,0x00);      ; b% s4 D+ ^! @
    read_busy();   9 {5 l8 @8 h' F5 z5 S
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
8 x6 u4 r: B+ q9 d    read_busy();  
9 p. {" S* k3 D, o! C: e     readdata=recive_data(0x00,0x01,0x01);   / q0 q9 I4 N9 o  Z& o
    while(1)
# {8 B& z0 \" a4 X' m  ~    {! o, _9 w2 I* z) t7 Z) D
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
8 g7 X* F/ A- X' ?           % _) ^' i# H6 Z0 J: o  a, a6 n
      // if(readdata==0x00)
2 S' {* z0 j0 ?2 D7 M/ r& d  F2 u       P6OUT^=BIT4;
/ e1 ]) L9 M' s0 C       delay();2 g8 g" f* x& Q( A3 X; H" s  h" z! U
    //  readdata=recive_data(0x00,0x01,0x01);  3 l, H+ E- q4 R# Q& E6 ^  [7 V; p1 b; a- w
    }1 V9 d0 R+ t% R: m' k) k8 j- N+ j
  
7 v$ N* B5 K1 v) Z}
( _+ T+ P! F) {, t' w# d; tvoid write_byte(char data_byte)- k) A9 v( t) U8 |7 a0 t
{4 @0 y: f. `6 Z. U  e' z' t
char num=0;  
/ {7 r; {5 j# n! p) p4 t/ u# ` for(num=0;num<=7;num++)
+ w/ p6 ~! P" T5 D; e   {
' p- k5 C" F9 ?3 m' j& G  / V" Y" q. G6 f$ [2 v
     if(data_byte&0x80)' L3 Y/ F/ r8 }2 G' t# d+ D( z
       P4OUT|=BIT3 ;                //si=1;
4 |- L4 l3 P/ Z4 R" p     else
: B8 a! |" Q% K; m) W5 i( H       P4OUT&=~BIT3;              //si=0;  
) q! |: [( F6 X9 ?$ T, |! h       P2OUT&=~BIT5;             //sck=0;
& F* M; x6 I& S0 a* N       _NOP();  
( k7 `- x0 y' z! l       _NOP();9 A: V1 @) L5 m
       _NOP();( e9 A. Z9 g  M. m/ P8 m
       _NOP();
8 @* r7 a' Q- u2 Q7 @4 W, l( u2 z/ G        data_byte=data_byte<<1; //数据从高位传输  3 V3 X* D6 x1 @- X9 @
       P2OUT|=BIT5;        //sck=1;   . F- J& v$ M3 V
          X" L2 q& c; U' x' D1 A4 V* b
      
( O5 m7 W5 ~' h- F' _9 t' B3 \/ F   }
" }3 \0 A: x; f6 g$ X0 P* a}: I8 m4 }- t% ~
void send_command(char address1, char address2 ,char address3 ,char data)
/ h' |/ d. o) L# y  E{
  V" Y6 z3 Y6 x9 q" E  P2OUT|=BIT0 ; //CS=1;  ( V6 x3 ]4 g0 r: \
  P2OUT|=BIT5;  //sck=1;
! o6 s4 t2 g0 f! i5 q; x1 o  _NOP();
! q9 q( v( z. ^" o, b  P2OUT&=~BIT0 ; //CS=0;9 V9 L6 F- P# [8 @$ u
  write_byte(0x06);   // write command; y4 i1 S1 j8 g; `
  write_byte(address1);
- ]. W) o$ O! }7 E1 l0 N) O  write_byte(address2);; F0 j; @6 Q$ ]& n) Y- K6 Z. ~
  write_byte(address3);$ w2 }! M4 S( T& ?& q( \
  write_byte(data);
5 O! W/ W) |$ y1 G& ]  P2OUT|=BIT0 ; //CS=1;
7 t9 y8 l% z7 `3 l0 {$ ~4 t! s1 u  _NOP();) R9 B5 A4 L: U+ M. H- [) F
  _NOP();8 j1 m! i0 Q0 Q- Y3 e# }
  _NOP();
! s4 a* y8 r% u4 o" w; e4 w}
( G) s8 C( l8 P* ]3 F) S1 G
  G: P, z; L  lchar recive_data(char read_address1,char read_address2, char read_address3)( ]- k: s9 _! S0 h- Z2 P* c
{
+ J7 V+ a' A9 t; S   char read_data=0;   4 \9 t/ T% m# ]# \; h
   char num=0;' f; ^7 d' b* B
  
# m0 p2 d' q0 j$ J7 u  P2OUT|=BIT0 ; //CS=1;  
/ @! c( H$ W/ z, G7 H( m  P2OUT|=BIT5;  //sck=1;' W6 q( o- s+ }; N7 _
  _NOP();
! u; @: o" C9 ?/ W  h* M* [, N. o  P2OUT&=~BIT0 ; //CS=0;
$ y# Z$ C. M  S0 @# p3 E" T  write_byte(0x03);
/ y1 Z# v/ {2 r. H/ @  write_byte(read_address1);  4 |2 O/ A* `: T& E$ ]
  write_byte(read_address2);
0 D, p: F0 X& c* k1 `$ Y  write_byte(read_address3);
( X, ~" L0 H& h7 j7 |9 b0 O  & r/ n) r9 _  q- v) r
  for(num=0;num<8;num++)  ?7 C6 h" P4 s* v: h: {! t4 ?
   {
# P- ?/ s( w$ G& ^( ~3 b     P2OUT|=BIT5;        //sck=1;
7 [3 o2 x5 ?( I5 p  P      read_data<<=1;
, l4 |# d8 R  ^6 {; I; M      _NOP();
; v+ _. j& s+ u3 B  k      _NOP();
7 F" e9 l0 u7 g6 n' A6 Q3 v      _NOP();
5 h4 g4 C- x3 D3 F; m5 s( a      _NOP();
$ B$ i3 \; H7 b7 n* y3 F      P2OUT&=~BIT5;       //sck=0;5 r+ N8 U0 M/ r4 v/ Q# Y) j( d
    if(P4IN&0x02)
5 q' |: }6 e5 b' |' Q: Z       read_data|=0x01;
* P& J8 e! L/ b% F- j- T    else
* v6 `, z- e) P1 \1 F       read_data&=0xfe;     
/ f  H  v1 p+ D" w7 O/ G8 `0 [      _NOP();
8 x# o( Z3 ]9 B. `" q+ W      _NOP();
1 r1 s8 }* v  f5 B     }
7 r. Y0 N- }* j7 B   P2OUT|=BIT0 ; //CS=1;, w5 V) C+ f, y% [: L
    _NOP();# r5 T) _: `  a; V. n, A$ q1 W
    _NOP();
; j4 k2 F3 Y& e+ |$ J; N) j# D    _NOP();
8 M/ r0 N! d% v   return read_data;
; s  M+ f! ]6 j3 N3 T  
, ~% ~/ d* V$ u   
9 r0 F" `3 i* B* F& k}5 M- I% e, H  l& i) u* t) J
void erase(char command,char erase_address1,char erase_address2,char erase_address3)' v$ R' M  t, @
{
3 i# s& i/ k6 a1 z% y1 |  X  P2OUT|=BIT0 ; //CS=1;  
" e. a6 W4 |; Z4 V8 z- g  P2OUT|=BIT5;  //sck=1;
4 f8 v/ S/ t1 p5 _( S  _NOP();
$ V) N5 V8 q  R# g9 C  P2OUT&=~BIT0 ; //CS=0;
! F8 K* `1 L! W5 ^& X  write_byte(0x06);( K2 F) b; w5 t' \
  write_byte(command); ; j* ^$ \8 `7 B# r
  write_byte(erase_address1);, {( A0 ], z4 a, [* t0 `  C8 t
  write_byte(erase_address2);
& i( ~0 D6 R7 h1 `- L) Z  write_byte(erase_address3);
$ O2 x+ i2 V- s# A- [  P2OUT|=BIT0 ; //CS=1;
6 }2 A' `7 W( ]  _NOP();6 f4 Z' p! s9 s
  _NOP();5 u1 Z( ~) c0 \: s
  _NOP();
! y8 p2 D/ s+ V; [}
4 y5 S# \) z* m8 zvoid delay()
, }- h$ ]) e- i* u' Y- R/ ?8 s, o4 I{& X; G9 @0 i. e+ x: z* ~
unsigned  int i=0;  [- n) Q) j( s  x/ N0 o: b
unsigned  int j=0;1 h' |4 [* S: e8 S
   for(i=0;i<=500;i++)% D& m$ I" z/ ]1 v: g
      for(j=0;j<=250;j++)& I* U4 [. Y. ]$ c
        ;0 v6 s! _9 G& x+ M4 T1 Z& r
}
, P2 d9 n# W+ ^; ivoid read_busy()/ z8 M7 d" m4 Z: a3 b
{
* y2 C3 r3 l9 H/ e- Z( p: c   char read_data=0;   
8 M# U, d% Y/ M/ q0 ?   char num=0;
+ {# z! b" P0 u4 I7 O) G" b   P2OUT|=BIT0 ; //CS=1;  / |* b7 p4 T: k( w6 x1 h- c* [
   P2OUT|=BIT5;  //sck=1;
+ H- i' J# S& u   _NOP();
( ~$ S# j# W* V   P2OUT&=~BIT0 ; //CS=0;
0 t% H5 o' m% @$ g- X- X0 T7 w8 c   write_byte(0x05);        // read the SR1  
0 I' V0 M8 R7 r0 u4 |   do{, n# c  n# ?, z
                   $ ]$ p2 K' P, Y- E+ |+ a2 S
            for(num=0;num<8;num++)3 G! J2 v& j' k% {+ n) M
             {
! P+ Z& B$ c% I6 [               P2OUT|=BIT5;        //sck=1; ; K) W% `! \" G8 y3 }
                _NOP();               
: X& B+ Q/ W$ x6 u                _NOP();
! S. ?* P* C6 p6 `                _NOP();7 W/ o2 U8 |6 d6 l1 x, k/ j+ [
                _NOP(); 0 A, _9 c! d& Y! T( Y6 F
                P2OUT&=~BIT5;       //sck=0;              + W) {. P, U9 B) C: k$ k
                if(P4IN&0x02)( U+ N6 r# }% h- N# _1 P+ W
                 read_data|=0x01;7 n, w" o3 _* Q* Q) C( w
                else, @. Q% H8 H4 \7 J1 l1 C9 W) i
                 read_data&=0xfe;                % X4 a; f' a% Z! Q; u' r
                 read_data<<=1;# S" e3 Z  k. O: s% @- B$ B6 J; |4 b
              } # X5 s. @6 p$ D9 n5 G
            _NOP();
: C8 y4 B4 J7 @' S9 P8 y            _NOP();" g) V4 n+ @6 ?7 N" i
            _NOP();           
  i' h6 `) K. M4 y0 p/ x' n          busy_data=read_data;  ' A9 J: V/ N2 I9 a3 Z
     }
- `, ], E0 X3 ~   while((busy_data&0x03)!=0x02);
9 {$ k+ C2 G2 t( S% n: |3 O6 |4 i3 H  P2OUT|=BIT0 ; //CS=1;6 H; I3 Y. e( K/ [+ P4 {5 G4 y# L
   
% O8 u2 F/ z) u  v  e) ]  + F6 d9 O$ H+ ~7 P
}
; Z, E; @, D# c+ c3 w
2 H8 ^( e* D1 c2 z$ v3 Q6 j用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
7 U. w2 D8 q# {3 q9 [
6 u8 O+ R& W) y. h0 N
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-1 15:23 , Processed in 0.140625 second(s), 25 queries , Gzip On.

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

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

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