找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>
5 z7 N7 g* [+ |" Q6 i. w0 y/ `char readdata=0;
6 m" `, }5 ]. S! W6 Gchar busy_data=0;
- }# y! t* G! J* Tvoid write_byte(char data_byte);; g$ |3 {" c: o' m" y+ [
void send_command(char address1,char address2, char address3,char data);// command and address and data
1 ?* l1 G& _( E" a: C9 W: V. echar recive_data(char read_address1, char read_address2,char read_address3);
) d4 O/ W+ |+ y. Y8 L, H! tvoid delay();
* E% Q% C6 y) s/ o) \& F* Qvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);( L: F( M4 i6 a8 N
void read_busy(void);
" ]0 g. W/ v' r: oint main( void )
! x( m- h3 r( d& Z4 {{3 i# y4 T$ m( _" M) @. y
  // Stop watchdog timer to prevent time out reset* ]% [' V/ m# Q7 K) \8 J4 T
    0 @6 P; x: o/ L5 ^0 ^$ o) j
    WDTCTL = WDTPW + WDTHOLD; " S! b" F7 [/ E4 J7 ^, ~
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out2 _  L( P% }9 u$ D
    P4DIR|=BIT2+BIT3;   //flash  wp si output
8 X5 ^4 h+ O% m7 Q- L$ ?" Y   
4 b/ K/ z- m3 T8 b6 O0 c& I% D+ A    P4REN|=BIT1;            // so pull up6 f! k; _1 E% P4 `  U1 O  }! {: |/ [
    P4OUT|=BIT1;             //flash so pullup  selected p4.1  M1 t# v: ?4 m* M  p4 u. q
    P4OUT|=BIT2;             //wp=1- n1 P7 v- ?# m) N, E
   4 u% w  @$ v2 L8 D8 d
    P6DIR=BIT4;( u4 J7 ]6 m. a4 ?1 }& U$ s0 y
    P6OUT=BIT4;            //led3 v# O+ t1 g* [, q5 ?9 Q7 Y
    P2OUT|=BIT0 ; //CS=1;  
1 W5 F. y- J( P$ Q    P2OUT|=BIT5;  //sck=1;8 m7 `8 R& u5 @2 M) ]
    //P2OUT|=BIT4;  // hold =1
+ e$ c5 ]9 C  e: Q, Y. d  w) b: `    _NOP();$ Y% {) |. ~# O2 Z+ x
    _NOP();5 [) S2 F* t- o. z
    P6OUT^=BIT4;6 z- R& e8 p# i( g) U, O/ K* b. ^
    erase(0x20,0x00,0x00,0x00);      0 |# X$ y& S, k8 G* x! i' {
    read_busy();   
* q( k8 W. h7 f9 g1 o7 Y    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
, ]+ y5 c/ B# A% ]    read_busy();  
  t) z0 g* Q& f! k4 W/ t8 l" a     readdata=recive_data(0x00,0x01,0x01);   
. s# a; s! D3 Z8 ?    while(1)8 R) B/ C( ~8 ?" p
    {
8 b6 ^: j- o7 k/ x& z, B     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling' [7 l+ Y7 U5 z( d# q
           " {- ]5 K2 k1 b. ~. A; B4 n+ R
      // if(readdata==0x00)7 \6 B5 H$ O0 C- q) @& J# p
       P6OUT^=BIT4;
8 p6 t+ ^% ~( Z8 e: b2 i5 [; o       delay();0 ~% f& W3 W  S7 F
    //  readdata=recive_data(0x00,0x01,0x01);  
* |8 P6 l3 z. h9 I: x. o* H- x" ]    }% J+ R7 x; L) n( e
  - C7 S% g7 @( k. q) ]# v; {
}
9 C5 C4 q' X6 }# }# M8 wvoid write_byte(char data_byte)# A- ?+ d5 x" ^2 Z
{8 t/ [8 l+ X% X: z+ c
char num=0;  ' {1 E& d- s5 J% ~4 r
for(num=0;num<=7;num++)" Y: h7 m- {+ w5 U; [7 S
   {- {- {" {7 j& E/ H, S( r
  % B( Q! c1 `) y4 l& j' A
     if(data_byte&0x80)
; o, {- I  Y0 x# A       P4OUT|=BIT3 ;                //si=1;* t7 ^/ r6 v2 N! {
     else# W: j6 J0 L6 R( D. D" T
       P4OUT&=~BIT3;              //si=0;  % S5 h1 `/ }& N) D1 r8 i# m; V
       P2OUT&=~BIT5;             //sck=0;
+ \# i% k) u8 U! p7 s; Z       _NOP();  
. @0 {! f. {" x' I6 j9 B, b$ ?       _NOP();% l% m! l& c# o5 _' V0 E2 O
       _NOP();% h2 p- G0 k8 F* u3 M" E4 l
       _NOP();
4 A  k; n, t4 n9 ?; Q3 Z$ D. C/ [& I        data_byte=data_byte<<1; //数据从高位传输  9 h3 V6 G. P, w2 ^% @
       P2OUT|=BIT5;        //sck=1;   $ `" J% ~' M8 j, E
        
/ d+ T! |. H1 j2 k      
; G) ]6 q  ]/ {9 i   } 3 v9 r& k7 L" I/ Y, v
}
3 c- `! \8 A% u' B' fvoid send_command(char address1, char address2 ,char address3 ,char data)
* p+ }1 d9 L( w+ V3 J( {0 B{
- H( a9 V  v! k4 W  P2OUT|=BIT0 ; //CS=1;  / w& B9 f5 P: b3 \. {9 a8 H
  P2OUT|=BIT5;  //sck=1;
2 u3 [7 y8 U3 e) C. a  _NOP();0 u: v6 w7 |( j9 h! x; V; x
  P2OUT&=~BIT0 ; //CS=0;) p; m$ @8 {4 H: i3 j4 w
  write_byte(0x06);   // write command
* E- O7 a0 S. ?: T1 i$ P0 t  write_byte(address1);7 o' ^7 }$ W0 T) n1 u# L
  write_byte(address2);
) r, g6 P# z' W% n# d6 a3 I/ x! D  write_byte(address3);
: R. Q$ `: N" H. L6 x  write_byte(data);$ ?- d! o; W8 Q; d: A! T5 D4 h* V: p1 b
  P2OUT|=BIT0 ; //CS=1;, t2 k9 }, I& V- R: D( U
  _NOP();
% |6 U6 w4 \, r: z: T/ i  _NOP();
+ u3 B3 O! w) s# y- p/ F  _NOP();
2 u+ d2 ]8 B7 A$ g, n1 R( N}
; I2 d* J) Q2 K0 A) @0 R7 D
) d% u3 b/ `  w2 o' {9 i/ |1 k% ?3 fchar recive_data(char read_address1,char read_address2, char read_address3)' {- X  }" e6 X' Z) Y1 K( g$ g
{
% z8 y* b0 v* @  @5 Y% d8 N   char read_data=0;   1 I. k/ E  X' [" [- M0 e; O
   char num=0;
0 J: D4 A! N" u8 o  j  ) }: P3 U' ]1 Q3 }0 U7 O4 ~3 g6 p5 a
  P2OUT|=BIT0 ; //CS=1;  
* E& T1 H: S9 W0 S2 A. w5 H/ a  P2OUT|=BIT5;  //sck=1;
1 k0 k2 O. z/ U5 Y7 t  _NOP();
% ^) G( N' T5 j6 l7 _/ T' @" C  P2OUT&=~BIT0 ; //CS=0;
" ^) m8 _% O5 s6 D7 s  write_byte(0x03);0 X2 e# n  }+ H' F
  write_byte(read_address1);  
, G  u2 e* y9 _% g  write_byte(read_address2); 8 f7 K, {# e) D  _, f3 [4 w
  write_byte(read_address3); 6 H9 P/ N/ B: d" T( S
  * H" _/ l# s8 z
  for(num=0;num<8;num++)
) N# n& v- a2 e   {
' z9 g' H3 ?, G8 e% I) E     P2OUT|=BIT5;        //sck=1; 2 i$ F: K0 f* b
      read_data<<=1;% B/ l1 x) F* f" v
      _NOP();( D) V1 i. K: X* B" W3 Q# M: d
      _NOP();
  p" P" v9 b: \+ H      _NOP();
0 `0 m' c4 [4 j1 F+ I      _NOP(); % c+ b& @0 Z6 @* M
      P2OUT&=~BIT5;       //sck=0;; D- M% P; @% \+ N6 W4 E2 r3 x
    if(P4IN&0x02)
, ?0 a, B3 F4 t$ C( l1 X       read_data|=0x01;" N5 \: a  Z. ?- a; \# J. ]  U/ g- I
    else
! |- Y* o( v) y       read_data&=0xfe;     1 u$ z' T  k% E
      _NOP();% ]3 Q8 Y3 m3 P' _; s6 c8 S$ y  g
      _NOP();. C! f" a. r' w; k$ X5 O# g
     } ( _, D  j: Y( h$ d3 k9 v! R
   P2OUT|=BIT0 ; //CS=1;+ F) ], I; P- m0 q
    _NOP();
/ c+ ~4 V) ^  S0 p) e3 x$ N+ z* A    _NOP();1 H' j9 z% p( A1 T+ B4 k$ q
    _NOP();
7 J) W! K# y  k( J! u  S   return read_data;
7 ]" U7 q8 K& U" O: m0 B  
( ?) {  b! B5 s" Y. D' R    2 Q2 k; F2 v, P' I
}: K- @( I1 o" i* W) k$ Q
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
, N2 x* n; y1 s/ ~, R0 t/ e{; A3 P. C: q" F: ~+ M
  P2OUT|=BIT0 ; //CS=1;  . k) s6 h7 H- H8 c/ b' ~/ k
  P2OUT|=BIT5;  //sck=1;
& ]1 O6 L3 ]9 c* Y* u  _NOP();' q, k) i0 t: n. |5 Z
  P2OUT&=~BIT0 ; //CS=0;- ~7 N+ s2 ]. n  t1 N9 V. j/ o: h
  write_byte(0x06);
$ w# S0 c" }1 Q5 v+ ]9 v, I  write_byte(command);
4 U5 y# D$ ]% u/ n% C! p, w- E# H  write_byte(erase_address1);
. Y+ g# K4 k1 E  b* s  write_byte(erase_address2);* ^' a- B% ~+ R! I4 p
  write_byte(erase_address3);
: @% _$ [( {1 D4 f2 P) s1 R! u9 I  P2OUT|=BIT0 ; //CS=1;) L4 Z+ T0 f/ v* f" _# U+ q$ Z
  _NOP();+ B& Y" Y; v" n# m8 k
  _NOP();! x7 ~  v4 J7 l/ U
  _NOP();9 m# v* Y3 Y; n/ a( |! U
}5 z# L$ s- i, \. }0 _
void delay()/ ~  p# Y' x8 n5 @
{: s- C. F0 \( K2 Y  X, \; s
unsigned  int i=0;  j' \5 v* x1 `) i6 S
unsigned  int j=0;
' [6 F, C  h0 o* l. p8 V+ [   for(i=0;i<=500;i++)
  _! I# e, T' T+ H      for(j=0;j<=250;j++); N4 d/ @0 ]+ h* o1 y  t
        ;. S& h2 W7 p, @/ K8 a5 i
}
6 Q5 {) x. U/ i$ k0 R: W( ?% qvoid read_busy(), z+ |* F2 C6 n! t) O8 |, L
{
  f" e' P- ]0 m2 S0 A   char read_data=0;   
1 Y* k9 J9 V! y7 q9 D: U   char num=0;
% A( e- _, J' X- ?+ k) g- u3 S. b   P2OUT|=BIT0 ; //CS=1;  8 Y/ D# Q' G" N8 J( M9 C
   P2OUT|=BIT5;  //sck=1;4 t  A8 w, ?( Z- f& K* o7 S1 v# Y
   _NOP();
0 _# |: S, V4 H' x, b0 J0 v( Q) ~   P2OUT&=~BIT0 ; //CS=0;& l$ f: o+ z1 i0 L
   write_byte(0x05);        // read the SR1  
0 k0 ]* R' d6 m+ u/ @$ _" X6 s/ I   do{: v' x8 C7 g( d9 H# g6 Z
                  
' C' z1 ?8 T0 R4 p+ c- s1 _            for(num=0;num<8;num++)
0 Q; @! g% @' R( Z4 R( o+ N# D$ }: r             {
  p* W9 w8 D1 y7 q0 |4 w" c               P2OUT|=BIT5;        //sck=1; - B' e# v! c! q% F- x2 B
                _NOP();               
$ K5 G: @& S$ `* u5 U                _NOP();9 @* i; h) a+ z5 r
                _NOP();
1 j. P5 U0 o3 ?. t                _NOP(); ; [6 J0 Y; ?" k) Z7 d4 K
                P2OUT&=~BIT5;       //sck=0;              
1 E- y' [% d: M) e  C' {                if(P4IN&0x02)
! {& x9 [# `  D                 read_data|=0x01;9 X- I0 f6 E" W& L
                else+ s6 e$ v& O, d& s1 |" d5 F
                 read_data&=0xfe;                0 H* [$ w1 z, M/ X8 U6 M- x4 Y
                 read_data<<=1;" F* }% O9 _8 e- M: c' e
              } + s2 ?& F; C7 \9 i+ t5 N) w, g
            _NOP();
( {! j9 V( f% q            _NOP();
/ q. I% s+ O7 n( S' S            _NOP();           
1 g+ ?1 s% }2 ^& g6 }          busy_data=read_data;  
% ?/ r$ q, a/ t0 w5 a  P3 c7 w     }, F9 Z: V: Y( t$ f4 S
   while((busy_data&0x03)!=0x02);
: o5 b- I0 g9 U! t; f4 @- G  P2OUT|=BIT0 ; //CS=1;% t/ Z: {$ t% L( q3 P1 X
   
6 B% f7 B4 h& Y  
6 ^5 h, ?* W- M. f- H& m! \}
6 K! [0 P' y1 Q8 `  N/ G8 W: [
' C, B! s% R: @3 \9 m7 f8 R用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!) L! O! ^( \1 U( ^5 |( ?

8 D# }- h2 H6 f2 ~8 U0 W/ `1 P' @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

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

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

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

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

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