找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>2 ]5 o7 t( s' a! i" v
char readdata=0;. R; G+ H1 ^& y. T# S
char busy_data=0;7 f2 C. O3 Z# \5 T" V9 l
void write_byte(char data_byte);7 c6 c- ~2 S4 \. h
void send_command(char address1,char address2, char address3,char data);// command and address and data
$ R% U6 e6 c; \/ c; G" wchar recive_data(char read_address1, char read_address2,char read_address3);, Y) a" [4 S- d$ C
void delay();' A& Y' ?; B& A1 C9 {" O5 P
void erase(char command,char erase_address1,char erase_address2,char erase_address3);9 u! B; G4 O( C3 c0 G2 I3 W
void read_busy(void);
- F5 J% ?0 c# Q6 }1 w6 Hint main( void )( Z6 o( X3 b4 t
{! h9 y$ I3 |$ o3 D6 g5 Y
  // Stop watchdog timer to prevent time out reset% b2 C8 t4 L5 ^
    # X8 k, I$ `  W! Q0 t
    WDTCTL = WDTPW + WDTHOLD; 0 K% h) i  J( b( M, D+ `1 r( e! V
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out& `3 h0 d5 Z. ^  J1 M% ~
    P4DIR|=BIT2+BIT3;   //flash  wp si output
1 j7 q+ J( n/ q% `5 e  i& M   
/ w" {; Y; B9 J$ J" D0 }% V    P4REN|=BIT1;            // so pull up  x& Q; Z) o; a$ ]- n
    P4OUT|=BIT1;             //flash so pullup  selected p4.1
0 [0 g7 u, ^+ t/ V+ d    P4OUT|=BIT2;             //wp=15 X! \# V  d! I
   9 @* s7 J4 l6 }8 d
    P6DIR=BIT4;; D$ A* P7 o/ W0 C
    P6OUT=BIT4;            //led
, D# L0 o8 f3 F    P2OUT|=BIT0 ; //CS=1;  * K) c5 X! a% F( z. ?* Y
    P2OUT|=BIT5;  //sck=1;% l, i$ N! G+ ?/ k+ ]# b( }0 U! s
    //P2OUT|=BIT4;  // hold =12 G* {+ E. ~+ ]0 u3 G4 }6 B, n4 `+ y0 T
    _NOP();0 a4 r/ A. J' \0 Q# l8 w
    _NOP();
4 _( n* }! ^4 B; G3 i; K    P6OUT^=BIT4;1 ^7 h* A+ M7 j. l+ K6 V: G
    erase(0x20,0x00,0x00,0x00);      * U2 @* \, s! x' i% h7 u1 x9 G
    read_busy();   
  e& j/ L* m% p6 O/ G    send_command(0x00,0x01,0x01,0x00); //xie,mingling         0 X: |4 Q% e& Q' e& F
    read_busy();    [5 ^7 i8 d  Y3 M  u3 G* Z$ U
     readdata=recive_data(0x00,0x01,0x01);   6 Y) x. u0 O- V( q
    while(1), X0 M. L1 U2 S1 f6 U* s( {7 Y
    {
1 X+ |7 Q" E! ]# R# Z     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
- x# C1 g1 U6 x3 z/ e           6 T. ?8 a$ B$ |6 j2 [& }4 q
      // if(readdata==0x00)' x) Y9 Y3 n6 l0 H6 G
       P6OUT^=BIT4;; z4 L& h6 Y* \+ Q7 E
       delay();+ F( ]/ P5 l* Q2 n8 S- D  g
    //  readdata=recive_data(0x00,0x01,0x01);  
" _  v9 u( O) E/ S; O  N    }  e' R9 D  X1 N1 j
  
0 u" @: R. K/ m5 A}- L3 ]% h% g0 o
void write_byte(char data_byte)
' [0 l5 m3 H" f6 N# J5 y% G$ Z{8 w+ `! q% A* q' N
char num=0;  $ W' y9 M) k* t8 L9 q
for(num=0;num<=7;num++)
6 L" W  z2 T" o+ }# ?   {2 A5 k/ H: R( I% e( I$ r
  7 z  i' R6 X8 W; F& K
     if(data_byte&0x80)
: ^2 j/ w  F9 \& [5 e8 A, m       P4OUT|=BIT3 ;                //si=1;
( n8 O$ D& p& p     else0 ^6 t6 J( C7 M0 x% v
       P4OUT&=~BIT3;              //si=0;  ) D- C, @6 K: Y- d7 M' A# u! _8 i& {
       P2OUT&=~BIT5;             //sck=0;2 B' x: M, |2 g5 R6 L/ K$ \
       _NOP();  
8 Z& d! F" l$ ~       _NOP();8 @7 g0 Q/ f* Z; f  G( t) [8 u4 F
       _NOP();
/ {8 V9 L, K* H* u       _NOP();4 Y0 h% b2 H6 Q8 [4 U
        data_byte=data_byte<<1; //数据从高位传输  
% f. h2 J" t+ `6 A/ ]       P2OUT|=BIT5;        //sck=1;   , H. [3 r! a; l% R' P0 [5 T9 \" K
        ! ]% Y% u5 W7 T# }7 k
      
3 x; c+ x1 L6 Z   }
$ T" M1 [& d; \# ^' S3 b}* w* r, q. p# s+ p$ X
void send_command(char address1, char address2 ,char address3 ,char data)+ Z  ^7 r  a' i) _: q2 t8 u
{
) `8 U3 A, Y, T; w/ F: ]) O  P2OUT|=BIT0 ; //CS=1;  
, V9 K/ s% {* U/ O* i" ?* u0 z& [  P2OUT|=BIT5;  //sck=1;
. `% c8 L. w# G; T5 U, l5 y  _NOP();- e& e1 b2 G7 h( ~( J: W
  P2OUT&=~BIT0 ; //CS=0;4 u" S/ H' o9 R  z* ]0 z) l; {7 J
  write_byte(0x06);   // write command& H, p( L! q- f. p5 W
  write_byte(address1);* b7 g5 m* R, f8 k+ {8 I8 s2 |, I
  write_byte(address2);
. B2 J4 T+ s9 L: Z  write_byte(address3);
7 j1 K- u9 Z- P! v3 a  write_byte(data);  {' p9 N5 z; E6 G6 l; ?
  P2OUT|=BIT0 ; //CS=1;$ U7 x3 F& b6 y! E0 |2 h& J; o8 {
  _NOP();: s: Z9 y- l+ z9 u8 a3 y
  _NOP();. V: p# a1 }0 d& T6 |) E
  _NOP();$ f0 J0 Q1 l' p, e
}
# }" w- A1 o) N: C
/ R6 N8 }, v' h, L8 I2 schar recive_data(char read_address1,char read_address2, char read_address3)
: x' ]& n4 y% q8 q{
+ B' F8 N$ B7 D  W/ K0 l( l   char read_data=0;   
, ?/ @* B5 A( ?; Y7 b   char num=0;
1 L  ^2 ]+ R2 C5 S  
2 y! Z, K& C0 _$ y9 s- }. d  P2OUT|=BIT0 ; //CS=1;  6 ?. @, j* |" @4 m9 M5 n
  P2OUT|=BIT5;  //sck=1;
) ^( N- I9 e6 |. f/ l: k  _NOP();! E( ?* Y* G8 C) M
  P2OUT&=~BIT0 ; //CS=0; + t$ u3 V" V8 B3 K
  write_byte(0x03);8 H- [5 i# a9 l) h% j
  write_byte(read_address1);  - X) ?: m! S, Q2 j
  write_byte(read_address2); : `8 V1 J) N: B) V
  write_byte(read_address3); % `* J* S8 O/ X8 Y3 I5 y* E7 ]7 Q
  
% w/ A1 I% q! L  y  for(num=0;num<8;num++)
0 y. u' S5 s0 s: b) |( y) X# J6 K0 m   {
% K  W: I+ P, l5 I     P2OUT|=BIT5;        //sck=1; 9 L4 }/ N1 d$ [  Z' }( e2 }
      read_data<<=1;2 J7 D& G; F0 J5 g$ S$ ]
      _NOP();9 A" C$ X9 f  B4 ^  K$ ~4 c
      _NOP();
! u' V$ ^) q' ]& X      _NOP();
  W* K3 Q5 ?9 r; y0 N      _NOP();
7 y/ r7 h, }/ k" p+ ^      P2OUT&=~BIT5;       //sck=0;
6 \4 D: v& w  [& M    if(P4IN&0x02); c* c) w7 @' K! ?; \
       read_data|=0x01;% K3 c0 C% T+ H) |* ^- D
    else. E' x" D5 K1 `5 Y6 x
       read_data&=0xfe;     
; }8 R  J- V  [+ n      _NOP();- [0 w0 V0 J2 Z  ~7 L  B
      _NOP();9 e6 X' m, H0 m( n
     } 3 }. \5 r  {  k0 e% G) E
   P2OUT|=BIT0 ; //CS=1;
7 Q9 c% w+ C1 G  W    _NOP();; E4 W+ g, n0 W: R+ [
    _NOP();
! q! h7 }* V; J) v8 x5 g    _NOP();
6 j0 w4 i7 ^* x+ ]) T) b) e   return read_data;
( k7 {0 U4 A* h+ Y8 S+ I  / r- I* W3 z' ]+ {% Y
      k; K" M3 Z4 h  I
}$ ^+ Z! Y- [8 I2 f: u$ B
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
. B8 X( T$ w" B3 }0 Z' q4 {{5 S  s0 R4 c$ U7 ?+ W& e
  P2OUT|=BIT0 ; //CS=1;  
$ B8 B4 K( G  N0 h; x" U0 O1 j5 D  P2OUT|=BIT5;  //sck=1;# p" ?% S6 R+ M9 k2 P
  _NOP();
( |" S# o' Q, O( Y$ X8 }3 M  P2OUT&=~BIT0 ; //CS=0;
' \0 O3 ]: {) F# h0 D2 R  o- X  write_byte(0x06);
4 Z5 J' Z: X2 O& }& s  write_byte(command); $ a4 W4 P5 E$ v0 |7 s' ~$ w
  write_byte(erase_address1);6 N3 B9 v0 a- ^" k2 T. S
  write_byte(erase_address2);5 h% x3 _6 |8 Q% n$ j
  write_byte(erase_address3);
8 Z$ b& k. D$ [. H  P2OUT|=BIT0 ; //CS=1;
( m0 A' L  A0 {+ v# M6 c  _NOP();5 G4 W2 D$ K6 p7 T
  _NOP();
* q$ E/ O" b6 A' g  _NOP();
" u' d' m, R  K( c4 h. {6 O- C}
. o7 Y7 J. B4 svoid delay()
+ B" c% O* j1 a' C1 X3 \{5 D- o1 z* z8 _/ i1 M" x
unsigned  int i=0;9 J% [6 R: A. A) |2 a* K
unsigned  int j=0;
/ R$ J9 e1 [3 {8 @# J7 j! Y- m   for(i=0;i<=500;i++)( V# T0 S! g8 o# A9 s
      for(j=0;j<=250;j++)
* q6 M/ [! L' U3 J) Y        ;
$ K3 c) G1 p' u0 {/ |, {3 G}$ a8 q: _% v3 d8 k; k# ?5 s1 I
void read_busy()
( g, D. k  o- V- L8 ]$ x{- w" d( t. S, B
   char read_data=0;   
- {1 T; o2 a. q+ N   char num=0;* e) C. Y  s) {# O6 ]  g
   P2OUT|=BIT0 ; //CS=1;  
: R0 n1 [# @, W( H/ O2 U   P2OUT|=BIT5;  //sck=1;; `' S7 m; `4 X: c3 X1 c
   _NOP();! W3 g6 J' j4 |' b2 _. {, M1 F
   P2OUT&=~BIT0 ; //CS=0;: p; l# w% a0 Z
   write_byte(0x05);        // read the SR1  8 F6 N  U/ n( b0 r' N
   do{
' M7 z$ q8 n% u4 N                  
( C" G5 p# I, {' r; |" }* s; X6 ^            for(num=0;num<8;num++)
5 {( u8 f+ ]- S5 o, [6 A: \0 q             {# e  u2 s. J* ~% p) O7 U% t
               P2OUT|=BIT5;        //sck=1; 9 s& G) f: d0 F; g
                _NOP();                ! G) F1 l) @0 l' G- r
                _NOP();+ s  y2 ~' s- P
                _NOP();
9 W) e) l* w5 p: x9 T                _NOP(); - h+ b6 {9 G0 W) U$ k
                P2OUT&=~BIT5;       //sck=0;              
! f8 |2 B& d# J, K# @                if(P4IN&0x02)
" e' }* X- E7 v                 read_data|=0x01;- E) w' T8 P" s/ z- y, b1 G
                else3 e% Y* t3 R, }& _  K
                 read_data&=0xfe;                % F9 Q; [, o" T- r
                 read_data<<=1;. W& j: ^$ {  u! N
              } ! R. ~) o, ]/ b! _1 v+ O- m
            _NOP();
" u1 h  X3 I" K2 Y# ]: v            _NOP();
3 u9 Q  {4 u1 E& n            _NOP();           
' C7 g. X" N, ^9 L7 E+ P          busy_data=read_data;  : ?+ |; w4 Z$ W1 Z0 ~3 Y
     }- I0 |. {! _! o! k- O" X/ y4 z, @" ]
   while((busy_data&0x03)!=0x02);
& e6 U. r0 h) M8 \8 @  P2OUT|=BIT0 ; //CS=1;/ ~9 N$ K1 k& Y# M8 `
    ) Z+ v* J. c2 K. J/ p
  
' V4 `3 R3 i6 u' ~' |}
; E. E! V6 E+ a- u
, t- F$ ?8 L6 t9 D! m: g用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!8 {0 W7 r* R/ b7 n
& M% ^3 {) ?+ |+ X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-20 06:01 , Processed in 0.057507 second(s), 33 queries , Gzip On.

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

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

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