找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>- h+ A* |4 e" c
char readdata=0;0 B" j( _1 z5 r/ }( L8 @, N
char busy_data=0;( O; }# r( g. j! z: \+ a: [+ i
void write_byte(char data_byte);2 @# y4 b( a% y* S3 {
void send_command(char address1,char address2, char address3,char data);// command and address and data6 c3 K+ d" @: g5 x7 Y
char recive_data(char read_address1, char read_address2,char read_address3);
( [, @) w. P( r6 g3 g# Cvoid delay();* S/ v% i& B, E! l2 I5 W: R9 K
void erase(char command,char erase_address1,char erase_address2,char erase_address3);/ a4 M  l! Q3 r  V
void read_busy(void);& U) b* v3 z4 a4 h) }2 S
int main( void )3 x* k' v$ V% J8 A- }3 ?3 H
{7 V& ?! z# e- H6 B2 d* W
  // Stop watchdog timer to prevent time out reset
8 L* N9 z8 d0 x) n! H2 a4 b  B    1 g9 W4 z/ `9 u' J; `- I
    WDTCTL = WDTPW + WDTHOLD; " d$ s5 g/ \% H" T4 `2 L
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
4 M' l4 \/ o# t8 e  l    P4DIR|=BIT2+BIT3;   //flash  wp si output
; {9 D1 q5 f5 @   ( C9 ~% t" y! N- A4 ^' a
    P4REN|=BIT1;            // so pull up" D0 q/ H7 W1 a
    P4OUT|=BIT1;             //flash so pullup  selected p4.1
2 o# C$ Z! H( C- V    P4OUT|=BIT2;             //wp=1
3 \6 a( U4 p( h/ R/ N; A   
0 G. @# ^# \' H' ~* v" h    P6DIR=BIT4;( v" Z) ^1 u7 C; T* E+ C
    P6OUT=BIT4;            //led/ ?5 b9 K" V/ `" U1 Q
    P2OUT|=BIT0 ; //CS=1;  
5 C* Y1 ~- s8 m5 ~: h& T    P2OUT|=BIT5;  //sck=1;; L$ k' m1 w- ^' n% v
    //P2OUT|=BIT4;  // hold =12 |0 ^/ w4 k, X
    _NOP();6 G  j9 C/ T4 u2 {# T8 j
    _NOP();
: J" q( E, p/ P. y5 A    P6OUT^=BIT4;" n: X$ ]* _2 T1 O
    erase(0x20,0x00,0x00,0x00);      + F1 l3 `" F) w& m! Q5 |
    read_busy();   1 n! U. J# a6 b" e
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         / n+ v2 h( Y- s' }
    read_busy();  4 @% A1 x  K7 _5 c4 l
     readdata=recive_data(0x00,0x01,0x01);   
1 q2 m9 U; `. `6 f1 k$ F' `1 o    while(1): k2 I. C9 L) Q
    {
, {' h  U+ y: R8 M1 b+ V" w     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
2 {# c0 F9 f1 y           
) }: V  U  D- A      // if(readdata==0x00)
# y6 _9 o( Q6 a/ A9 z0 t       P6OUT^=BIT4;9 }) \0 C% w2 _. C) E! K! F, S
       delay();
- [; g8 w) V* C0 y9 ]9 D$ S5 w& D    //  readdata=recive_data(0x00,0x01,0x01);  $ Q/ V+ m+ V$ i. E' u
    }
; }! K' S. q' z8 k" {4 \0 X  
: r& y2 o* _/ s4 |. u! H, g}
6 E% k* A$ j8 ?' X5 t* F, \5 Qvoid write_byte(char data_byte)( O; M) \! T5 x- j' ^0 ]
{
/ G7 J& J  o+ n+ w/ {! |3 O char num=0;  
& w6 A% X4 t$ D for(num=0;num<=7;num++)
* ]+ q! K& L! d3 o0 _   {# W' M8 V0 }- h. |% J& j1 }# h, p' \6 K
  
  {1 ^. Q) `0 E     if(data_byte&0x80)
  ?0 ^7 m( w1 `! G       P4OUT|=BIT3 ;                //si=1;
" ^! |3 A: r: j& t$ _     else# b9 b5 N1 g+ I7 R, \& D" H& A" \
       P4OUT&=~BIT3;              //si=0;  
" m. }; x9 G9 o' q& O/ {       P2OUT&=~BIT5;             //sck=0;
. W9 A$ f  j6 Y0 r/ L       _NOP();  ) G! }% J. G1 n% B8 }: A+ f
       _NOP();( |3 Y, p# C' a" w5 N0 X
       _NOP();$ s) m( c0 ?8 ^& q7 i! c
       _NOP();6 Y9 _/ q& F5 g& Q5 A
        data_byte=data_byte<<1; //数据从高位传输  - ?. A7 S8 |5 x2 n8 z- }) v) H
       P2OUT|=BIT5;        //sck=1;   
( u" U0 ?" _, [. }0 C: X+ ~        
' _9 F3 ^, P- r7 I4 m+ |* j       5 g2 c' K: k5 M
   }
9 z+ x! \* s2 P# l! o6 z}
5 u: ^  x; m9 E) g8 o$ M9 Z  svoid send_command(char address1, char address2 ,char address3 ,char data)$ e9 W- P" H. `$ _) H. t' I
{
9 M, W  E) Z5 z1 V9 U+ }! \  P2OUT|=BIT0 ; //CS=1;  
2 k2 @9 }& \" q4 e6 w8 b  P2OUT|=BIT5;  //sck=1;9 Y8 K2 g: v# `2 \# ^$ A7 i* G
  _NOP();4 U3 u. F- t& X$ w0 F# z2 v$ U" ?
  P2OUT&=~BIT0 ; //CS=0;" w' O& t1 R' V4 t1 A0 c
  write_byte(0x06);   // write command6 G. w( o- [  w' x9 ?
  write_byte(address1);
2 r8 j5 r2 [* H/ I  write_byte(address2);( ~6 `, J. q3 N/ Q
  write_byte(address3);
' ?! Q# _8 X% M7 E  G$ Z% ]  write_byte(data);* g) l' G: ~; _0 Q1 r. W8 P  R
  P2OUT|=BIT0 ; //CS=1;
& Y+ T% ^- Y6 y4 O) P. C9 I" M; w+ H  _NOP();
1 v/ [% g( Q- W* e- {" [. u  B  _NOP();
% w- ^/ W7 T  w+ a  _NOP();* O: k5 C! U3 b( j9 o# g2 J
}
0 l' c+ t# m9 D0 H& a6 g% g0 b; f- ~- T. |4 G% C; W, T* S
char recive_data(char read_address1,char read_address2, char read_address3)+ a5 [7 C8 D! A' S
{5 G, `( p+ V. {/ ?3 s# s2 p
   char read_data=0;   0 T, B4 W& a! N$ ^" {' Z. K7 r
   char num=0;
1 T5 l2 }* C) o  b# e4 O* a  7 y2 r) ?1 k6 A, y/ {( C
  P2OUT|=BIT0 ; //CS=1;  
; v6 z+ A) a: \7 S' v7 ?: z  P2OUT|=BIT5;  //sck=1;3 z8 v' Y" l$ L. T+ F4 Q
  _NOP();3 ?$ x$ K' Y2 l. d8 _
  P2OUT&=~BIT0 ; //CS=0; & \$ J4 q5 c, `$ A7 `3 N
  write_byte(0x03);
5 }- ?' s. G; \! _8 W& M) @  write_byte(read_address1);  ( ~9 V! u2 G& h
  write_byte(read_address2); " n& h; e  ^  @* X# m. Y. Z1 }7 z6 k
  write_byte(read_address3);
! m1 i1 W4 E6 j6 k# t$ a3 x  # t- X7 {+ b" H7 g
  for(num=0;num<8;num++)5 n/ \% Y: U3 b' e
   {
$ ?; l+ a# J! |0 A+ r     P2OUT|=BIT5;        //sck=1; 7 D8 y' z! ^, t+ J$ z, B
      read_data<<=1;
8 s6 I3 a7 P1 F' J' h+ }! J* Z      _NOP();
, T: V0 \4 Z4 H0 ~( t& d      _NOP();
0 r# S! c% a9 K. F* U      _NOP();
& f; e+ C. j7 r- e* O  p      _NOP();
4 \  f4 S6 N3 Z3 F      P2OUT&=~BIT5;       //sck=0;7 y- n  V. N* [5 s
    if(P4IN&0x02)
+ N' C5 t, _. X2 N; W& V       read_data|=0x01;& d7 z- v& R: o
    else
" U0 N, C7 V3 f0 g  i6 r# {- G6 H       read_data&=0xfe;     3 r  \8 x$ ~' o; k+ P6 N2 E) m! G
      _NOP();1 I2 k7 \7 f2 a2 G; L2 v3 a' q
      _NOP();
* P5 I( V5 b- E" @3 ~" W, N     }
' F/ c8 g) M: |, D   P2OUT|=BIT0 ; //CS=1;
8 J) R9 G2 T1 e; S. I    _NOP();0 p1 r, _, O5 w5 D9 @; ^" v
    _NOP();
; w; z' W  L5 B6 d( \5 G: p$ d    _NOP();" U9 Z9 M7 h. T0 |
   return read_data;, L5 G7 |9 g0 U: U1 E5 E% n( G
  - e" u2 I$ d) o$ K/ h
    * l1 x* ]" E, b9 |# p! Z- i3 }
}; }. q) w& f  W; s( s9 L
void erase(char command,char erase_address1,char erase_address2,char erase_address3). `- |7 ~) L0 P8 }) Y% z; ?
{7 ?$ k% ^& C% l! E
  P2OUT|=BIT0 ; //CS=1;  - m7 P$ O3 A" u
  P2OUT|=BIT5;  //sck=1;
0 R9 O  o8 `' z8 C  _NOP();, L+ E9 d$ t2 E9 b+ b
  P2OUT&=~BIT0 ; //CS=0;
8 Z$ M* u3 y. d% x; k  write_byte(0x06);
' L* W' b# ?6 `, z4 d9 g5 Q  write_byte(command); 1 B" A& j* y, B
  write_byte(erase_address1);
8 f& a2 u- H8 F* a9 b  write_byte(erase_address2);
7 r% Z0 o* ]& S9 Y$ L7 E3 z6 B6 i  write_byte(erase_address3);
0 }$ L' Y. I9 C5 N; c  P2OUT|=BIT0 ; //CS=1;
" f; b1 O* f4 }1 r( p7 l3 ?  _NOP();
* O! Y, o. E7 b/ x+ O# ]0 X  _NOP();6 L6 G* g, U: ~3 w+ @
  _NOP();1 Q2 [4 ^5 u3 N9 X5 T8 G
}
4 d$ b/ t+ |! @5 Svoid delay()
8 c& r; v/ S9 [5 g- w{
, @  ^& n" n; F. Y  D: c unsigned  int i=0;( f. T- ]7 h& X* O# E( ]0 `& w
unsigned  int j=0;$ {- G) W0 ]" A* Y
   for(i=0;i<=500;i++)
1 U2 o9 _5 f2 q: S      for(j=0;j<=250;j++)
% }. W; v+ I( q        ;: U1 P( _; R9 J4 K6 u" _
}
7 @, ?# K3 B7 t. h9 `- Vvoid read_busy()
& O1 _; W0 e* F{3 ?. q* h+ v& C6 n* a
   char read_data=0;   
9 X8 l! ^8 f0 a. y9 @   char num=0;
. d( k2 C6 n4 J& M- S   P2OUT|=BIT0 ; //CS=1;  
+ o( V! o7 @8 }: E6 ^   P2OUT|=BIT5;  //sck=1;1 v3 o% A& D* O- @  J- G% r
   _NOP();
) \) _. |- L; Z9 V# ~9 ]3 N: k9 \   P2OUT&=~BIT0 ; //CS=0;
1 e6 w9 J2 J' D: e( A+ p   write_byte(0x05);        // read the SR1  
, L& \$ K. v; h  ^: \- F# F   do{2 i  k" i4 u. a! j& q
                   - m3 M& Q( G! m% ]. K
            for(num=0;num<8;num++)  s; f: Y! Z" B$ C0 d3 }
             {8 X- T" u  p* @$ K0 j, N) |7 M4 ~
               P2OUT|=BIT5;        //sck=1; 2 q) ~2 @3 ^' Y  S4 h! ^" z
                _NOP();               
# `) k3 Y1 f# p) `# z                _NOP();
2 u" Z' Y9 p1 f- C( l                _NOP();9 r/ E/ a/ v& I3 J! z# y% V
                _NOP();
+ m. J9 a+ I# g$ m  H/ ]' u                P2OUT&=~BIT5;       //sck=0;              
  E! ^- I) i( @+ P+ j3 F1 R  m" s                if(P4IN&0x02)
% P# l* `2 P- S& m% @" e8 H7 p                 read_data|=0x01;  ]  b; R8 c4 f% G3 _
                else( b! l3 H$ N7 U8 v. X$ H+ ]( Q5 n
                 read_data&=0xfe;               
0 d& a* [8 D5 R& w$ G( o                 read_data<<=1;$ [8 S0 i' C4 [& M
              }
8 E" f2 {! I$ s2 r% T            _NOP();; o( p' N% P* M' H" Z' j6 @
            _NOP();
$ o: B  M' H4 N' K. a            _NOP();           
1 S: q/ T  U& E: ?9 \( ?. A          busy_data=read_data;  
5 s6 m' s+ t+ g6 N- i' P: u" l# X     }- l' R, m! Z9 \: W2 b
   while((busy_data&0x03)!=0x02);
% Q8 R3 J$ Y% n  t1 n+ S4 v1 ]  P2OUT|=BIT0 ; //CS=1;" ^, [+ X7 ]1 [  {
    & F- y/ B8 O; |- H/ `, P# r: x5 m
  
' P% y. V0 c8 m2 ~1 \}
2 ]0 n( }+ q  M- Z
, |6 |% n0 C  L0 p用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
7 n$ S/ s( x! V! A$ Q* ]' a! M0 K' ]: i, X$ H, }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-8 23:35 , Processed in 0.547960 second(s), 32 queries , Gzip On.

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

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

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