找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>2 F: \3 Q0 r. |5 F) `) Z
char readdata=0;: b. ~" j* r5 L# G/ a( O8 g
char busy_data=0;8 D2 o4 a$ W9 d3 N8 k
void write_byte(char data_byte);
, L$ i- X: u4 {void send_command(char address1,char address2, char address3,char data);// command and address and data+ Q4 s! i' V1 \
char recive_data(char read_address1, char read_address2,char read_address3);
! H" ~9 C& u5 d, @void delay();
6 ?6 t/ Y) S. @$ c3 Svoid erase(char command,char erase_address1,char erase_address2,char erase_address3);
5 n0 d! ?7 a, _% t& v. }3 I4 A: Vvoid read_busy(void);
# I4 h: b0 `, `) p7 H$ M. s% Tint main( void )
' t2 `5 y" ?. {' q! a{8 {/ B. z& [9 I. d2 q
  // Stop watchdog timer to prevent time out reset
, U( z$ k) W. @7 N6 J3 c: t   
: R6 o% `4 X4 ]: d: ]2 t! _$ o    WDTCTL = WDTPW + WDTHOLD;
0 v/ h. r' T- o3 @    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out# h5 _# {; O0 y2 ?. ]( Q
    P4DIR|=BIT2+BIT3;   //flash  wp si output
2 L0 I+ E) i/ h   ( Y. Z4 \4 l4 [  B/ g
    P4REN|=BIT1;            // so pull up" l' A' a. i$ z. c/ Y3 @
    P4OUT|=BIT1;             //flash so pullup  selected p4.1
5 ^$ E- Y% `, K    P4OUT|=BIT2;             //wp=1
/ U( h& p2 ~$ m8 n* x   ) N, A' Z3 k% c; _+ t( j
    P6DIR=BIT4;
4 a( t, d  y4 ^, B2 h1 F3 B    P6OUT=BIT4;            //led
4 a2 L; t0 ?% I, T' l5 h  T    P2OUT|=BIT0 ; //CS=1;  
6 m* [4 |( B8 [& {3 k/ l" X9 Q* d  I    P2OUT|=BIT5;  //sck=1;
! X" ^% K0 i6 u6 Y( |    //P2OUT|=BIT4;  // hold =1
! e' u) b8 L! H; a/ z9 z% e% ~    _NOP();$ B/ l" k- e( i* v
    _NOP();
' R, A9 }; s6 y' V- X  F3 X& }    P6OUT^=BIT4;- e- P% y! F% r& h) ]
    erase(0x20,0x00,0x00,0x00);      
) O1 d4 F$ C7 A1 k4 O    read_busy();   ! t4 V% I# D& B% s
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         2 T% m8 D6 Y* y7 b  I
    read_busy();  
0 s: U' M% U; X: ]% h$ U     readdata=recive_data(0x00,0x01,0x01);   
; H7 k3 o1 W5 B3 n  D    while(1)
, N! F, D2 _; l/ W2 b# J    {
- K' x& B# O. G2 p2 s     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
7 a0 n# m8 \/ @- H6 ?$ b8 l  Y' E           
- X7 {: I- ?( Z! u      // if(readdata==0x00)( K- Q( p$ a) c( C* [! B/ i9 `
       P6OUT^=BIT4;
! F' m( ~( H5 c. q# {! D: u       delay();, b+ g' K) v" p3 q
    //  readdata=recive_data(0x00,0x01,0x01);  % Z" Q2 _0 k; }, S, G
    }
8 N6 N& g1 f9 W7 u: I  ! M: |( G! j* d! a5 Z& \
}
  K' C7 K6 @0 w8 B% D7 Y2 V  wvoid write_byte(char data_byte)9 e0 A( j0 r; M! B0 h8 d  K3 C4 _  o% \
{8 t( D8 h3 H6 q/ b+ P, p$ v
char num=0;  
4 O0 q1 `# V- d, @ for(num=0;num<=7;num++)
1 e, j  q2 ?2 ~, V5 N   {
% K% C0 C: I( c5 D5 `' K$ P  
% Z; Q: ?* U' h7 D) ~& k$ C4 n) j& I     if(data_byte&0x80)7 B4 w5 s1 C1 C  @7 @
       P4OUT|=BIT3 ;                //si=1;
2 [! D9 [0 m8 L& n     else% B: f; u, X1 \3 }: T
       P4OUT&=~BIT3;              //si=0;  
) v( Z1 E7 q5 l* V5 }       P2OUT&=~BIT5;             //sck=0;
$ j2 c6 i3 h. M       _NOP();  
6 ^( ]+ P6 R6 L9 _% L       _NOP();$ v0 Q. V! {8 t7 `, Y6 ]3 o
       _NOP();- ?! e# ^8 z4 g. v* n
       _NOP();2 l+ r$ U/ e% [% p6 v: e+ L( j
        data_byte=data_byte<<1; //数据从高位传输  
4 Q5 C: h" `: {0 Y# q4 D: {       P2OUT|=BIT5;        //sck=1;   
/ P' d0 v5 d! B  \3 v% U$ J% I' b/ w        
. q3 _. Q1 y, h% z       ! r: W# {$ P/ s7 {
   }
) N$ s7 j# R3 I; N6 R}
3 T/ J) J6 S( H8 B4 Zvoid send_command(char address1, char address2 ,char address3 ,char data)
+ J+ q4 D4 C- u/ o/ s  N2 `{# m& L: o6 I; b) i! T' A% M
  P2OUT|=BIT0 ; //CS=1;  
# L' o. V- T3 |: M, x1 V  P2OUT|=BIT5;  //sck=1;
; G7 w8 [2 Y6 \. |  _NOP();
4 j" e) O/ O  {. x1 F4 l( C2 d) I# n  P2OUT&=~BIT0 ; //CS=0;
! V) o+ ?; D2 ~0 ]' }; K3 n0 H# i  write_byte(0x06);   // write command. x% k1 D* s( E% W( h$ ]
  write_byte(address1);
8 ?$ b' y4 z- e4 S2 P7 e$ P( n  write_byte(address2);5 b( Q0 M0 o6 z: U& r  K
  write_byte(address3);
8 Y: n3 e8 |' `; K0 o& v, K  write_byte(data);# n  M) y& N+ p
  P2OUT|=BIT0 ; //CS=1;: l' r3 s* g/ {9 w% [* N. r
  _NOP();  h& n  ]! @% l) h7 \/ C1 y
  _NOP();
$ k% p( d: F- `" ]  _NOP();
. m! r* b* s" l: }3 Q$ z}
3 n/ q4 U; n. X" ]! g7 g& I! f
7 a, L& O7 Z# `8 W0 q. h3 v; Rchar recive_data(char read_address1,char read_address2, char read_address3)7 {$ X% {# F$ ~4 }- P6 j& D: \1 X
{
6 {" s% S5 H9 L3 {  g; \   char read_data=0;   ( G' h0 |* r' ~7 d9 z3 w
   char num=0;8 K* }' b' a( O$ k& g$ L/ S" o8 q" W
  
- {; X) c  m, t  P2OUT|=BIT0 ; //CS=1;  
# Q; N+ c* b9 N' O+ n# @5 P) s  O! Y  v  P2OUT|=BIT5;  //sck=1;
; v' y$ o. t% N  }7 k  _NOP();6 U# M9 ~* Y7 U2 [6 ], @# X+ Z
  P2OUT&=~BIT0 ; //CS=0; * P; V/ \& Z( ?2 H7 a* Q9 Y
  write_byte(0x03);  B6 t/ d* V, g( X- l- S* H' j# W
  write_byte(read_address1);  % j; H9 R. w9 T2 _' G+ ~; [
  write_byte(read_address2); 8 q! h7 Y% n8 Y$ m7 W. Y$ ~1 u
  write_byte(read_address3); ( _9 E- l4 i- j, `1 y
  : }' [4 C7 ?6 X
  for(num=0;num<8;num++)
. a" C5 |' q% h! t3 U6 Y  G   {- f& N' _# t1 i4 _* d- _* Y
     P2OUT|=BIT5;        //sck=1; . p4 u% }/ }) ?) N. d+ H) f
      read_data<<=1;6 m( n( i: L9 T. O' _' h1 J
      _NOP();
6 x1 ]1 o; q5 ^# @% V! u  v      _NOP();. A2 _$ B+ t7 h* ^& e  R# n5 T7 n
      _NOP();' T( n+ ^# R( i0 Q
      _NOP();
: d' R; Y" O9 n9 u      P2OUT&=~BIT5;       //sck=0;
# }" M0 [$ {' x" {( n7 D    if(P4IN&0x02)8 x6 {& h. K8 \$ M* l
       read_data|=0x01;7 g6 k0 V. M7 i9 ]1 o+ s% g8 B# e/ f
    else, g) c3 A* F4 @9 L4 ~% S0 c
       read_data&=0xfe;     
4 g: D& {* N( ?8 x/ o      _NOP();
; q$ l8 b6 l( Q0 C! \      _NOP();
" ]& \4 r, G4 @, Y     } * S$ P4 L9 ?% R6 L, c( I
   P2OUT|=BIT0 ; //CS=1;
" L9 n, _# E. o$ O$ Z6 C  k    _NOP();, v6 e$ T9 l- E7 {; Q) w: W
    _NOP();
0 p- {7 B& g( \  t* r    _NOP();
+ `9 B0 P2 w- v9 O# i   return read_data;
: ?9 R, O+ B+ Z( `6 k3 [: o  
( D# p7 z! _9 a$ e   
4 X3 T- m# U3 ]6 d% E1 T}$ B% {* J' s5 v: ^
void erase(char command,char erase_address1,char erase_address2,char erase_address3)5 W) P% s% {, L& H- H/ y$ k% D; B
{
3 |8 h7 `5 {  r' H$ E" v  P2OUT|=BIT0 ; //CS=1;  
' m  r0 E) M3 M6 V/ E  P2OUT|=BIT5;  //sck=1;2 ]  _7 V/ l  K+ U5 T* S3 ?5 ~
  _NOP();/ z1 i5 G& O9 h0 G
  P2OUT&=~BIT0 ; //CS=0;# B/ m/ n! L2 X! b: h# O
  write_byte(0x06);
" F0 b4 s% h0 q0 g8 o/ J  write_byte(command); / D; d! L8 H) W* @2 h/ g  ]! D
  write_byte(erase_address1);
+ U/ n( {! R+ T$ T  write_byte(erase_address2);/ k3 }$ @0 U- S( `: D; J
  write_byte(erase_address3);
- X7 L& Z2 U# |( y/ R  P2OUT|=BIT0 ; //CS=1;
+ J) \& [/ r7 J2 N" O  _NOP();
$ Y2 U7 s  O2 p# F7 `1 b& f  _NOP();- a* d- N* I/ }1 T, D; T
  _NOP();; [* I' `3 y  E# d+ H- y% a) m% A
}
: G2 ~9 x$ _: ~( ^9 h4 U& evoid delay()
8 I& T6 c' z  j* ?3 A{
+ o! Y, M  @0 \4 A6 H, j unsigned  int i=0;
% y3 ]& w6 |, S. c, x) z unsigned  int j=0;$ n) e0 a7 w" p5 o4 ]1 @. M
   for(i=0;i<=500;i++)$ K; h: V. ^$ M! D) v$ j
      for(j=0;j<=250;j++)  m; T# @& c0 Q+ D  w  _7 `
        ;
. u2 J! N9 B) r0 Q}
+ X% }3 V' o* n% I5 [) {9 vvoid read_busy()' g+ p2 W2 B4 }8 [7 b2 M/ s
{
  {( z% _# J1 N9 B# p   char read_data=0;   
; Q& l4 I6 ]% k; W$ A) b   char num=0;
( R: I- v& q& F: @8 |- Z; }# \   P2OUT|=BIT0 ; //CS=1;  ! n0 Q% k3 v$ Y* P
   P2OUT|=BIT5;  //sck=1;
& N* w1 s5 v# _' d9 R! q9 R& n! E   _NOP();
) H4 F& o" T8 k) z5 K5 U, m- {   P2OUT&=~BIT0 ; //CS=0;4 _% c2 t, j3 P! z) N
   write_byte(0x05);        // read the SR1  
9 P$ `" F+ h0 V  W& j* J5 V   do{
4 D  u- Z& O! s" O; t. f                   & z' D6 x# i! f
            for(num=0;num<8;num++)4 s) b: r& Z6 ~" G0 z
             {
+ X) s( B8 N, p! g& B0 |               P2OUT|=BIT5;        //sck=1; , v$ k$ C3 _" b" a1 O8 O) ?2 _3 \
                _NOP();                . |- @! O+ w: A" g- e! G+ E
                _NOP();
8 D- ]  B9 }3 n0 A. J                _NOP();
, N' l1 g( f0 u, n6 h                _NOP(); / \" C7 t  f8 D
                P2OUT&=~BIT5;       //sck=0;              ) T" A4 v# U+ S" Z
                if(P4IN&0x02)* h. O5 T! {0 ?, C5 I
                 read_data|=0x01;
( l7 \) N1 s, ]: Q  Y: X' N                else; G5 S! r( k3 |
                 read_data&=0xfe;                  I& w9 c) F. M$ N: V: e, R( o6 _6 `3 w
                 read_data<<=1;
/ D: B. L3 c" f* \              }
& q! U0 S% U7 S4 [0 E0 n            _NOP();9 `) @, ?2 u3 A  C0 I
            _NOP();4 P) ~7 e/ c2 P  ~  X& g
            _NOP();           
$ u- Y0 h% C5 X; t2 r          busy_data=read_data;  
' U0 O- e) L' s4 i/ e     }- L& A  I6 C, P& c1 p
   while((busy_data&0x03)!=0x02);
2 u. k4 J! N/ \) G% n6 K8 d* ^  P2OUT|=BIT0 ; //CS=1;- e: |  M) ~" L5 |$ N! Y
    / V6 x+ v4 |, V0 ]  Z0 B' R
  
3 j! I$ K# g9 h1 |}
4 @# `$ q# C# m$ F& F) X( Y' S  K" }$ I1 X4 v- i: T$ ]+ Y% K
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
1 }  ]) \/ ?/ w, o% j( N* P) ~& ^' }1 o3 G) M4 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-1-31 02:28 , Processed in 0.055833 second(s), 32 queries , Gzip On.

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

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

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