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

msp430 模拟spi实现对flash的读写

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <msp430.h>& n( _, E9 J8 r% q/ w
char readdata=0;
, v* ~( T" D5 ^6 M: Nchar busy_data=0;8 u/ q1 X& E- F* p7 e7 K
void write_byte(char data_byte);
( s8 {& \& [) |2 }; Evoid send_command(char address1,char address2, char address3,char data);// command and address and data
1 e+ k( F' P) L: a9 }% o, ?char recive_data(char read_address1, char read_address2,char read_address3);
( a. V; V0 n  P1 F4 S# c( e+ dvoid delay();$ B2 y$ @8 S; V) f+ |4 c! P
void erase(char command,char erase_address1,char erase_address2,char erase_address3);5 N6 i7 r7 J# }( [
void read_busy(void);0 P4 p+ F& |  ]( N9 q
int main( void )
" N# g4 x- d. @5 n8 W5 P: u{
3 P9 U. o. }& [/ s+ P0 s  // Stop watchdog timer to prevent time out reset
4 I8 A2 }& Z! u2 x   
2 u3 j$ g" C9 j+ S/ T) e: B1 J    WDTCTL = WDTPW + WDTHOLD;
2 L- G$ }' v; ?    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
4 R) z+ F5 K  @/ [    P4DIR|=BIT2+BIT3;   //flash  wp si output7 C% y( e7 d0 u8 i8 A3 p
   
3 P$ u2 ^& v( g% K& Q5 y' g4 M    P4REN|=BIT1;            // so pull up& I8 t% A# }+ h# @2 |
    P4OUT|=BIT1;             //flash so pullup  selected p4.1/ {/ ]4 Y; F$ S0 z5 q( \
    P4OUT|=BIT2;             //wp=1- ]+ [1 k/ b# c! w
   
, A( E# S2 V) ^    P6DIR=BIT4;) A5 Y( T$ ~8 E1 d. w
    P6OUT=BIT4;            //led; Y; h0 F' R2 {
    P2OUT|=BIT0 ; //CS=1;  
1 z' h6 d; g) h6 n    P2OUT|=BIT5;  //sck=1;/ C  x- M8 r- [. ^- A9 L& e' d
    //P2OUT|=BIT4;  // hold =1
1 r9 F7 g( X! I0 L" }0 U7 p7 g    _NOP();) X- @5 d2 ]$ j6 v* I0 t
    _NOP();
- K2 b! F% z0 _  r    P6OUT^=BIT4;) M  S+ }; |# m4 @
    erase(0x20,0x00,0x00,0x00);      
' l( R2 m  O# l    read_busy();   & J: X$ H- c+ S
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
4 P7 ?) x1 n5 u# @) V    read_busy();  * ]8 B- I* r4 V9 R2 n
     readdata=recive_data(0x00,0x01,0x01);   4 R9 h7 \$ t6 J6 ?
    while(1)9 k, y7 Q7 l5 B: t
    {, y$ a& e" J6 }* C3 }4 E# k' {; Z/ B
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling' K( L5 ?' g/ {  T3 c4 \
           
8 y5 x7 n2 o. X* A      // if(readdata==0x00)
6 Z- P; Z0 i7 _# Z4 I& ^+ y       P6OUT^=BIT4;
2 F6 W. z# q6 Q       delay();
9 W/ e* L. G% {: t  T    //  readdata=recive_data(0x00,0x01,0x01);  
% D" j1 G0 f6 A. V+ l    }
. z5 a, W$ T$ `  ~% V  " G! j# C) Z  J( c
}  `, _7 I2 F7 }' Z! u9 v5 @
void write_byte(char data_byte)
3 e  f! _# G, M! D4 P{* E7 ?. O$ n4 I4 c/ F: w: ~6 V+ u
char num=0;  0 G7 x' Z# N7 J
for(num=0;num<=7;num++)
: W# i+ o9 h1 ^+ K   {" B5 ]' p- t1 g! I. W2 b; i1 p
  
6 a* W: y# `, D/ f( s! H     if(data_byte&0x80)
# j$ y8 R( f: Y, _       P4OUT|=BIT3 ;                //si=1;
0 o% w# O. Y) X7 Z, m+ T; U     else# K# h/ \. l2 u5 U& {' T
       P4OUT&=~BIT3;              //si=0;  
/ \! _0 v3 Q) {       P2OUT&=~BIT5;             //sck=0;* u% s1 ?/ a& t2 `8 c9 [
       _NOP();  6 e: W: ]2 O8 Z& U6 i' \& n
       _NOP();; A( i0 ]: z1 u+ C) z7 ~5 b
       _NOP();- e" P; t- {! z* K
       _NOP();6 {% Q9 _& U( N7 {8 ?1 z! B( P
        data_byte=data_byte<<1; //数据从高位传输  
2 P, T, B2 m( Q  n, B       P2OUT|=BIT5;        //sck=1;   9 R$ E. h% f9 e: J3 q
        
6 r/ d8 c; z3 e  }- v       1 C; V' c5 h' _; ~; K% h8 ^  G
   } ' c" @- M4 K: e
}
7 e' q7 n: a' l# p2 o5 Ivoid send_command(char address1, char address2 ,char address3 ,char data)
4 e' N( x7 J# ^0 r+ S  C* Y{$ d& G1 x3 N) c
  P2OUT|=BIT0 ; //CS=1;  + l9 f3 C* W8 \  j" c
  P2OUT|=BIT5;  //sck=1;5 L! [% S* R3 `! F0 X. a
  _NOP();5 O6 K$ j/ l& t6 [
  P2OUT&=~BIT0 ; //CS=0;, u- R0 ]8 t3 ^6 A" f; z
  write_byte(0x06);   // write command1 t* v. |! ~7 {% }: z$ H
  write_byte(address1);+ Y) x! `. L6 H: a+ l
  write_byte(address2);8 J: s6 [& `4 J
  write_byte(address3);- J0 U6 F7 ?0 {+ j
  write_byte(data);" o9 j8 r; b% ]
  P2OUT|=BIT0 ; //CS=1;: J* C% p( U+ c- S
  _NOP();; p9 ~1 L6 Z7 a) ]# v( U2 O- I
  _NOP();
# V$ T8 Z! _! U8 H6 G+ c  _NOP();  |8 z3 j  X, z! w6 _( x
}4 V5 F& n0 N8 C6 J1 Q3 @

8 w5 Q( ^* t1 ?2 b4 [" Y% lchar recive_data(char read_address1,char read_address2, char read_address3): q$ E8 R6 ?( V
{
3 X3 o6 X* h4 p, A   char read_data=0;   1 s8 [. b6 Y0 w2 o  {
   char num=0;
" w' i3 r3 Q2 I  
, c% H0 P$ T0 Y4 C  P2OUT|=BIT0 ; //CS=1;  2 }! N0 z0 j4 U
  P2OUT|=BIT5;  //sck=1;
) A! q- Y5 a0 X1 r1 M  _NOP();
1 }7 F8 R+ E# f9 K3 m  P2OUT&=~BIT0 ; //CS=0; 8 f) F) n) ^% U
  write_byte(0x03);9 e, v+ m! t" c# I% h4 ]
  write_byte(read_address1);  
/ Q8 w) U4 o3 o* k' y  write_byte(read_address2); ; y+ s: G: j  {) V5 e- h4 p  |
  write_byte(read_address3);
! [/ b8 f" r, p) J9 C  # w) g( p7 s+ Q4 D
  for(num=0;num<8;num++)
/ p% A2 e; o) T& R   {
2 u# |: C5 x! Y! E     P2OUT|=BIT5;        //sck=1; 5 S; x/ y( S3 ^7 n6 O8 ^* U) d
      read_data<<=1;
4 c8 i/ d# \7 G3 m      _NOP();
5 K* g& |6 E$ H8 C, c: e      _NOP();
: p$ Z/ r  f9 D; [. T: G1 h      _NOP();
- Y5 H. U1 B2 @6 e/ p  V      _NOP();
6 \) r# C# \. j( s2 L) K; w1 A& d      P2OUT&=~BIT5;       //sck=0;
7 ]) N* h& F/ U% M    if(P4IN&0x02)0 l( o+ I2 i& d5 ]1 r3 U7 o- w
       read_data|=0x01;) x, s6 t' B; z2 A& u: }6 c
    else
0 [8 q  q, E' u$ h       read_data&=0xfe;     ; R1 n# m3 F$ A8 t* F- T* c9 Q+ t0 C
      _NOP();
: y7 j3 D" S+ g: f0 G. I      _NOP();
8 h) e- x: J$ G) H+ p- x     }   {8 B) O/ D& a0 t0 p
   P2OUT|=BIT0 ; //CS=1;
+ Y' k$ p: T( F5 ]+ w; ]    _NOP();
5 @- K4 p8 i5 T5 O& s/ W  Y    _NOP();9 `. T' }& ~& t$ a! x4 ]: l& u
    _NOP();
0 }( @5 }6 }" H( y9 o0 O   return read_data;
9 S% U* e- h7 k( P# Q  
2 r9 S$ t2 n$ j2 k    7 m# j. ?$ i. n
}
" r5 a1 j. z1 d; y7 Gvoid erase(char command,char erase_address1,char erase_address2,char erase_address3)
6 Y( D! q/ V% u/ x, H2 |{4 m, }7 G& z+ R8 e: H
  P2OUT|=BIT0 ; //CS=1;  
7 s& B, {$ l5 u. n* J  P2OUT|=BIT5;  //sck=1;' C; A; c9 D7 {
  _NOP();
$ t! D. Q+ [# P7 H. \  P2OUT&=~BIT0 ; //CS=0;' J/ _, ?  c% O" e* o9 x
  write_byte(0x06);* X3 b5 f+ `6 r; H  s
  write_byte(command);
; R8 y$ i( U% A! [7 Q. }  write_byte(erase_address1);
  \1 R5 H) m, X  ]; O) A- Q2 X  write_byte(erase_address2);" U8 [$ B, Z* H2 ?
  write_byte(erase_address3);
2 `" H$ r" T6 `9 I0 P- Y8 h# ?5 C/ I  P2OUT|=BIT0 ; //CS=1;
2 W; }1 }- j: Z2 o. g2 }- @3 I  _NOP();
, w  N# K/ p, }" y5 D# @- G/ l5 L  _NOP();
& Y' Y$ X/ r7 b" L7 M% z  _NOP();
2 S" [0 b+ s0 I% j}
* J) C- K8 H/ K7 mvoid delay()2 h; Q1 W5 z: q" @$ u) U
{$ Y7 F7 @  w& n1 w+ \0 k% U5 U* \
unsigned  int i=0;) v  G4 v' w- L$ k  f" x
unsigned  int j=0;& _$ ?! s& @  S1 X' g) }$ p
   for(i=0;i<=500;i++)
; N8 l8 a' U% O+ J/ P      for(j=0;j<=250;j++)! j! o6 R. J% c5 c7 h1 Y1 v3 ~
        ;
' s- z. J8 B# ]$ h$ |7 R0 W, |}6 }6 z  t1 ]5 U1 R
void read_busy()
$ m! {% a* ^. ^' |' n/ N8 q: Y# j{
4 U- @4 q! X; v' j& W6 [   char read_data=0;   % C6 T- F% r# j) ?
   char num=0;
5 e1 `& }# x& r   P2OUT|=BIT0 ; //CS=1;  
7 c8 E- h% }) X: B6 N   P2OUT|=BIT5;  //sck=1;: t$ d4 o$ U+ F/ p5 d- V: i4 n/ Y
   _NOP();+ `2 [. G8 t6 q; W  O  W
   P2OUT&=~BIT0 ; //CS=0;
% c2 j' m5 ~2 \- j& G5 M   write_byte(0x05);        // read the SR1  + R8 C5 u8 ^$ N# Q6 z8 O
   do{  |1 }7 I' Y' `0 d( p* X7 h
                  
) t& v+ D- y# P            for(num=0;num<8;num++)
& Q; c$ r. i; E, K             {; C5 i- ?0 F! l" c9 v4 J9 |6 M' m
               P2OUT|=BIT5;        //sck=1; ) I, ]4 |2 D2 i' p8 @
                _NOP();               
/ U6 F( }! u6 w3 @, y4 M6 i5 b& t                _NOP();- o& T8 R/ S6 m* C
                _NOP();/ I+ H; v: B( u7 F
                _NOP();
" S8 y. Y* A# r% G+ `& ^9 v9 M" O) W- ?                P2OUT&=~BIT5;       //sck=0;              " ]) X" @1 c9 ~: t) g
                if(P4IN&0x02)
9 j4 v8 |+ {/ a4 A' c                 read_data|=0x01;% G. L( {# S) I/ V; y0 C) @
                else/ T' F1 X' p) h
                 read_data&=0xfe;                  K) Y2 W% o8 e0 z' q6 y9 b
                 read_data<<=1;
' e% G& p  t2 \6 [; R) {              }
9 P$ ?" B$ E' G9 i+ q" F; P            _NOP();
( C* a3 M+ c  g: m, U: E& b3 ]% n            _NOP();
" J; L! ]4 t, e$ ~* f            _NOP();           1 ?6 |3 c& @- A" b4 p
          busy_data=read_data;  
" W4 K8 E+ W9 t, m  q( S     }/ W) Q4 H) c! c! `% a! _
   while((busy_data&0x03)!=0x02);
+ a+ o$ H) b$ w# z" J+ ~0 i2 z  P2OUT|=BIT0 ; //CS=1;
+ `! d/ W7 N7 X7 `' R# _4 p   
; F6 j3 C9 t6 G; D9 H  7 Q$ @' u2 c7 X
}
1 K3 v7 u3 [- q5 X; Z  M+ ?: x. v: B, P) E" p
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!2 v- T2 I$ F  a5 ?/ I+ S
5 z7 I& U) S6 ^. X/ d9 X# U: r
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-31 07:15 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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