找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>  V0 Y* {; j1 t5 Y) o
char readdata=0;* r% H8 T' v# h5 w1 i/ E
char busy_data=0;: Y0 J7 A, Y) z6 }
void write_byte(char data_byte);- o* v) Q2 x- g7 N6 a3 H5 L: W* M6 r
void send_command(char address1,char address2, char address3,char data);// command and address and data0 X0 h8 [3 ?* f- D7 s& |7 w8 t
char recive_data(char read_address1, char read_address2,char read_address3);+ s5 J0 D% R. `3 O
void delay();
$ e( J  U5 J0 ^! {$ C! U0 W" Tvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);: |$ ], i6 f' S" q) \
void read_busy(void);+ z* m3 d' y3 ]# f2 Y3 u& t- C; m" `) w
int main( void )
9 Q9 Y5 H% r. ^9 c{
: R/ t& M, `$ |! i9 _5 h8 E4 N# j; F* |  // Stop watchdog timer to prevent time out reset
1 m- l8 E, Z8 Z# r8 D, p    # ~5 e" H' ^8 G9 y( U2 {* L( {
    WDTCTL = WDTPW + WDTHOLD;
" i# s! p- |" Q8 B* u( ^    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
& y" j5 v7 X3 S" x    P4DIR|=BIT2+BIT3;   //flash  wp si output
0 d4 u% W# l2 W   & k8 O; z! n3 p& y. R3 Q
    P4REN|=BIT1;            // so pull up
" y% e* S% ^" h9 D9 t8 k9 d+ X    P4OUT|=BIT1;             //flash so pullup  selected p4.12 h% t+ H: J+ O: O% N5 H
    P4OUT|=BIT2;             //wp=1
- T, b4 f% e$ R- Z- A$ X   4 @- C' o( w+ X! K8 O! L
    P6DIR=BIT4;
) c$ {! j, u' m1 b    P6OUT=BIT4;            //led& n. P3 {& [( _% ^: s: n
    P2OUT|=BIT0 ; //CS=1;  
" \4 o2 ~6 |! \. u    P2OUT|=BIT5;  //sck=1;
, w# |* |- `3 d* [    //P2OUT|=BIT4;  // hold =1( g) C6 ~0 D! {* m4 r
    _NOP();; h2 @( X" p  c. w
    _NOP();, m- L! g. M) v  `* c# o
    P6OUT^=BIT4;
5 i1 N1 q- C7 K: @5 G( z$ |/ S    erase(0x20,0x00,0x00,0x00);      
+ u, p! h1 ^) {2 ^    read_busy();   0 m( f* Z" S4 }
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         , w3 Z- G$ T% m4 S) Z$ o
    read_busy();  2 ?2 i1 a8 Y! z! K
     readdata=recive_data(0x00,0x01,0x01);   
* W" ]+ k# s1 [    while(1)
6 O, z! J3 c- [  F    {
6 D: W! K! T0 o' N; B; P: Y     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
$ C3 F& @/ W" D  t           
2 p! r/ C5 K! d1 [1 r$ k9 d      // if(readdata==0x00)4 X; ?+ y. _1 e+ \: x/ p
       P6OUT^=BIT4;3 W% T! f/ q6 N) V
       delay();9 L' Z) i3 J* K+ N& W
    //  readdata=recive_data(0x00,0x01,0x01);    S% p  x$ E& _
    }
1 ^* x. y; G" t( b3 J* D1 T- I  3 X" c: }+ x) i, y. p& D$ ]' v. Y
}% G% x4 \! }( Q' |+ U1 [& y
void write_byte(char data_byte)
/ |9 F( ~# g5 i1 `, _  E, R{* [. ]6 u1 I# S0 Y: L7 N6 x
char num=0;  & d1 ]5 z* u! L" ?( P1 ^
for(num=0;num<=7;num++)
4 P; Q1 b1 ~( `7 ~' _   {
. n: M* l' b( z) b0 ?  
7 z& L6 I( F, f  [     if(data_byte&0x80)- Q  v4 S' l% q) m( C7 n: ~+ }: q
       P4OUT|=BIT3 ;                //si=1;
3 t; U4 i+ g' h. [     else1 W' t# [3 l) o# P; T0 V6 k6 @6 c
       P4OUT&=~BIT3;              //si=0;  * I7 X! V: ]3 q1 A' B9 k  T4 o
       P2OUT&=~BIT5;             //sck=0;7 j  j# H3 S4 m3 t
       _NOP();  
2 [( T$ ?3 d' }2 m5 R5 U+ }       _NOP();
( y+ I5 T: |' ?2 e  ?       _NOP();
5 V3 @' k% c! [       _NOP();9 B9 |1 o& B, R/ `5 j
        data_byte=data_byte<<1; //数据从高位传输  
6 L7 r+ N6 Q# Q, k1 X       P2OUT|=BIT5;        //sck=1;   ! z2 D$ M3 @! z& B* c/ b8 H3 ]- z
        
/ {8 j* _1 z2 D1 x      
) x+ r' D: g, l2 L. S   }
. s+ h8 e& \/ `6 A0 X( I}
9 V0 y  [# K8 G  U) H* vvoid send_command(char address1, char address2 ,char address3 ,char data)
" E8 y! a$ C+ k* [( j1 I7 ?8 x{9 X. o1 W' t/ |/ S% r; f0 X
  P2OUT|=BIT0 ; //CS=1;  
! p8 |( V2 l8 u( m, H2 [  P2OUT|=BIT5;  //sck=1;) [8 |! q' ^! }4 U) u" U# V5 _5 d
  _NOP();
" g- T' @& @' ^8 D" y" v+ M& X3 j  P2OUT&=~BIT0 ; //CS=0;
4 m# d3 k) V8 f5 v5 I  write_byte(0x06);   // write command  k$ T, w) }# M5 r. b
  write_byte(address1);+ \- W' a$ D% z) H: L9 N
  write_byte(address2);
% Q5 c0 \2 C, z( [; x* P  write_byte(address3);  g) C. o- M) [" E# p2 B
  write_byte(data);& D6 U  u! \: T; \
  P2OUT|=BIT0 ; //CS=1;
4 O4 f; ^8 n- v  _NOP();2 d5 U" J0 e3 s: M: J4 f$ M& q
  _NOP();% k7 Z' R, L; u
  _NOP();1 {1 u" d7 a+ J6 W& @
}) k. e4 c# N2 B9 `
% R7 @/ Z7 \- C0 }% `' b" s( f
char recive_data(char read_address1,char read_address2, char read_address3)$ R! ?9 U0 {( W. r+ p( I
{, q% H# e  e1 U4 z- v: ^1 T
   char read_data=0;   3 L$ Z5 m) T3 ~$ V) ]
   char num=0;) \( f7 `3 Z" w
  
  {3 D% P7 q: [! o0 C5 R  P2OUT|=BIT0 ; //CS=1;  
" y- R9 g+ n0 _3 ]" [) e. s- N  P2OUT|=BIT5;  //sck=1;* ]: E* U) q0 W& b4 V
  _NOP();) |7 j2 M6 h# a$ n0 h" t
  P2OUT&=~BIT0 ; //CS=0;
  p8 A3 v! ^5 w2 T$ b" N  write_byte(0x03);6 \3 e* c6 A2 C# _; i
  write_byte(read_address1);  ; S- \. X% ~+ f; [$ X; w4 ~! t
  write_byte(read_address2); ; e2 U8 k; Y" V) w
  write_byte(read_address3);
' d+ t5 X4 n- H& v  
( K: O/ a( O* G; c, f2 W& |5 H  for(num=0;num<8;num++)/ g. v. T) O  A0 d! P
   {
( T5 j; i( e! F1 d" i1 Y; S" m/ w. b     P2OUT|=BIT5;        //sck=1; - K2 B6 ]8 Q% [$ d
      read_data<<=1;
6 m6 Z/ f0 P$ b( l+ d2 D! N      _NOP();; ?2 X# N' ]/ r7 U  V! M8 u9 d8 N% O
      _NOP();
$ e* w0 ^9 _7 U- @6 H! O( u# L. n      _NOP();: L5 S2 `( F6 y5 Z4 Z; q
      _NOP();
0 F8 d' [. c3 o4 L: w! Q      P2OUT&=~BIT5;       //sck=0;
0 @3 v1 c0 s6 D9 d: p1 Q4 c2 p    if(P4IN&0x02)
6 |! d0 h( y7 F& \/ B# @       read_data|=0x01;$ H' q$ f4 X& h* E
    else
+ `9 W# T: ~6 Q9 r5 U0 P( `       read_data&=0xfe;     / ?' R* g6 Y0 y% C
      _NOP();
3 g8 K7 f6 k7 H, X+ s      _NOP();
& D- {: y  s4 K0 T. G9 b% D     }
, B. n7 |) D) D5 ?$ y2 L. J   P2OUT|=BIT0 ; //CS=1;$ G+ ]$ F4 Y; I3 ^
    _NOP();
% p! C" G  Z$ E( Q, G/ D, y    _NOP();3 P3 ?- |2 O2 v& v9 a* X) l
    _NOP();
9 N- a6 e* B! y8 z# t   return read_data;  [2 q7 ]* P0 c, u/ Y: ~7 c# _
  # i& _- v1 g" K. g- q! E. a
   
1 L2 A4 ]& J3 x! v0 Q8 n- N}1 v+ Y% m, v3 m
void erase(char command,char erase_address1,char erase_address2,char erase_address3)& r5 Z9 d8 c- d5 ^7 R
{8 ?* E& ]0 y0 G7 A  D9 K
  P2OUT|=BIT0 ; //CS=1;  6 Z2 L# _# K$ r4 z2 F
  P2OUT|=BIT5;  //sck=1;
9 ]1 N8 p6 H( `! q) [0 `  _NOP();
! D3 I  y) H" k) E! T* K  P2OUT&=~BIT0 ; //CS=0;
" `  z) Z" Z3 Y  B; N* q2 Q$ e  write_byte(0x06);
: w( W7 _! u2 ?; Y  write_byte(command); 5 i2 k' \2 ]/ O4 T: h: @
  write_byte(erase_address1);, Y6 y3 t. c. z; h
  write_byte(erase_address2);
' ~' t/ t: `+ C- Y6 d5 ?+ S* E  write_byte(erase_address3);
# y* R1 Q9 u  j  {6 {0 X7 R  P2OUT|=BIT0 ; //CS=1;
2 K$ Y# A3 p/ q! r1 w  _NOP();
* V4 _9 x6 |. C  G, S& U  _NOP();4 A- x9 S; i  ]6 ^, G+ f
  _NOP();1 E3 o4 {# g- R
}
! P/ \" [* J6 ?8 |/ I) Ivoid delay()
6 q, e5 q  j( i2 u. Z2 V1 ^{& @% |6 u6 v3 g2 B( D
unsigned  int i=0;# g) g8 I$ I1 O: @
unsigned  int j=0;& z4 ?( k) d2 l+ `( N* c  ]
   for(i=0;i<=500;i++)
! R7 V8 T: o1 h      for(j=0;j<=250;j++)7 t/ T! s# i) [
        ;
7 ^8 `9 k4 O3 i$ ]/ ~0 U# l}
' W0 K% c8 Q$ s3 O- c2 zvoid read_busy()
! g  h1 F" a" Q3 {$ \* ^: H/ Q3 j{
, R6 i" R( _- M1 G$ t. n   char read_data=0;   
( i( q5 b2 Y( z5 s7 u& o   char num=0;
2 Y6 R( {" ~& Y( d) f( p) s& Z# c   P2OUT|=BIT0 ; //CS=1;  ; S$ S; f7 Z2 L* r8 q4 [2 |
   P2OUT|=BIT5;  //sck=1;
  {* S: C4 g% n; E7 U$ T   _NOP();
& P( `6 f% E) ]; ]* q   P2OUT&=~BIT0 ; //CS=0;
9 J! C  j6 Z) ~/ {1 Y. m: l$ g   write_byte(0x05);        // read the SR1  * L' |$ \3 f- ?- Q2 J9 N- E
   do{
8 x- Y) O, j. p* O0 e                   $ _# Y, w8 `  s( _* O9 h2 K
            for(num=0;num<8;num++)
# P% m4 H) P6 j# h8 Z- j             {- J& q: ?. U$ ?) N: v
               P2OUT|=BIT5;        //sck=1;
$ p+ i5 f1 i$ t$ w                _NOP();               
* m9 ~3 n: o( [8 R                _NOP();- A( X: T2 b; P4 z% D$ r8 F
                _NOP();
, F( R" d' k6 a                _NOP();
' k) i) G: U8 b0 N; N5 G                P2OUT&=~BIT5;       //sck=0;              
4 y: V5 a* i5 M: U: i& d' q                if(P4IN&0x02)
2 T8 ]; J# Y  d3 L- k1 z                 read_data|=0x01;
. d% b3 {6 `  p8 j; h                else
% F) D5 h, X; n1 g8 ~, K! u                 read_data&=0xfe;               
" d% p6 i: b& O& \2 G                 read_data<<=1;3 E. N8 t+ O+ a! T5 H0 O
              }
9 ~; s" B- F- v8 [            _NOP();
7 r9 p- z8 R6 |5 ^9 z; D: Q/ m' g            _NOP();& g. u9 {0 E' q/ f' ~0 \
            _NOP();           
) ?% ]9 h8 K5 _" c9 M. ^% r          busy_data=read_data;  
! _0 ~. w5 c! V& W% e; q' j     }
' R% D/ D! a# ~+ c+ Y# ?$ a6 P# s1 X& l   while((busy_data&0x03)!=0x02);
, H5 ^. O0 _# u# M. @  P2OUT|=BIT0 ; //CS=1;- [; }- H1 g* C9 k5 ?
   
7 F& T: z) |) D) E& y/ y# [  
) W" K1 N+ L! m- K6 {}
- \/ i4 z  ?. G: C7 Y: Y5 R. D+ i- u, Q
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!# ]% ?. F6 o  A! ~0 a$ R& b

* M2 Q7 S: `( L9 `% v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

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

GMT+8, 2025-7-16 04:32 , Processed in 0.054327 second(s), 30 queries , Gzip On.

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

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

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