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

msp430 模拟spi实现对flash的读写

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <msp430.h>
% \; s4 Q( Q5 E/ G; \char readdata=0;
2 w7 ]8 Z6 m8 f9 M7 T# nchar busy_data=0;
, _- i; l, D9 P1 c$ evoid write_byte(char data_byte);( {6 D; U5 |: O8 z) v+ ~
void send_command(char address1,char address2, char address3,char data);// command and address and data
& H8 w' }% ^  R# N/ v# Uchar recive_data(char read_address1, char read_address2,char read_address3);
8 g! r% j9 O7 N5 j, Ivoid delay();3 |; S: k2 a" r! R0 Z, _) t0 P
void erase(char command,char erase_address1,char erase_address2,char erase_address3);  N) P. A* _" h' Z" d8 b  x
void read_busy(void);
2 u' Q, u6 w( k1 O7 j) h$ h( \5 qint main( void )
! [4 o" x) V7 ]: [) B& S- l  S{- ^9 F/ ]4 Y5 y2 T8 J2 j# B
  // Stop watchdog timer to prevent time out reset
% {1 m6 |# T4 D% ^* k) h      K# A1 Q: Q, k$ ]  O
    WDTCTL = WDTPW + WDTHOLD;
) e: K; L7 V- W  w4 s    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
5 h0 \6 c  ^! O. i+ i0 q6 D    P4DIR|=BIT2+BIT3;   //flash  wp si output6 L# k( `: ^3 t5 v$ D' q$ c8 k
   0 x& G+ [* ^1 N4 }% f+ k- c8 P; @0 `
    P4REN|=BIT1;            // so pull up
6 E; ?; ?0 f' M' a+ D$ a9 c, ^    P4OUT|=BIT1;             //flash so pullup  selected p4.1
  t, }$ p8 I4 P& j. J& o    P4OUT|=BIT2;             //wp=1
; h- j! i4 g5 f- S/ Q' w# O   
1 O0 Z. V, g# I/ G4 s5 k/ Y    P6DIR=BIT4;
4 e) b9 L5 a% @1 z( p8 L/ t+ T    P6OUT=BIT4;            //led' |" y4 v9 Q- g- ]
    P2OUT|=BIT0 ; //CS=1;  
: w1 C  A2 B2 n) O( s7 e    P2OUT|=BIT5;  //sck=1;
, h! m% ?, }( i    //P2OUT|=BIT4;  // hold =12 o9 Z% f& s2 c5 \% Y
    _NOP();
! C9 _  O& A" y1 M, @) q# q    _NOP();
1 `  D$ H& q. U9 B    P6OUT^=BIT4;
) t" i- d( i4 Z  A8 e+ k    erase(0x20,0x00,0x00,0x00);      
$ l6 n) O" q) y  z    read_busy();   $ n6 W: G" {& j8 Q2 n
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
0 s4 a' F0 B+ j9 |    read_busy();  
: i8 S2 H$ Z. h: \+ |     readdata=recive_data(0x00,0x01,0x01);   
' i: e2 z+ f. q# y, R' [: k7 }    while(1)7 P$ X/ p4 w3 `1 U
    {7 r; u7 o( k" J' K! [( a. X
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
0 _" _. K( w$ |" ?) J           3 \- I: d- x3 c
      // if(readdata==0x00)
+ W9 F' m# v! p4 u# L- y$ o       P6OUT^=BIT4;9 g! ]# v" A# H/ ?: O5 E
       delay();
  o% F% E& t1 \" f+ q) t    //  readdata=recive_data(0x00,0x01,0x01);  7 q+ S  u4 R% D4 D0 N8 i0 J* y: i; m
    }
0 U* z' a% _' K! _8 \& l2 L# P  
6 n  v% e+ F7 ^$ K5 q' S}
5 D) Q" ?  k5 g# g" ~+ r. [+ H" _' T4 k* j  }void write_byte(char data_byte)  `* a7 X  v- F) f& y4 c- I- v
{
9 E2 }& `/ r, Z" L6 E! p+ l char num=0;    f% o1 B# s; U$ |& @7 u& W
for(num=0;num<=7;num++)
9 q5 K7 _' g; x9 B% y9 c- R# m   {
# U5 f  f$ J( c! y  . e" e, q' }: A4 G; {4 Z' z% h
     if(data_byte&0x80)
0 l7 @' Z1 O& A0 K; [0 X       P4OUT|=BIT3 ;                //si=1;
/ y+ n! X1 L* v' H6 t# Q     else
9 i( x) O3 j- N! Q+ W/ V7 y       P4OUT&=~BIT3;              //si=0;  2 w! O% A0 q- o% _2 C
       P2OUT&=~BIT5;             //sck=0;4 |) y# \2 G6 j' t1 l
       _NOP();  * ^( d& v/ _) p) r! s9 I( E+ _$ N  Q
       _NOP();! O2 W" M) S4 p( a: B) F
       _NOP();
% M0 O/ T; C5 A: d9 Y, }7 g       _NOP();
0 Y) r2 }$ l0 o4 X        data_byte=data_byte<<1; //数据从高位传输  / Z; q( t/ X( H6 M- p
       P2OUT|=BIT5;        //sck=1;     b; P5 A" i, x  ^
        # P. t, C3 U  a$ o0 f1 }2 I. N
      
* v# e# J5 g2 k; v) j5 O8 y! r( }   } 6 T: V) G) r' G, y
}
- C) V& F4 E/ Jvoid send_command(char address1, char address2 ,char address3 ,char data)' E8 @; w! d$ L, G! h8 T( s
{
* {- d8 X. D1 J9 |6 o0 n2 W  P2OUT|=BIT0 ; //CS=1;    S9 @7 Y( @. _0 J! \, g0 x
  P2OUT|=BIT5;  //sck=1;; n# @6 c  O0 j1 e/ y& _. W
  _NOP();
! S0 ~7 Q9 Q  o) w$ \# q  P2OUT&=~BIT0 ; //CS=0;* |! }& z4 t+ _/ V' g( M
  write_byte(0x06);   // write command/ a- y8 q; p+ N4 h( A5 i
  write_byte(address1);4 i, w$ g* P  l. ?% B# T, e
  write_byte(address2);
6 a" `% A3 R5 m( ?; n8 M  write_byte(address3);( I! H9 {, u% y( R3 T- {9 e# T8 b
  write_byte(data);3 N4 e0 c8 K, C. {- X
  P2OUT|=BIT0 ; //CS=1;
8 }  i. O4 ~; O! U& S  _NOP();
0 Y9 C# t+ T' ~- t0 I* T  _NOP();6 T" d: z5 C/ a
  _NOP();2 J. M! s& C4 f! t1 r
}
) ^/ O# c! l( X/ S2 x, d
& h+ k7 \" e0 u! P" |/ bchar recive_data(char read_address1,char read_address2, char read_address3)
( @" [* j  B4 ^2 Y7 F. H. l. i2 R- U8 r{
1 o& j+ W$ i! y   char read_data=0;   + |: E4 D0 h8 }2 f
   char num=0;
% _& L9 C: W+ t- W  
- g8 z& d" i  y  P2OUT|=BIT0 ; //CS=1;  
) C* K( t0 i# t" d+ c* o4 X  P2OUT|=BIT5;  //sck=1;- @) `& k# O" l' [$ L1 K1 Y
  _NOP();
3 U3 j7 {2 K" U- A7 S4 Y  P2OUT&=~BIT0 ; //CS=0;
" G0 ~* _2 M5 H. ~  A  write_byte(0x03);
1 |. q5 X# y3 U- T& @, g# n' F  write_byte(read_address1);  
0 X! ~/ H3 E  O2 N6 F. k4 D  write_byte(read_address2);
8 i- n0 t! k/ T8 Y4 I& w  write_byte(read_address3);
, _5 s/ H" d+ ]! k- p% m8 n: Z1 _  2 I% a) x& [, \5 ^; f, a
  for(num=0;num<8;num++): A+ o! d# Z2 n7 x  M& A3 P
   {* q" N( _7 S. s/ ?0 _
     P2OUT|=BIT5;        //sck=1; 8 _3 c( M/ P9 |  E) i# n$ L9 I
      read_data<<=1;
- j% y+ z" p( s! r! L      _NOP();
. A$ h* r/ i6 B2 v      _NOP();
5 u, w! ~. C! B7 u      _NOP();
4 B2 I& J  A) @      _NOP(); * o+ J# {) G- ~! q" I
      P2OUT&=~BIT5;       //sck=0;
- f8 ^  u6 [( K) Z    if(P4IN&0x02)
, }( e# \9 _# y: K       read_data|=0x01;
2 _) C& ?/ E3 d7 i9 f+ x- W3 u! a* h    else* @$ H1 l- _9 e4 }3 J
       read_data&=0xfe;     
$ P. C8 _# q/ v      _NOP();& M3 n* T) L; P% B+ }
      _NOP();/ ~" f$ s4 ~* C8 c% r0 X
     }
; T$ i, s$ t5 g* E4 H0 ^   P2OUT|=BIT0 ; //CS=1;; X5 v% ^; X4 x0 W" {% I* D+ i
    _NOP();! x" q! b( U/ L" Y$ u* j
    _NOP();; M6 `$ \5 U  }* h/ ]7 v
    _NOP();
7 ]! F, A) i% z9 ^) [   return read_data;
8 p- v. A9 l# k* F/ p* h  ( ^+ L( ]3 O) J: x
    1 z6 A8 S5 q2 B& C& h  n( m& q
}& ~) y. m3 G* \6 R) A  ]; g% p
void erase(char command,char erase_address1,char erase_address2,char erase_address3)4 g) L2 V1 ^& u" x
{' P( @/ K% [: W, z2 {$ \
  P2OUT|=BIT0 ; //CS=1;  6 E! {9 e  p5 C% F2 Y
  P2OUT|=BIT5;  //sck=1;
; e2 V; S) w% x5 [8 j3 d  _NOP();- }  i3 r2 M: i3 L7 j
  P2OUT&=~BIT0 ; //CS=0;; q7 B4 ?+ r6 f
  write_byte(0x06);1 {+ g! o1 I! k6 _3 S" q
  write_byte(command); 0 O+ l6 |  S; J( ~4 S
  write_byte(erase_address1);5 A& H+ b) O) [# D, c) X9 c
  write_byte(erase_address2);
0 \9 j* |& M3 M+ ^3 a0 l7 p9 b  write_byte(erase_address3);+ H* ^0 ~3 d% ^7 ^. x- l
  P2OUT|=BIT0 ; //CS=1;3 p/ C& m8 B4 I
  _NOP();4 Y* b( G+ M* z0 s& I. J3 C, O
  _NOP();. f  X; I  _  t
  _NOP();6 d3 h2 D) z! b/ X7 W
}, N, V( a; H" P# W+ Z
void delay()4 H' }3 q! m% a  w: {" s0 {7 _8 ?
{+ @6 @. h5 c1 z0 O8 c
unsigned  int i=0;0 g5 [/ Q- m& D' L! d( ^
unsigned  int j=0;
0 c! ~3 L, F) E   for(i=0;i<=500;i++)
0 g: Q) M5 c" h- Q8 O      for(j=0;j<=250;j++)
, C& G% J/ k! ^0 f        ;
/ |3 ?3 ~8 b* E}
( t/ I8 B- D# n- j+ z* mvoid read_busy()
' b8 f4 K$ |2 S7 P( c9 p3 c{
8 Y; r% H( P/ I1 s" |. Q. |   char read_data=0;   ! G9 z1 m: x8 t, ?6 p
   char num=0;! n- h" U0 e9 L% ], N1 f
   P2OUT|=BIT0 ; //CS=1;  / J% V% i/ f! I* n
   P2OUT|=BIT5;  //sck=1;
5 Y; c( @, l7 R. J: {   _NOP();+ S% g1 {, @& k+ H- M3 R6 {6 _
   P2OUT&=~BIT0 ; //CS=0;6 Q& V% Z2 G7 ~; w  [. w
   write_byte(0x05);        // read the SR1  
3 _9 Z7 T% d7 v   do{; v% T8 v: b% }% P
                  
1 b5 _+ h% `- N            for(num=0;num<8;num++)
9 J# ?: h4 Z7 k9 w4 }: u/ V7 c( E             {" `4 a# i" {( z5 N1 n) d/ h
               P2OUT|=BIT5;        //sck=1; , \9 p) t, w# q8 i4 g: C2 ?
                _NOP();                & |0 _6 x$ d# N  v4 q4 f
                _NOP();" o( a) l! `2 |
                _NOP();# k1 W( s2 S) h+ H! c6 n* c
                _NOP();
9 L8 p" t6 |0 w2 I2 u                P2OUT&=~BIT5;       //sck=0;              $ m8 M: j& K" f6 m5 y3 D0 p4 E
                if(P4IN&0x02)
* S! t0 B+ v1 c4 u% l. Z( h6 m                 read_data|=0x01;
( H# @9 i# ]7 i; w9 |                else$ U% ]0 K9 [& M
                 read_data&=0xfe;               
. k4 y4 P: `0 y7 \# M                 read_data<<=1;
. w9 T# r4 U8 ]2 B  `6 z% t" N              } ( }! |2 E& ^+ l- ^  m# D) f6 ^
            _NOP();4 _6 n; {+ w. Y# h% S8 U: g
            _NOP();6 q& B8 t; {7 ^8 m
            _NOP();           
8 X: F1 ?7 y8 J% Z          busy_data=read_data;  ' F! [. d9 ~6 W" Q
     }0 t4 a' v0 c% Z# {7 @& i
   while((busy_data&0x03)!=0x02);
: C& i% ^6 A! }; X% E% p5 }6 }8 U  P2OUT|=BIT0 ; //CS=1;
  J4 ]/ f" y4 |: ~  l   
% [1 W& |$ k$ o9 N7 ]( [" g  0 y' k9 N* L% n
}6 V  E9 f! G' H; e0 z( w( t

5 F0 ?0 j$ e7 Q) N用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
) r$ Y" a7 \0 D, j2 {: P3 L1 p4 r/ d7 c3 x( X9 e& U% S/ K
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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