找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>
; a3 X; R  _( I1 L" b; c' `char readdata=0;7 c9 D6 A* }1 j3 }1 |3 K6 h6 d
char busy_data=0;
1 k: ^$ [9 j; u) @; v: M6 Ivoid write_byte(char data_byte);6 H$ _1 W. S. \. Y
void send_command(char address1,char address2, char address3,char data);// command and address and data1 a/ _* G6 F" y8 _) _: N; k
char recive_data(char read_address1, char read_address2,char read_address3);0 ]/ d& A/ ^. O
void delay();
* z' u4 T, V& z* z) [void erase(char command,char erase_address1,char erase_address2,char erase_address3);7 ~' W: ~" c$ Z# _: q
void read_busy(void);/ E: Q- s$ O7 M- e" _
int main( void )' ]3 s9 m" u, r' N$ J! I
{9 A3 q% x: r. n/ e5 j" V3 v6 {
  // Stop watchdog timer to prevent time out reset: i1 V8 j# i; S! G" q
    7 N  W3 X+ ]* L7 L
    WDTCTL = WDTPW + WDTHOLD; + v; g( b) f3 @7 E
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out" J" [% C9 Q+ m7 k, X4 {
    P4DIR|=BIT2+BIT3;   //flash  wp si output
+ T" m+ s; e+ L1 c* Z! B) k# }6 k   ! c) Y% j1 ^2 k
    P4REN|=BIT1;            // so pull up4 C5 z3 Y$ `3 K: u# P' l- u8 J
    P4OUT|=BIT1;             //flash so pullup  selected p4.1
! M; r4 \" b7 W, n7 A! q    P4OUT|=BIT2;             //wp=1
/ O, H, ^+ x/ ~3 u; s% k   
: i: K, V* O/ p) ^    P6DIR=BIT4;- R/ W& p/ ~/ C7 K' m
    P6OUT=BIT4;            //led
& c( N5 U3 F9 G- S6 F    P2OUT|=BIT0 ; //CS=1;  
9 m9 s9 C! H; M) H  N9 {    P2OUT|=BIT5;  //sck=1;
; s+ }& x' Z/ ~    //P2OUT|=BIT4;  // hold =1- X6 e+ d1 g7 y" d8 G
    _NOP();/ L- J6 p  A2 L
    _NOP();
. q0 K9 U' o  T7 \' O  a    P6OUT^=BIT4;
% h' v' W( {7 i% ~    erase(0x20,0x00,0x00,0x00);      / U" h6 n5 {5 s% y
    read_busy();   
1 w4 S/ Z% a2 R+ X: |    send_command(0x00,0x01,0x01,0x00); //xie,mingling         ! K5 x0 }% G/ a' C8 D6 c: |0 y5 I2 m
    read_busy();  
3 ?5 ~' X. r7 L     readdata=recive_data(0x00,0x01,0x01);   3 e5 _' `( Y: ~9 q2 X+ W8 t
    while(1)/ g) t8 o4 B8 m! H1 E
    {
# H' F/ J  k& }& Q: [  \1 a% g     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling! l/ O) Y, X( p; o' _/ T& G
           ) t: r( Z, d# \5 Z2 F: S4 E; a
      // if(readdata==0x00)
& t  r! G% V+ j9 u% C' \       P6OUT^=BIT4;" {3 u6 S# x8 ], A0 G
       delay();
# P5 j. n& _7 _4 y8 C- R6 A$ O+ F    //  readdata=recive_data(0x00,0x01,0x01);  
7 j2 W1 E! r) g, R3 l    }) _; S# h  x" D2 g  }
  
  L/ v$ V$ b8 }# |& H3 p/ R" w}
$ p) ]2 ^( [7 P5 ^- ^7 T3 Rvoid write_byte(char data_byte)& Q+ l3 e- L6 S& p, t& \/ n2 i& Z
{
- |+ a8 T9 |  U- i char num=0;  
% a) L% v/ T/ ^( _/ x for(num=0;num<=7;num++)
$ e3 Q) d# g( y+ C   {/ P. p) O$ P- J5 U
  ) n- K$ w! u2 ?3 f* ~5 H# J( Y7 [
     if(data_byte&0x80)
. W% _. J; o1 m7 M5 I       P4OUT|=BIT3 ;                //si=1;
& @$ Y. G8 L4 t" M# b     else
6 u( b6 m# G5 h; T# Z       P4OUT&=~BIT3;              //si=0;  
4 R* k" l7 ]. c9 K% x: S3 c& s+ K       P2OUT&=~BIT5;             //sck=0;' S* Y, K+ h! t% m: p" r6 t0 R4 e
       _NOP();  ; P( [/ j& c  ?
       _NOP();
# v/ j; W' b! ~# I+ u7 W! F       _NOP();
9 C& |" I" @/ L3 H       _NOP();. u6 \2 J+ l; l$ O& c/ i& v( X5 ~
        data_byte=data_byte<<1; //数据从高位传输  
% J: a& X! j1 O! s4 Z; {( q       P2OUT|=BIT5;        //sck=1;   ; N& u  i4 h, d, L2 U! |
        
) R% V9 y  b  }      
! D5 ?' d9 `+ W% Z6 C5 A   } 3 P% C$ ?. L0 F3 g4 L  Y
}
" B8 i5 l0 y, z8 p/ hvoid send_command(char address1, char address2 ,char address3 ,char data)  F! a" ]  n7 _6 m6 }
{1 h# `# b% s( d6 \% ^7 a
  P2OUT|=BIT0 ; //CS=1;  
2 [7 d" h* |5 v5 U6 p  P2OUT|=BIT5;  //sck=1;$ q/ f0 d9 P# N& v5 }
  _NOP();
0 ]! {2 \/ E- i  P2OUT&=~BIT0 ; //CS=0;6 Q& P: z% a5 A
  write_byte(0x06);   // write command
: I" q9 {) G+ T7 O% e" g5 ]  write_byte(address1);+ C: m$ [% B( L- u
  write_byte(address2);
' y' N) n7 ?# w) D5 [, z  write_byte(address3);( y8 H8 C' V# l- b: b
  write_byte(data);
9 }2 {, @& g9 b: ~6 T  P2OUT|=BIT0 ; //CS=1;
. E2 ?. P( J! v/ g5 F& z4 I  y+ F  _NOP();0 V# |0 [" j% J) l3 m- b7 W
  _NOP();$ b2 q# G6 c5 ^0 |3 u2 `
  _NOP();* X& k; P* J) q* k/ a. I7 K4 u' z
}
$ k7 u! I' Y8 }3 _1 W  `
; X3 O* E. B1 k7 k( K9 P7 ^char recive_data(char read_address1,char read_address2, char read_address3)6 d# P; D* n; j0 G" h: T9 [
{
7 |3 C  _0 f1 N: B4 e   char read_data=0;   * z4 Z- c# p& W8 K! ^
   char num=0;
9 B; c# J* Q/ U7 [1 ]6 V4 a9 e  
9 v6 [! r% b. P% g8 M  P2OUT|=BIT0 ; //CS=1;  
2 Y2 X. H3 O0 Z( I2 ]. V* k$ u: K  P2OUT|=BIT5;  //sck=1;
" W% Q2 l, y+ n) B* c0 }- ^: c1 K  _NOP();
( F* u& j1 X% i- b7 ?3 n$ ^  P2OUT&=~BIT0 ; //CS=0;
; B. X- }' O* U- w  write_byte(0x03);
3 M7 G- A$ P% D  write_byte(read_address1);  
: ]/ K) K, ^: U6 D9 }  write_byte(read_address2); 3 f, J) K9 F9 Z5 ?
  write_byte(read_address3); 0 M% @: p; c5 Y: w8 n' c
  , ~, R) e# c& E, x) z
  for(num=0;num<8;num++)! y' N6 ?3 s  p! Z9 N, Q8 W- F8 p
   {
& Y6 Y8 B+ S2 v% p5 p$ |     P2OUT|=BIT5;        //sck=1; + W! T9 u3 c3 @& \
      read_data<<=1;; S/ |6 Z: O+ i$ P( c
      _NOP();; |7 r  Z/ i5 _" i; \5 T. W. d* d% w
      _NOP();
! N8 Q6 z  U2 m5 L1 Q: O0 Z      _NOP();
0 d" U  c) C3 n      _NOP();
) i- r" L8 V$ w* E/ e4 q      P2OUT&=~BIT5;       //sck=0;
* ]" \' Z; y* ^    if(P4IN&0x02)$ }( E4 m" K+ c% n! c0 v
       read_data|=0x01;* s* r5 M7 m* D; n
    else& h+ p3 s3 p- D1 c
       read_data&=0xfe;     $ S, v2 W0 ^: w0 Y# \' _* _
      _NOP();
& a! {$ T( y/ L! S" \      _NOP();
' H/ V( D. o; O  |$ m. N     }
% U5 {' i( M( z, G   P2OUT|=BIT0 ; //CS=1;
0 j8 U' o3 A/ j% K1 F- Q    _NOP();: I3 k2 n# h$ g. l1 j. l
    _NOP();
8 q9 ^# \% X, W0 w    _NOP();
% U6 a& o% f/ f- `5 ]' O0 T, _! o: k   return read_data;
4 J. {$ o+ y; C  ! \4 [( x, z- G% i% _
   
- y1 m- }8 y; h' ]# J$ f$ ^; x}
+ W0 n- h5 k. j6 zvoid erase(char command,char erase_address1,char erase_address2,char erase_address3)
0 L( h9 t2 b! P{
% j9 L! L* d5 A  P2OUT|=BIT0 ; //CS=1;  ( Q' M( D9 g6 L7 `$ d
  P2OUT|=BIT5;  //sck=1;
# `, O5 _1 N3 {6 q. g) n! q  _NOP();; i$ h7 ?8 e( ^; t9 X
  P2OUT&=~BIT0 ; //CS=0;) _4 h7 Q" z: N0 K
  write_byte(0x06);. @) T) E  n2 g8 r6 o7 B9 ^$ B5 I
  write_byte(command); 4 \/ V5 m4 I( y( g" l' G- F
  write_byte(erase_address1);% H2 }% o8 J3 |. \) ?' |( j
  write_byte(erase_address2);6 {* y; E. @" x" [7 a3 H: k
  write_byte(erase_address3);
' L7 Y) N( g9 ~/ h9 z) }, I/ R  P2OUT|=BIT0 ; //CS=1;; f6 _4 k' f+ l  ?
  _NOP();' h7 J4 N! [  L+ C& c4 Q
  _NOP();
" \5 G! ~: ~  R) r8 }  x/ h  _NOP();
* x* r/ ?, C( y4 Q/ Z}
+ p9 S7 C7 d2 D" Q  c/ Fvoid delay()
% @3 L' p4 [0 t; _{& Y8 F3 Z& B6 u
unsigned  int i=0;
! f1 J+ A6 L& m9 L unsigned  int j=0;& _4 I  U7 Z/ l6 `  F6 U
   for(i=0;i<=500;i++)
* K( h5 L5 v1 a! `      for(j=0;j<=250;j++)
/ \+ l5 Z2 K$ s# M/ ?        ;
, \8 g% Z# e/ s$ E0 b5 x4 ]}
: o& n5 l1 Z* n, \void read_busy()8 l( W6 ~8 c. L7 Y) t) F6 A8 [+ k8 S
{& M" e, k# e3 B6 l0 J3 Z
   char read_data=0;   ( J/ f" W1 w0 |9 D; i, M. ^
   char num=0;" p- C3 H$ ^  s  s
   P2OUT|=BIT0 ; //CS=1;  
, {, |  O3 I( G   P2OUT|=BIT5;  //sck=1;
% x/ F9 m9 D' F" q( H* I6 D   _NOP();6 j  `+ c% V1 |; Z! m0 \% I8 U
   P2OUT&=~BIT0 ; //CS=0;
; r  y4 _( z0 s: s6 \6 g   write_byte(0x05);        // read the SR1  
9 v4 m3 l9 z( R  e   do{" B7 P: y( z. ~
                  
$ _8 ?# u# m5 `6 e4 F2 o            for(num=0;num<8;num++)
* K3 S  [2 X4 w- N" @             {
% g4 x$ K7 y5 B: y& b" T! Q               P2OUT|=BIT5;        //sck=1;
0 W5 F/ o- M6 N2 V% h9 s) t                _NOP();               
6 e* y. k7 ~  [3 x7 b                _NOP();
$ j5 v' V) H" \                _NOP();1 L' h' P( `% k& W5 T0 h9 L
                _NOP();
9 F6 V* ~; x1 N5 c; l                P2OUT&=~BIT5;       //sck=0;              
8 o. h3 r, Y0 B0 q$ _4 S8 s                if(P4IN&0x02)1 w9 h5 x' |$ d4 R
                 read_data|=0x01;
+ n+ X7 @* x1 l; [% h                else8 B3 B' z: v3 q' w! D# g# T- U
                 read_data&=0xfe;               
  n" O5 s0 g% d% I6 {* m2 B5 J                 read_data<<=1;
  x# W6 A2 d3 k+ j0 C2 s0 Y              }
9 I  @' f2 K9 G' l/ O* \/ y            _NOP();
) C! N8 p" n4 f# J+ m            _NOP();
6 f/ I6 |, a$ N  c0 }; l: H            _NOP();           
1 q  t1 H4 A( M  n          busy_data=read_data;  
& F- K( u5 h6 q( l     }
8 r! s& J/ ~! \- k6 ]   while((busy_data&0x03)!=0x02);1 x* o4 o. p- b& X0 r4 o
  P2OUT|=BIT0 ; //CS=1;* ~/ z: o! Y8 b" h* M: o% y7 e
   
; C  h$ O* v( o9 v' i4 Q( F  + N' N# _6 t1 q$ s& a
}
' r' w3 L" G7 s, M& r6 B
6 E- f! ]1 e* }" L9 t8 \' |用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!7 O" s% B1 L1 ]. S

5 ?# \; T7 {& z0 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

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

GMT+8, 2025-7-1 03:57 , Processed in 0.055852 second(s), 31 queries , Gzip On.

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

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

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