找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>
8 Z' R( t6 l, c: m, F5 Jchar readdata=0;- r7 c/ v, b/ @4 |
char busy_data=0;# i! g& o5 a! c
void write_byte(char data_byte);9 p3 _4 Z& }6 }1 Q7 \
void send_command(char address1,char address2, char address3,char data);// command and address and data. Q- c6 i) K+ {7 m
char recive_data(char read_address1, char read_address2,char read_address3);4 u# T! K' x" ^
void delay();
( z( T' r# R+ r3 k9 {3 [9 E2 Mvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);
% e: @, v1 `. v' p1 B5 F- C' vvoid read_busy(void);
- i" K  `& s* H: p* z# H/ Hint main( void )* c4 _' O$ ?5 w. H$ C
{
* Y3 w* ?, C" r( G, X  // Stop watchdog timer to prevent time out reset
# I6 ^& B( e% i: V4 h6 G8 b    0 J0 f, P7 @0 x% o9 X/ I1 Q, F  }
    WDTCTL = WDTPW + WDTHOLD; 2 s+ R5 z& c$ g, h1 V5 o9 b# |
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out  U. h& q6 b8 [- V& k/ D( R9 O
    P4DIR|=BIT2+BIT3;   //flash  wp si output
0 g2 W4 r7 _( q   , f: X8 d3 l* {+ u& U! @' R( ?
    P4REN|=BIT1;            // so pull up4 u6 Q( t0 l9 S/ j$ m. R% k
    P4OUT|=BIT1;             //flash so pullup  selected p4.1' \8 h8 u, }4 K) h/ Y
    P4OUT|=BIT2;             //wp=12 @5 z) @5 n$ x
   2 _+ t( _1 W; z5 \3 @8 N
    P6DIR=BIT4;) J' H* \9 b5 E% {
    P6OUT=BIT4;            //led
. L% r9 S2 l6 h' c' S- g) e    P2OUT|=BIT0 ; //CS=1;  , {! K: u/ k1 b0 g6 A5 e5 k
    P2OUT|=BIT5;  //sck=1;
  G6 E/ P- G2 n! G5 d; ?8 V* e    //P2OUT|=BIT4;  // hold =1) R7 z  v5 d5 A
    _NOP();
+ \  z, J6 q4 {/ O* T! R+ U3 d8 Q    _NOP();
3 b; S  @* [- O1 S* ~2 ~    P6OUT^=BIT4;! ^4 ?  \7 W/ A2 \
    erase(0x20,0x00,0x00,0x00);      
5 R0 C5 \* @9 ]% q* P0 M- |8 ]    read_busy();   7 h7 d& H9 M  f) H" k$ Y+ t: x) y
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
  F2 q( q8 Z5 {6 M0 u! L0 M    read_busy();  
" X5 @: j& J) `8 \     readdata=recive_data(0x00,0x01,0x01);   
+ @6 G% i* @& w' d    while(1)- R1 d' ]& V; S) ^$ k
    {9 s0 V* q% z: B$ d% O
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
" O/ A9 D$ c" f           9 s# Z4 i( _- S/ G
      // if(readdata==0x00)
" n3 U$ O+ ^. K# n       P6OUT^=BIT4;
& `. q2 [7 G% R9 g1 t4 \6 ~       delay();
2 O+ |9 w8 E$ ^/ P    //  readdata=recive_data(0x00,0x01,0x01);  ( g5 x# S* d2 g6 c$ V4 t' G
    }  M. H! r# _2 n# P0 ^2 b
  6 V& i3 B9 t3 f5 ?
}1 p2 O' ^3 S- V9 J5 v) M
void write_byte(char data_byte)
# r& }  J% _% \* Q{. W! w, c! E' J% C! F. l; p3 q2 F
char num=0;  0 T& z+ E9 d7 R$ I$ U
for(num=0;num<=7;num++)+ B- f# Y- M3 Z( k4 p
   {. O! W& }. p7 f9 O1 O3 `
  
& g# I9 q& P8 c, N1 G) p     if(data_byte&0x80)3 {2 F4 w0 l# _% }
       P4OUT|=BIT3 ;                //si=1;
$ f' d1 K/ i; A+ x. U" T8 w0 q* R- r     else  v. m" _! f" P3 ~# t1 L5 ^6 @6 U
       P4OUT&=~BIT3;              //si=0;  
: M4 F7 g) {: p       P2OUT&=~BIT5;             //sck=0;
& x: o. O7 m4 Q! r. W       _NOP();  
$ ^# V; b0 T. G+ b       _NOP();% \- B  T; ?& z( V/ f+ A
       _NOP();
1 ?, X# Q; [# D9 c* Y       _NOP();3 D8 ]5 L; U" I* G- T
        data_byte=data_byte<<1; //数据从高位传输  . w5 b9 }4 \. p/ F& K' P# b
       P2OUT|=BIT5;        //sck=1;   6 z7 Z2 [; }  V2 c( i
        
- Q) u' k( b  j* e, A       ( `6 v( q& a: Z1 a  ^  e1 ~- N
   } , \! R$ x+ h0 [' o
}
4 M* w6 W/ p0 s0 M) e# Z+ U8 u4 yvoid send_command(char address1, char address2 ,char address3 ,char data)+ a, t) V1 e* m) [/ |& K
{
% T# l' l3 Y4 V- i  P2OUT|=BIT0 ; //CS=1;  
! k# X- E+ A) x) U* r, B5 \8 F; Y  P2OUT|=BIT5;  //sck=1;
! {, v$ m+ F! S. B# r/ T  _NOP();
, S( Q5 |5 N2 j7 e" n% e  P2OUT&=~BIT0 ; //CS=0;) S# q2 {7 Y% D7 J1 `( X# f
  write_byte(0x06);   // write command' S9 @( ], S6 M6 C' a( M3 j$ U
  write_byte(address1);: H1 u  C  @& N  s
  write_byte(address2);, p9 H+ h- ^$ h0 ^
  write_byte(address3);* J% K0 D& {8 m' v" N: f
  write_byte(data);" }9 N% s) b7 y  r+ G
  P2OUT|=BIT0 ; //CS=1;, g$ b( V. z$ `5 x: y4 ~
  _NOP();, ^; R/ `) K2 R  C4 a& `0 r/ Q
  _NOP();
& O8 ^  x, g* w8 T/ p) ]' [; _  _NOP();
0 c8 E8 [1 u/ x}4 G4 b8 o& G1 f
2 Z+ [. ~6 t' A. {5 ?2 \+ a  y
char recive_data(char read_address1,char read_address2, char read_address3)
  i) m: R0 u% l8 ~, |9 w( F{
/ u: a/ h) L, q# a% D   char read_data=0;   
4 Y( C" |, z- e! s* X+ e   char num=0;3 S* f: w! E: @; |
  
3 X1 _% G  C# d8 H  P2OUT|=BIT0 ; //CS=1;  : C: }) l) n: m' ^
  P2OUT|=BIT5;  //sck=1;
% q! l: v7 Q) k$ J! `7 b& O  _NOP();
) h6 y  L6 I+ R! S  P2OUT&=~BIT0 ; //CS=0;
! n  Q* @- {  O: z  write_byte(0x03);$ T( {7 o2 Z8 Y
  write_byte(read_address1);  $ M7 ^# ^+ p5 q6 Y( E
  write_byte(read_address2);
9 f- f$ y+ k  c+ D7 R7 g  write_byte(read_address3);
, @4 }' V' u; X- n. g* u9 s  
4 T/ n' g0 U' K: r0 |  for(num=0;num<8;num++)
6 w) a5 x8 w$ Q   {
/ S: g  s5 a5 u! p; x& E3 @6 y+ q     P2OUT|=BIT5;        //sck=1;
& N# o/ k: T- o7 `9 y      read_data<<=1;; `* _6 X  _; \
      _NOP();
: C7 ^; S; ^8 h5 m! K      _NOP();
7 n4 Q$ J0 W$ z0 F* y1 e7 [" h& ]* ?      _NOP();
# Y/ C, q$ ~; I5 v) d' j7 u1 q      _NOP();
) R+ W8 i6 P# B      P2OUT&=~BIT5;       //sck=0;+ q0 J7 H  z9 y0 `) L, q& K* q* H
    if(P4IN&0x02)( Y! {7 M6 u& p  B- r
       read_data|=0x01;
4 E3 c8 V: [7 E2 M  m$ U; {" v    else% J! |0 S) ~" ]
       read_data&=0xfe;     1 I  l. Y+ k: V9 z9 }) w
      _NOP();
+ ~: {' h! x" C$ [  ~      _NOP();
6 t3 U: V2 G: g/ F1 d     }
. j- b3 F! y, N& N* N, G   P2OUT|=BIT0 ; //CS=1;% m1 X4 y) h& K! l. b  ~
    _NOP();* ^8 h8 q8 L9 F% [
    _NOP();
5 b$ _5 Q- H/ G6 I    _NOP();( V" F9 c, m' j
   return read_data;. I% s6 Q2 K+ n. ~/ L  f
  $ m7 N0 \0 Q- R7 b% w6 ~, [
   
; t! B. I# s) J5 u* i9 F% H}
& Y* d4 k; }/ {void erase(char command,char erase_address1,char erase_address2,char erase_address3)
9 i8 E( z- s: b( G2 O! @{
: ]% x7 v7 O+ h  k' @/ R  P2OUT|=BIT0 ; //CS=1;  
# |9 g+ Z# y2 C5 A1 T  P2OUT|=BIT5;  //sck=1;0 L+ {+ [4 [4 U
  _NOP();' P7 N' Y" T; ]- u6 H) ]
  P2OUT&=~BIT0 ; //CS=0;5 |: f2 p, ~+ P) m
  write_byte(0x06);
, K" O- `6 u; l" `8 q1 M9 I  write_byte(command);
) Z% c6 r, e- y: E; N  write_byte(erase_address1);
. M4 r. g6 _& W) r0 w  write_byte(erase_address2);* C6 O2 u% p$ h( W8 a& j6 k
  write_byte(erase_address3);& ^( X4 c$ u; G
  P2OUT|=BIT0 ; //CS=1;
; j; M2 N! ?3 t2 ~/ u9 A% U6 H  _NOP();
0 ?6 P% a3 x& ~$ w1 v  _NOP();
' n( ?) H% v" d" |: v! k  _NOP();* X6 D- t: z% B8 K! z% c6 @* q
}
. G2 [" G9 n2 e) L( |* E, Fvoid delay()
4 X* P7 G0 t/ u; n/ l8 J/ N& S9 @# ~{+ O$ s( T4 O3 c$ c# P0 H; `- k9 M; Q
unsigned  int i=0;
1 \* s) k  N5 }6 \* q unsigned  int j=0;6 s; A! }/ G6 _* r6 x$ P: v
   for(i=0;i<=500;i++)( A: ^- B( ~3 W+ f- u' V/ y; U. U+ \
      for(j=0;j<=250;j++)
2 W9 p* i1 w+ P) d! g" J+ L        ;
4 S, y$ y: j9 D  O! ^}
- \6 O0 c. d$ Gvoid read_busy()
" {: w- Y3 a: s& H+ m) G. B{2 C+ Q6 g- k# X. n
   char read_data=0;   . K( q. c3 _3 ~
   char num=0;
) ~  }5 L* w  I: B   P2OUT|=BIT0 ; //CS=1;  
; |3 l6 c8 E7 K0 z) P" P5 s3 }   P2OUT|=BIT5;  //sck=1;4 [* Z- ~! t8 I  |
   _NOP();: x) u: C' f5 l: b8 U
   P2OUT&=~BIT0 ; //CS=0;$ n% z! r0 u: M/ r) w
   write_byte(0x05);        // read the SR1  % H- s, Y) \9 }: j# ~2 J* D
   do{
1 [3 x6 N% H6 B( Z' V                  
3 e3 o, I- ], y  f# d: m. n            for(num=0;num<8;num++)( D% V6 i- `- U$ M6 ]" n
             {7 z! i7 y4 z# w' r: S/ I
               P2OUT|=BIT5;        //sck=1; 6 T$ C2 u, B, D9 F8 d  o, M
                _NOP();                ! q. m% T$ g8 O& I5 A
                _NOP();( {* D% t3 L* p& S% _* y* E7 X+ b# P
                _NOP();, v/ k8 Y2 I5 n5 K; p: @$ t' E5 O
                _NOP(); 7 ~) h' g$ B* M6 h/ D- N
                P2OUT&=~BIT5;       //sck=0;              
# A% m" J( m3 c4 L/ j                if(P4IN&0x02)
0 @- N! K! ]/ }! r& Y                 read_data|=0x01;
+ Y. |3 T0 e; e7 H: x3 j                else. t# l( e5 D/ l
                 read_data&=0xfe;               
# y7 h: t- K; b, L6 l6 j                 read_data<<=1;6 M' g8 b5 o' d  j! g6 p% \
              } ; U, J: ?3 A) l5 N
            _NOP();' s9 b; M3 K' V
            _NOP();
; O4 v4 ?1 t3 ?7 g            _NOP();           
! y: X0 g+ i" v- ~4 ?' E* Z          busy_data=read_data;  9 s, n; h: E/ w+ e, ^
     }' l; R1 l' l: t1 C& D
   while((busy_data&0x03)!=0x02);
& Z7 ]0 T$ P, n" @" k( }/ f  P2OUT|=BIT0 ; //CS=1;; @8 K+ `$ f  I; a9 B
    ' M5 d5 t9 i* H) @& Q2 N
  
( V) C9 P5 t4 J. z}
9 h4 |7 `) X1 ]1 Y( F: U+ E& T3 _$ E4 V. X
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!/ a: m5 v' x, a6 \

) G* E1 e: O+ u9 {2 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-20 09:12 , Processed in 0.056690 second(s), 32 queries , Gzip On.

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

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

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