找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>
5 }! |; F2 l3 h8 P, Fchar readdata=0;: w( Z$ o: j: [
char busy_data=0;
/ g) d* s# W$ Dvoid write_byte(char data_byte);; U+ y. _1 ?& x' b- ^) p% t  f
void send_command(char address1,char address2, char address3,char data);// command and address and data
2 ^+ K1 |; H5 U; ?char recive_data(char read_address1, char read_address2,char read_address3);! i( j$ W" S* M) T; k. X1 \
void delay();
4 w$ c6 L% W5 W# ^$ ^void erase(char command,char erase_address1,char erase_address2,char erase_address3);5 V. S; L, ~6 [" G6 v/ x& p
void read_busy(void);: n: ?/ j; p3 {$ [
int main( void )
+ l  [4 g- c- ]5 p$ G& S) g! T! l6 h{
- d; a, W6 X. P; m5 {9 f  // Stop watchdog timer to prevent time out reset
3 ]: M. B5 _! \4 X0 @    , Y) K7 x' S  ~1 N
    WDTCTL = WDTPW + WDTHOLD; 9 m( v# \3 q' ]6 d  O" z( u
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out; H1 u/ |; _. O' u1 L- `
    P4DIR|=BIT2+BIT3;   //flash  wp si output
: U3 z" q7 S# H2 U   : N9 z, A' G; M4 L. n4 s
    P4REN|=BIT1;            // so pull up
# ]6 g8 L+ t: J7 m7 ^/ _: p2 x! B    P4OUT|=BIT1;             //flash so pullup  selected p4.1
" I% C* f, \5 O2 i$ T    P4OUT|=BIT2;             //wp=1
+ P; u- ]% I% s( E' K# T& P4 ]   
- f5 T; p# n, m" K  l2 x4 U    P6DIR=BIT4;
" a2 R+ K/ |/ x    P6OUT=BIT4;            //led- U# {+ X# {7 s+ z2 e. P1 I! x3 u
    P2OUT|=BIT0 ; //CS=1;  & V3 s" R9 I- x# g* D+ D) f6 ^- u& b
    P2OUT|=BIT5;  //sck=1;/ P; c8 J( y/ ^% d3 G8 A0 `
    //P2OUT|=BIT4;  // hold =1
6 p5 L7 c% B1 |" j: B. u" \" U    _NOP();; y& G) t& q6 M, f: V
    _NOP();
; j; \! }( P0 L$ r1 [9 H. ^    P6OUT^=BIT4;& W' F5 p6 f5 T6 P% T
    erase(0x20,0x00,0x00,0x00);      + A+ K, R+ Y; n
    read_busy();   
, A  d, p2 o# Q4 c    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
7 z2 Q7 e4 l) m  \$ _    read_busy();  & R% U6 C7 h% \6 C: ~
     readdata=recive_data(0x00,0x01,0x01);   
( J, T$ {% H4 b    while(1)
2 m: M5 x3 m* U8 X! x1 Y% y  w2 b2 _    {% Z5 G3 m- b5 w
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling4 f& H6 ?$ A; {# X( A, ~) V
           
& o1 R- i0 @* l- n! G% i      // if(readdata==0x00), d% M. L( ^  I! T. o; D( k' F
       P6OUT^=BIT4;
3 l# b1 m4 Q  d$ ^       delay();
( Y! Z0 T" f8 g7 g& c. B    //  readdata=recive_data(0x00,0x01,0x01);  8 M  F3 H8 P  a' o) X
    }. P$ e# w& |% Q% ]; P
  : q2 ]8 B' H& O5 A$ J( E! F% p$ {
}+ r( d$ N2 V+ `, ^
void write_byte(char data_byte)" b* Z6 Z7 T. @" g. y; _6 Q
{' t* M8 H" S& k# t# L
char num=0;  
# A3 v; P& }* r' S; r5 Z for(num=0;num<=7;num++)
6 N$ W# P& U6 S# A( [# a1 H6 d   {' |" h" b2 N  l" b) K# v: \
  
% H6 x* Q$ H  S5 B     if(data_byte&0x80)& z( a+ m3 \- J* f+ N) y
       P4OUT|=BIT3 ;                //si=1;
: C7 L$ x$ E7 G) h     else% @! @2 D* o0 _! H. i, ]) f
       P4OUT&=~BIT3;              //si=0;  
5 s( G+ J& F8 r3 z& c# p: _       P2OUT&=~BIT5;             //sck=0;- K- |7 h8 ^' o1 }+ u
       _NOP();  
4 W4 |$ d  `. ?) v       _NOP();
7 Z& _  }6 M: s* q6 I: }       _NOP();
; o2 O5 l) C' e; c. Q( o8 `4 f       _NOP();# e( Y4 J# M$ k, b
        data_byte=data_byte<<1; //数据从高位传输  
1 F3 A8 A5 b. Q' x! x       P2OUT|=BIT5;        //sck=1;   4 f2 t. v$ z5 b
        ' i9 d( C* |+ |+ e/ L9 ?# b9 t4 Z, _
       7 M) }. f) l7 N' a8 ^$ s% A
   }
. l( T4 g4 M7 l" H. [9 z- d}2 {1 w/ ]3 y, s2 j5 k7 \+ P5 P
void send_command(char address1, char address2 ,char address3 ,char data)$ F  t5 D; R/ n
{
, U, B- \, d8 `9 O% t+ s, i2 z  w  P2OUT|=BIT0 ; //CS=1;  
$ }$ y  T9 N6 @+ c; j: [8 E2 V  P2OUT|=BIT5;  //sck=1;
$ _, C7 v: ~& t9 c5 z  _NOP();
7 n6 C& b( O! W( ?, Y  P2OUT&=~BIT0 ; //CS=0;+ q2 e* T. x! y) K
  write_byte(0x06);   // write command
5 m( w! \) r2 Y  write_byte(address1);
0 ~0 u) _3 K1 r, G8 ~6 g' G  write_byte(address2);1 ?4 g2 q' S* P% F8 K# N+ x0 V( w( K
  write_byte(address3);
2 u, E1 N0 {* P6 y2 a) ?, p8 J  write_byte(data);8 n/ A' n  L2 I/ O& \1 F5 [
  P2OUT|=BIT0 ; //CS=1;  P1 e' }: w; r1 C4 w0 B
  _NOP();
9 S- k1 d7 ^1 U. H3 s$ g* a  _NOP();: f# m2 J9 D1 r; x0 P  P
  _NOP();
" {$ M: g8 L& w: B6 V}
: C* d2 w! a$ q  n' N( y- m6 U, w$ ?7 _" ]  Z
char recive_data(char read_address1,char read_address2, char read_address3), \5 M( V/ H; `) o) g
{, i  W2 j) f3 D; e' l0 w, E) p
   char read_data=0;   
' L9 Q/ y& T( q, W; \, l   char num=0;
0 M0 T2 a; D1 e" C; E9 g$ Q  3 y& |% N% Q' }' b  s
  P2OUT|=BIT0 ; //CS=1;  
1 ^- |, `' v3 O% \$ `  p  P2OUT|=BIT5;  //sck=1;
, c, e6 u+ Z' O/ M% s6 W5 ?  _NOP();
% ?3 H( {; D3 r9 M( V  P2OUT&=~BIT0 ; //CS=0; : o" e% a( t& H3 m! i- O+ I: M; P1 d
  write_byte(0x03);
, {  x, A- ~6 ^! c. P% p5 q2 H7 m  write_byte(read_address1);  
/ g: ~8 q3 V& b5 U. C  write_byte(read_address2); 4 U9 }2 b5 H* B, v0 v
  write_byte(read_address3);
  o! c2 ?" k6 d. B. B$ D% j  1 E( E* E. I7 T4 U; W
  for(num=0;num<8;num++)0 q  b  z* ~; |' J& N7 o
   {; p" `& w7 T1 l; M' Z
     P2OUT|=BIT5;        //sck=1; 0 p* r4 u. j/ ?: u
      read_data<<=1;
: [7 Y7 e2 `9 S) C. J      _NOP();& v8 H9 @6 {2 S. ^. P  F* [
      _NOP();3 L) b( o+ h2 |8 [: f
      _NOP();
' N# F. Z2 U+ E+ F8 I6 V      _NOP(); - b2 M, E& W  [  ^% Z# l8 m! g
      P2OUT&=~BIT5;       //sck=0;+ v  z8 g1 S9 R% K
    if(P4IN&0x02)( p- Y, i5 ~* X5 j3 N. Z
       read_data|=0x01;
* o+ _% A( e* }. v# i: f    else1 _* {; N% @1 }3 q$ K% q  I5 @1 w2 m
       read_data&=0xfe;     . D, z$ }) s8 ]7 O! R1 M+ P/ |
      _NOP();. H6 I. D) D, K
      _NOP();
$ ^+ c, j1 c" k/ ^     }
( d4 R3 V' _! ?; u# t% u   P2OUT|=BIT0 ; //CS=1;+ {0 J; ^1 D  }: ^. P" ]0 E
    _NOP();
/ ?6 G: ]8 g0 y/ |) K; N+ H9 i* f+ T    _NOP();
" O% F2 `" D( d; O    _NOP();; z$ ^; m  D5 y
   return read_data;" I- ]! E3 C: k
  
" A7 T4 {8 }5 j   
  D: o# @6 d1 m& {( u, S1 y4 G}2 C# h4 i) W( J# f* Q& ~7 M
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
. V; T0 a$ b& M" {+ f{
! {' l2 n* b& ~" V" y" e( I  P2OUT|=BIT0 ; //CS=1;  + l! s$ m/ ~# `: K7 M" e3 d
  P2OUT|=BIT5;  //sck=1;0 N# X7 c- d% J; U" Q" w
  _NOP();
8 }4 Y! X3 d& U* n/ O% [  P2OUT&=~BIT0 ; //CS=0;
' s% U' @/ q2 C/ J( o1 q: o3 ^" I  write_byte(0x06);
/ j* S/ E" s3 Y/ D  ~; {6 f  write_byte(command); $ t5 A3 p* `; j! h7 m# Q
  write_byte(erase_address1);0 }7 N) g" y8 P2 ^
  write_byte(erase_address2);
  J3 R  \4 V, R+ {7 n% F5 B7 [  write_byte(erase_address3);% G3 {8 H7 j0 B+ _* h
  P2OUT|=BIT0 ; //CS=1;
' y: a! Q( W' a8 b. R+ w: r- l  _NOP();* ~2 x% J8 [3 \0 t! ?8 x9 }7 C
  _NOP();
3 G; T% d: B4 Y8 B, y! S, L1 j/ s  _NOP();
6 T* O. Z; d) F& X* x' }}! }" \7 Q+ e' Z* Y
void delay()9 Y" j' R; j+ H( e1 U2 |
{$ o0 y) k6 Y* ~; O
unsigned  int i=0;
5 A. t9 X3 X& X5 I# f2 _ unsigned  int j=0;; z" w. r1 I6 Q/ V3 F# g
   for(i=0;i<=500;i++)" y8 C  e- l3 d5 ~% s  J, x' g% k
      for(j=0;j<=250;j++)
" o0 @, v# ~6 V' \9 f; t  O5 v/ a        ;
- f/ T, R+ R! V}; g( o1 I# E4 X2 v7 t; t
void read_busy()
9 x! h. M! z8 z8 s9 ~{7 x4 a" g! J' I. E" W- l$ V6 _
   char read_data=0;   
1 x  }. X) ~) {   char num=0;. Y+ A6 m2 k5 u. P0 \  }" a' l) C- `
   P2OUT|=BIT0 ; //CS=1;  
7 \! D: i! l1 Q& D   P2OUT|=BIT5;  //sck=1;
2 r' H  F3 i5 n+ m   _NOP();+ h( ?1 D/ A! _( Y' J% z8 ^5 e* i
   P2OUT&=~BIT0 ; //CS=0;
& z( S; w' n8 P; S/ v   write_byte(0x05);        // read the SR1  2 L* ^1 T7 G' q
   do{& o6 G! J, Q: s: w/ [3 ]
                  
2 Z' S4 T; T4 a) ?6 |            for(num=0;num<8;num++)( Q5 b1 F# K. K7 h+ `3 S
             {* h/ d  B6 I: i
               P2OUT|=BIT5;        //sck=1; 5 [  f( ?% r4 c6 q5 F7 S
                _NOP();               
; a! ~7 d9 f4 p6 K! l4 `6 _& X                _NOP();' [1 M* @' H) a6 [6 R8 B  {
                _NOP();
8 @: R" ]) \! L                _NOP(); 4 z" D+ U% ^7 [+ U5 e' G" Y" g3 C
                P2OUT&=~BIT5;       //sck=0;              ) G9 N& N3 r. E# c$ i3 t2 D" F
                if(P4IN&0x02)3 g# i8 k! C: |
                 read_data|=0x01;
2 n; _$ o! L: m& Y0 z, O( I                else+ @% e, K# Y2 ?4 s; e
                 read_data&=0xfe;                : d; E8 }% _* I# o) F
                 read_data<<=1;
6 ~) r( S: i$ d) g% c7 p* y              } 1 p' B/ m# T3 \4 h9 {" e$ P, E
            _NOP();! K* U7 [- m1 w5 H% W9 p, r
            _NOP();+ o: B) E  b2 W6 l+ m5 k8 x
            _NOP();           8 Q* ~1 Q% o7 r& A) l3 ?
          busy_data=read_data;  / t) j) ]& l, A. Z2 E9 c
     }
$ W. l. I8 f& r& |) U   while((busy_data&0x03)!=0x02);6 X3 l$ W0 G* @2 d7 Y1 s
  P2OUT|=BIT0 ; //CS=1;4 w4 {/ e' Y. H" y
   
# S1 _% ~/ y% ]8 z  8 v9 m; E+ {6 r7 I& c1 I3 V9 \
}
/ f1 v% H& E5 U7 }* Z; u
; V/ K. `) |7 S; l0 ^: Q* N# {5 l用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!5 r+ p$ c8 ^& L# m; S7 A

+ u! S8 N6 O6 W3 j/ o, N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-8 21:14 , Processed in 0.062356 second(s), 33 queries , Gzip On.

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

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

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