找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 75|回复: 0
打印 上一主题 下一主题

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>
: s, C! U* d* h; O- ychar readdata=0;
3 ]/ l7 h+ V) M. s. t4 Cchar busy_data=0;, \+ H1 ~* Z( O$ p" f
void write_byte(char data_byte);1 M/ j) h& B# R% T& Z% @  n
void send_command(char address1,char address2, char address3,char data);// command and address and data
' |) U/ t0 e$ z4 R) h0 ichar recive_data(char read_address1, char read_address2,char read_address3);0 H2 R/ I0 O4 N+ y. o6 H9 L
void delay();( i5 q. J2 l1 p0 U" }, x
void erase(char command,char erase_address1,char erase_address2,char erase_address3);
( x/ J) q. v& C! {/ O: Zvoid read_busy(void);
% _; d. ]) A8 A0 K8 A* xint main( void )
$ A& C! C+ j, ?. z1 `8 a{
: ^  S$ A* N+ u5 d3 }: B/ N  // Stop watchdog timer to prevent time out reset
2 j" d% X; I( s; Q+ @- d2 `! U    ' B7 E- o  P- ?) N" i  o
    WDTCTL = WDTPW + WDTHOLD;
( l% v2 O' O0 i9 y; b  _    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
" Q* \1 ~' q9 M9 |5 t) `1 J    P4DIR|=BIT2+BIT3;   //flash  wp si output
! Z8 M+ H  P* E+ J' H   
! u; v: U6 E7 m    P4REN|=BIT1;            // so pull up4 d7 S0 P9 ?( V. Q, z: X
    P4OUT|=BIT1;             //flash so pullup  selected p4.1# R( X5 S& F8 ^) }3 |
    P4OUT|=BIT2;             //wp=1
0 Z7 h( Q' ]6 D! U   ) @; K  W- H/ a; R
    P6DIR=BIT4;
: I! n8 G9 `; ]0 `8 M    P6OUT=BIT4;            //led
$ W9 G" g$ n: A' {4 s    P2OUT|=BIT0 ; //CS=1;  
0 V, P: z* \6 a1 V    P2OUT|=BIT5;  //sck=1;# ^0 V  @* u/ A
    //P2OUT|=BIT4;  // hold =1
+ t, w1 u, x8 x1 D    _NOP();
- ~& a/ `9 U# A2 }* ^5 x( B    _NOP();
7 M$ m# k4 C: q8 T    P6OUT^=BIT4;3 N# o& U1 C7 w& ^/ @
    erase(0x20,0x00,0x00,0x00);      
# }/ n8 N/ m* V9 p. U- i) G    read_busy();   8 N7 y; }1 x7 ~8 Q' n
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         0 g) g4 E" P! D2 K1 @4 U
    read_busy();  
& x; q/ S' J. V6 A2 |3 r. _  `/ Q% @3 Q. E     readdata=recive_data(0x00,0x01,0x01);   
" W& a, E+ Z( y/ w0 J1 t4 T: S    while(1)
4 o/ d1 ~# I# m1 J6 b7 V    {  i7 D9 O& W& {' J# R
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling. W' `5 E. s; x
           9 e8 r( m1 w4 C! W; T0 A
      // if(readdata==0x00)
$ b2 Q& T4 ^2 b5 T" i, ^/ h       P6OUT^=BIT4;0 k1 M, y% [3 }$ U4 `
       delay();$ A* d% O6 F6 E% _# v) m! A2 m- J+ ^
    //  readdata=recive_data(0x00,0x01,0x01);  . R/ r& i! E0 k+ k1 q& b; u2 s
    }
+ a+ z! L* C  N1 d. r  
1 Y  V, }! F# V+ R. f; z, h}
/ f- M- {8 w+ K$ }' @void write_byte(char data_byte)
9 h* F1 r& Z- l; Q$ F% ]; x{
1 Q9 h) |8 O5 U$ P8 _ char num=0;  & N: g9 a1 W8 `& t' d/ q! y" |
for(num=0;num<=7;num++)
/ ^. @- E  z7 J  J- J4 B5 l   {; e. ?6 T" S$ l: I. C3 z1 i
  
6 x/ d# C  M+ s$ f- B     if(data_byte&0x80)
$ z) ?% R$ W# R: d       P4OUT|=BIT3 ;                //si=1;
: T" F7 {; ?) ~1 Y, _9 N     else' d- r2 w( b5 g9 O* j9 C
       P4OUT&=~BIT3;              //si=0;  
: d- g/ Q! b) f# H2 K, T$ N' z       P2OUT&=~BIT5;             //sck=0;
7 P* v7 x, c! @1 c       _NOP();  
8 O! Z6 F3 {7 k       _NOP();5 V9 a4 n& S: G# W" n1 }
       _NOP();
- h3 _# S3 W3 J/ p7 T% M% a9 E: C       _NOP();
- u: F* C7 V6 I$ `: v        data_byte=data_byte<<1; //数据从高位传输  
3 f0 ]: X' N# H+ X0 Y. ~2 g$ ]       P2OUT|=BIT5;        //sck=1;   
7 [( f4 X: g8 k. j- w8 R* N! t% L! M        : F( y* ]) ^; N& C' j  M' S( v# S
      
7 \0 o$ u3 y! F/ a" P   }
, M4 k( j. @6 k. p}
" x) F& y* w- C1 h' y; J0 tvoid send_command(char address1, char address2 ,char address3 ,char data)
7 _( L' y; b* D2 m9 b* Q# F( U{
* e* o+ ~: r' T9 f* V  P2OUT|=BIT0 ; //CS=1;  
1 e, ~, @/ M  F  P2OUT|=BIT5;  //sck=1;) g; B+ s; _3 Q5 t. M, i
  _NOP();
2 F6 E8 H5 ~& X0 `3 e* c  P2OUT&=~BIT0 ; //CS=0;% y% j$ d) l" m/ Y3 I7 a1 H* M
  write_byte(0x06);   // write command
0 v+ N& }! ]% K+ x4 l  write_byte(address1);
' H2 U: C7 w9 K+ D; c+ b  write_byte(address2);
. B" n+ H% R* x  write_byte(address3);
' d( ?- [3 A. e" l  write_byte(data);
# p( k* Q& \  U+ Z& t  P2OUT|=BIT0 ; //CS=1;7 g9 K" ~1 E6 Q7 ^3 x, u5 Q
  _NOP();
& N5 Z: L8 `: w0 ~6 p  _NOP();
+ L% z" E5 Z5 p9 a9 {% V" ~" y  _NOP();
5 \9 P* i+ Y/ J+ e, L, O7 H}
! t" u& O) W" f. p
! [9 W- _: J0 v- ?- e+ Ychar recive_data(char read_address1,char read_address2, char read_address3)
: [; U  u# M& M  G: W{
0 h( s0 h( j2 m" k. U5 s   char read_data=0;   ; V6 x/ d2 \( X. k3 u8 ?
   char num=0;4 ~* J! u. }" v9 _
  , l! o( z/ T% \& v2 i4 _6 w
  P2OUT|=BIT0 ; //CS=1;  
  s# a- M8 n& A, D  P2OUT|=BIT5;  //sck=1;+ N5 }. h% ?9 ~4 d. i( y
  _NOP();
# d2 p  e, `8 E6 l6 A  P2OUT&=~BIT0 ; //CS=0; $ N5 h7 S' I9 o4 f' E! V& i
  write_byte(0x03);
5 W& z4 g2 R' T2 w2 q  write_byte(read_address1);  
; i$ i0 E# Z! G& C! ]/ H. H  write_byte(read_address2);
0 H8 H6 \# ]/ g2 \; V! G+ `2 Y  write_byte(read_address3);
) d8 T# }9 [3 u% P5 S2 E  
$ W) j* [. v) {3 P# r  for(num=0;num<8;num++). I) d/ o! B& G) w% y* [) C+ b+ V0 i
   {
- k1 }; x$ m/ G( o* b     P2OUT|=BIT5;        //sck=1;
* n9 t5 R+ J! e* Y! x      read_data<<=1;
, f0 j3 Y, Q3 A. j* _      _NOP();
, H) X9 H9 p6 O      _NOP();( N& C; U. ^9 H
      _NOP();8 }6 p, g( a! q4 P! c$ V  Z8 E2 N% h
      _NOP();
, y% m9 ]7 c4 C5 ?      P2OUT&=~BIT5;       //sck=0;
" h  }8 y0 s- W% H5 G5 N    if(P4IN&0x02)  H2 f5 W4 Z1 t3 ^* z4 W' {1 `
       read_data|=0x01;6 J9 q3 ?6 ]4 q( \- r; T
    else
$ L# z8 `- E/ F! u' B: J$ _! c# Q       read_data&=0xfe;     2 ^5 Q& d$ ]! h4 F; F
      _NOP();; J( i7 F* f4 e" V! A* P' u8 M# v
      _NOP();2 i6 Z5 u( \! U5 s' G; [
     } ! M: e9 N. Y1 Y9 w' V6 S0 e$ z
   P2OUT|=BIT0 ; //CS=1;$ ]! w9 l( r* j$ p
    _NOP();
, u4 r( \% u/ a) U    _NOP();
, q* G" y5 K: l$ z    _NOP();  I! d+ q3 g( i) c, ]  D& T
   return read_data;
9 H( U, P3 p7 H1 F  " P  }2 z1 \, L! Q8 ^
    ) m2 N" n7 m0 n& o0 x( t2 M
}+ r$ ^+ I% }9 J
void erase(char command,char erase_address1,char erase_address2,char erase_address3); w! t- `/ a2 o5 \* E
{, g, _* M2 q  ^7 |( [0 S
  P2OUT|=BIT0 ; //CS=1;  
* j6 b& b* e' ~! v8 l  P2OUT|=BIT5;  //sck=1;
% P$ V6 e# u! P/ ~& i# v  _NOP();9 K5 k- ?$ `4 b! t- _
  P2OUT&=~BIT0 ; //CS=0;& Q' ]& Y. a5 a3 U) D  l
  write_byte(0x06);
  A! m+ u8 u6 ^6 t1 V  write_byte(command);
4 d4 V/ [6 d, H9 Z- _8 ]  write_byte(erase_address1);; n: N* v8 e- ?4 V7 q& t4 _( `$ q  Y
  write_byte(erase_address2);
( h! N- I# M3 @7 I' m( h2 n  write_byte(erase_address3);! O5 L+ p) k; m' ?8 x. K
  P2OUT|=BIT0 ; //CS=1;3 E# b# e" d" r, v% {% C( G
  _NOP();. x6 D& t3 |: j2 X4 i4 e& t% I
  _NOP();
0 E: q. c; A' `& |! E  _NOP();( }# q/ ~: s7 k6 y( E1 o
}  O3 T, n/ k5 N5 Q3 Y- e
void delay()9 u' O7 V- i6 f0 ~
{* N$ \( U: y2 b9 C, d2 H
unsigned  int i=0;
7 I" X3 x+ I0 W  q7 G/ D, m unsigned  int j=0;
8 ?" a" @8 h0 _7 g$ k8 K   for(i=0;i<=500;i++)4 r$ @# V! O% Q; ?3 }
      for(j=0;j<=250;j++): W" P% }& _: L2 H
        ;6 w) U0 C& X8 P- g5 l/ ?5 T
}3 J/ n' y% W2 B/ ^: a; C
void read_busy()7 R; J/ ~5 r' h5 Y% @9 ^
{
4 M+ ]1 \% c5 Y- o   char read_data=0;   
5 N- L8 Q8 g7 g6 @   char num=0;
, X6 j/ ~3 W% C% K% |( G7 m" G   P2OUT|=BIT0 ; //CS=1;  
2 w3 K& j6 C! K; q6 R0 Z   P2OUT|=BIT5;  //sck=1;
9 n! [& `) h6 G3 J0 ^   _NOP();$ U7 Z) F' ]) j2 B2 V
   P2OUT&=~BIT0 ; //CS=0;9 r# ?! u! W" Q2 r5 |- c: G' N
   write_byte(0x05);        // read the SR1  
1 K6 p9 C: R: n5 L   do{! f) k3 W3 O" Z/ t' Z! ?0 \4 w
                  
' H2 o  A( D) @7 t8 P            for(num=0;num<8;num++)
  Q0 _6 i4 j: e! Z: S             {
2 h5 R% q: l2 Q, G  E6 k( D, Z               P2OUT|=BIT5;        //sck=1; # c% G- j6 [/ D( K0 g/ u
                _NOP();                & f; O$ S$ Q+ k1 M- R" b! r
                _NOP();  ~- Q* ~( u  C
                _NOP();
5 g# Z- k9 U! R% s: x" U                _NOP();
1 v3 m. F& S, o                P2OUT&=~BIT5;       //sck=0;              
0 Y' [' x7 I# e! }                if(P4IN&0x02)5 I( {- Q3 H7 _/ J
                 read_data|=0x01;
& B% {, |! i1 q" B' l! x! w. i                else& t2 [6 |( m6 {2 t# O. U# C
                 read_data&=0xfe;                : W0 S8 F& l' A$ G8 F4 {! @
                 read_data<<=1;
5 }2 y/ I+ V% r( a+ C              }
% v+ Y3 U, `0 g3 k- s            _NOP();$ A1 p1 e- S, ^( Z/ ~
            _NOP();( z; n3 j6 |" N, z0 q' v4 s
            _NOP();           * @& \- B" s6 @, C8 p: }% u: x3 R
          busy_data=read_data;  
& Z, x: b) I" F% ?( m! G9 D5 M8 S* a     }
; k, r  K; Y+ L2 M! i! |* l   while((busy_data&0x03)!=0x02);
+ T! c. @2 I4 I/ R$ B' X& {3 V! @  P2OUT|=BIT0 ; //CS=1;5 g+ e* ~" d4 n7 ]& l
   
6 S' ^. ?3 p- v! G* Q3 P  
7 ?8 G2 j) {' j: D0 a0 u& e}; g; w4 B8 K& [2 X9 j  t

7 B5 i* l  H7 `# t8 d用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!+ H" I, M/ A4 L( ~) y& a" w
' \3 L5 _) v5 y/ \+ C8 s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-4-17 03:12 , Processed in 0.056658 second(s), 33 queries , Gzip On.

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

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

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