找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h># t$ }8 @- t' i: C2 ?
char readdata=0;$ g% l$ K* x$ A( B
char busy_data=0;
9 i- |1 ~$ W: s# R/ W' wvoid write_byte(char data_byte);- q; Q% u9 ~1 M( V! O
void send_command(char address1,char address2, char address3,char data);// command and address and data
8 |' Y0 p8 ?2 q4 Fchar recive_data(char read_address1, char read_address2,char read_address3);, x& U, z) N# u$ _4 @, w2 L- e
void delay();4 V3 L  F+ x8 o, x" b
void erase(char command,char erase_address1,char erase_address2,char erase_address3);* G  |/ w# ~6 X4 }- s% \+ Z1 h
void read_busy(void);* i- o, X& K! ?0 n. g6 t
int main( void )2 j8 M7 X; G" W, H0 ~. F
{2 k/ h. d5 f% _) b
  // Stop watchdog timer to prevent time out reset
$ ?+ O" D. i; X. ~   
: V. c3 i& l1 m7 R- }9 _+ j$ x! ?    WDTCTL = WDTPW + WDTHOLD;
& y- k- M7 Z/ ]: d* [    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
: `+ ^* I% S0 `    P4DIR|=BIT2+BIT3;   //flash  wp si output
- ]3 E8 W& Y% x3 N   
- b3 }2 p7 N! P. e    P4REN|=BIT1;            // so pull up
+ ]) o9 r7 I( ]% q* I" d    P4OUT|=BIT1;             //flash so pullup  selected p4.1
% x. p% p+ _* d. }    P4OUT|=BIT2;             //wp=1
" i4 D8 ~. s0 n) p   6 X2 m, |: E! p8 L
    P6DIR=BIT4;5 R8 Z5 L! E, }* [3 E+ ~$ G% H4 G
    P6OUT=BIT4;            //led& ~+ }4 L& Z6 Z9 e+ r
    P2OUT|=BIT0 ; //CS=1;  3 {- G9 h9 o. d/ ~+ g/ y
    P2OUT|=BIT5;  //sck=1;" E0 m3 H/ A/ W
    //P2OUT|=BIT4;  // hold =15 U3 J" T! d0 N/ _, m3 G
    _NOP();$ {/ P9 g& b/ Z& Y6 o/ S
    _NOP();
& ~2 q+ b4 _7 j    P6OUT^=BIT4;5 ~4 v$ g3 m! H# s: y
    erase(0x20,0x00,0x00,0x00);      ( @# A7 ~$ m& N
    read_busy();   ) Z+ l& D! r: m) ~1 Q) B, b% N
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         & L  Z* |! v9 ]! f3 a: j7 f% H4 K
    read_busy();  
' j# G; d0 k1 _     readdata=recive_data(0x00,0x01,0x01);   0 q, C( F1 I% C  |; z/ w3 G& F; t
    while(1)' U  y3 J' L' _4 D% Y
    {6 m( A8 P$ e+ ]+ a7 }
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling& x% {* [% ^: I5 ^) w; }6 V
           
; r8 H* @2 k, k  G0 l# L1 Y      // if(readdata==0x00)
( q$ c9 x5 h0 Q( d       P6OUT^=BIT4;
- Q( m2 Q/ F5 B; S       delay();3 t3 |, N) D! K5 S4 U- m
    //  readdata=recive_data(0x00,0x01,0x01);  4 E- @% b$ s4 R, H( \
    }8 _. P) w; G% R& ^) q3 v' `
  # K' p: K2 ^9 a, \* x
}
' q7 o& y3 v2 r2 D$ C: n: E; v- evoid write_byte(char data_byte)
; f" q2 C; C- g+ x  o& k. b1 o{
# v( Y' z+ @6 H3 V7 D5 f char num=0;  5 w4 T! G" T; O% S* a
for(num=0;num<=7;num++)
( ?0 [/ z! f3 E2 S& C: O8 p8 w   {
, o3 z( h& f* Y  G  . _: o7 N" w9 G
     if(data_byte&0x80)+ n' Z/ h$ p4 g( e$ o3 W
       P4OUT|=BIT3 ;                //si=1;0 e; d8 I+ A; V3 v9 G( N
     else
- w' m/ }9 d# E" y3 I       P4OUT&=~BIT3;              //si=0;  
& U5 I6 w; E7 M8 M# K       P2OUT&=~BIT5;             //sck=0;' N! Y* W3 d$ q. C% {+ [" c' C  J
       _NOP();  * I8 M3 M+ _( ~! h( I8 Q% J
       _NOP();
- u. x6 V6 B" C8 p       _NOP();
7 [. j: {9 b1 k( b" f       _NOP();
6 X6 A2 m( {3 G& R        data_byte=data_byte<<1; //数据从高位传输  
) i3 p1 k) e2 r! n1 N1 n       P2OUT|=BIT5;        //sck=1;   - r4 {# n9 K# m$ ?3 e
          t; ~" f. r1 s# B0 P/ S
      
, F. D# n# Y2 G8 |, X   } % I% b1 a5 A$ @/ M" \! G4 G
}
* k& I( j' x/ Wvoid send_command(char address1, char address2 ,char address3 ,char data)
" E& H6 K+ F" G2 _{
9 y; F0 P/ k7 F- H  P2OUT|=BIT0 ; //CS=1;  # X% q3 Q( h, Q
  P2OUT|=BIT5;  //sck=1;* ~7 O% C( }# c
  _NOP();
% A* P* G8 M% K- i+ t  P2OUT&=~BIT0 ; //CS=0;6 F% }. T; V4 k" Q2 @, L2 p% Z
  write_byte(0x06);   // write command
* P$ k  i0 a6 h3 i  write_byte(address1);9 q6 N- A7 P) K6 o, N7 j& D
  write_byte(address2);
2 c1 J8 d' }- w& Q3 O* Z" j" P  write_byte(address3);
+ ~; O+ ]; C3 N  write_byte(data);, s  B# `" p$ D9 I
  P2OUT|=BIT0 ; //CS=1;
* p- H* ~$ i3 f. G* t# t  _NOP();5 t- o! z( z: P: {
  _NOP();; F4 X( x: }, _! b0 q
  _NOP();* @. ]' b2 E' d7 Z6 l0 Y
}
6 P+ V7 Q5 M  ~& X+ Q/ ]
; Y; y% A. j' E8 F/ k9 j, ]char recive_data(char read_address1,char read_address2, char read_address3)6 f. r( Y0 Q" V: u' }
{/ ~1 l. F, Y  K: i+ g- H* i1 L# c( x
   char read_data=0;   - ^" u' N9 z" Q8 F6 r7 s
   char num=0;) G' e4 G' Y  V/ Z, {
  / |) R1 v9 S4 f
  P2OUT|=BIT0 ; //CS=1;  
: h7 g# T5 a: c9 J  P2OUT|=BIT5;  //sck=1;: y4 M! c' T' P
  _NOP();/ ?5 s' p0 P6 _9 B$ }9 {3 v
  P2OUT&=~BIT0 ; //CS=0;
) A1 S0 ]6 ^) x4 J4 a# K  write_byte(0x03);9 I* H! J$ n- n, m# k5 M3 w
  write_byte(read_address1);  
7 _5 B" B1 s6 O) o  write_byte(read_address2); ! k4 H' I* Y, {; R) O9 q
  write_byte(read_address3);
$ L* J2 r1 M" n& n, u) c  : |- ^* @. |7 J) F
  for(num=0;num<8;num++)
2 B- P5 T1 {* {" |' Y5 D   {
: r/ W( |& k  i- q5 l2 c     P2OUT|=BIT5;        //sck=1;
2 m6 n; i5 Q& e1 b      read_data<<=1;
0 G9 c: `+ M& e& D      _NOP();
5 F* Q8 i2 D0 E2 M, Q8 V# v      _NOP();/ V7 g2 ?' ?9 x: m
      _NOP();
# c9 X8 r2 [; V+ W, Y      _NOP(); ' K' F$ G/ n) N1 z4 B  J0 [
      P2OUT&=~BIT5;       //sck=0;4 r5 X+ h, }& [/ o$ `; S
    if(P4IN&0x02)
6 D6 @1 ~3 _/ M: E8 Z7 O0 h       read_data|=0x01;
0 x; X1 j" t3 u7 ]) _% C! l8 G  U& s    else
4 d; U  A% W8 y       read_data&=0xfe;     
: n$ p5 A% g" n      _NOP();5 [: ]8 D+ |( v
      _NOP();
" o9 Y# V$ ?+ n  I" e( c     }
4 p; D5 I3 a9 H/ X   P2OUT|=BIT0 ; //CS=1;
! ]& o# j/ O2 j* j    _NOP();; G5 D! _2 `: ]) w  V6 u8 N1 ]
    _NOP();! f, i) z. A2 B1 Z
    _NOP();+ F. n4 A0 r/ C. n- `
   return read_data;
/ X6 r! X, j: ^& n2 _: \: F  . V' Y0 A" Z6 L4 }1 b! o, i
    0 U! D4 ~) x6 P, ?7 B0 Z
}) X6 {3 y$ d! i1 S1 F
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
( u" o7 k; l( K/ E{
8 t# n5 t+ w. T  P2OUT|=BIT0 ; //CS=1;  
  @$ T, v1 E. `: \$ i" u' {  P2OUT|=BIT5;  //sck=1;2 J/ p; a9 F8 @9 ]2 r+ r' K
  _NOP();9 G+ Q2 U( n8 W- z/ y+ [! @
  P2OUT&=~BIT0 ; //CS=0;  Y/ n( G7 W8 t) x
  write_byte(0x06);
" f* w; p& G. B! R2 d5 Z# S) l  write_byte(command);
. w9 X  a& h7 }1 X- ^  write_byte(erase_address1);5 |8 H' T3 X! `$ m: b5 m! B
  write_byte(erase_address2);
( A1 Z  g+ }/ _- @" q- Y6 U  write_byte(erase_address3);
: I, n) G8 l+ Z8 V  O  P2OUT|=BIT0 ; //CS=1;
, L9 A6 H% M  l$ K# F  _NOP();
7 h; [5 T8 e* Q! d+ [  _NOP();2 V' y8 Y- ^8 C6 b
  _NOP();  h$ w8 @, E5 z% C6 {: ]
}
- j6 _' W. I& p6 Nvoid delay()( h' h" D4 p' ?- w! W/ a
{0 \. |% l# l2 S% c" J3 Z
unsigned  int i=0;
: c* r; \7 W  K3 I+ \2 u unsigned  int j=0;4 D( i# m: g3 O7 I, k; k8 n9 M
   for(i=0;i<=500;i++)
6 Y6 e+ Z% w. V& k      for(j=0;j<=250;j++)) q3 J8 {# P6 C4 ^1 f6 h
        ;1 Y6 V( t& |' {0 z: O
}
' @+ K; \( N; n1 N- i# I  ]void read_busy()8 B1 r- D' c& w
{3 }* Z7 @/ d* _! I7 u# z1 ^2 M
   char read_data=0;   . Z# ~9 f- u; ~# _
   char num=0;
' L# G1 L+ \0 S3 s6 Q. F! b) @% C   P2OUT|=BIT0 ; //CS=1;  ) j) S' P, k( y7 n; W8 T
   P2OUT|=BIT5;  //sck=1;, `) I* p# r$ F* S( K
   _NOP();
+ u! O: G- U' E4 z   P2OUT&=~BIT0 ; //CS=0;
* I' H' T2 i, W, I   write_byte(0x05);        // read the SR1  
) h, l0 S' t' Z! Q- n3 k   do{9 v; Y5 m2 w$ T
                   4 S( L0 W; w( `. K5 N
            for(num=0;num<8;num++)- g: l  Z! P, f0 b6 e' g: |& r
             {
! j% J5 N2 C1 X; M* A8 Y$ ]7 D               P2OUT|=BIT5;        //sck=1; ( _0 Y4 l, D4 @8 w. d
                _NOP();               
2 t5 Y' P: \" m& e0 }. V4 Z% x* S                _NOP();- J) c( K/ t# w6 S9 y. D0 \
                _NOP();
1 f! _: I6 B! x) n                _NOP();
. q+ C! F, Y1 o: Y2 O                P2OUT&=~BIT5;       //sck=0;              1 A6 }7 _) s+ K* Y
                if(P4IN&0x02)" i: O2 V" l- F) M8 |9 C0 R- L$ e
                 read_data|=0x01;
  b" S4 `# q" P1 W5 a1 w                else  x/ e. y; }: Z6 b# _' d% K* r+ [
                 read_data&=0xfe;               
3 X6 U% K" b2 A* E                 read_data<<=1;
  o% E% T$ {$ n9 t4 s. D9 @# R              }
2 r  L" z2 _! \0 s6 M            _NOP();0 [7 b3 j( B5 l* `- i: n8 Z
            _NOP();
3 X7 q/ w& ^- f1 g  K4 ?            _NOP();           8 z/ }% E1 `) s9 m. B# E3 y
          busy_data=read_data;  
; K* W1 x4 ^( s2 u1 y% A! x- E     }# b; u8 Z% `* P5 x) F7 p9 S& I
   while((busy_data&0x03)!=0x02);
$ G# Z, N! E8 ~2 \3 b' w# E  P2OUT|=BIT0 ; //CS=1;
7 v, a. W1 H0 }6 r7 e- q. b# t( e    0 ]' G6 F6 w; i. }' R4 R( u+ p
  
0 x2 u. _5 r" @- E4 Z$ K" I}
+ O+ a( b. ?# ]
5 Q, W- ^" C5 Y用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!0 k, u- x/ _5 ]1 |7 f

! k  ?1 g) e6 m! _/ J& H  f0 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:55 , Processed in 0.053423 second(s), 33 queries , Gzip On.

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

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

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