找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>$ Z* Q1 n+ ]/ R( E, [
char readdata=0;
" k. @: J  W8 q8 J* mchar busy_data=0;1 v! w/ @+ I8 E0 A' K
void write_byte(char data_byte);
- [* V7 r; \* T* ^+ b3 [0 Svoid send_command(char address1,char address2, char address3,char data);// command and address and data
3 C0 y# X9 m! J! j- d" @( [char recive_data(char read_address1, char read_address2,char read_address3);# m# {) i. W& w" d
void delay();
+ `/ p( q5 I$ D6 B; M$ i* ?void erase(char command,char erase_address1,char erase_address2,char erase_address3);! W5 ], D& O# F" m6 x) f* ^' D% L4 Y
void read_busy(void);
2 z! L! E/ D* k3 O+ i8 ?# cint main( void )( ]* m6 B1 l9 J$ r- M. K- g" \
{' g5 F$ m2 C" @; i4 g) A
  // Stop watchdog timer to prevent time out reset9 c0 I8 T: I# B) @# I& l# g
   
+ o, M0 ^# m+ \! \* b1 b) r    WDTCTL = WDTPW + WDTHOLD; % H8 q+ Q# L5 z
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out- d( N' T- Z, `; L$ y( t' k# p
    P4DIR|=BIT2+BIT3;   //flash  wp si output8 J6 k% u$ k, H, ^) |( y. p& f
   ) C" o2 B/ u5 s. \- a( D
    P4REN|=BIT1;            // so pull up
% _% j" P7 [/ V* t5 j+ L    P4OUT|=BIT1;             //flash so pullup  selected p4.1% e/ L% r8 S1 K' o4 _
    P4OUT|=BIT2;             //wp=1
7 K  l9 E8 N, W- j9 H9 L' v& K   
: u9 M* y) b! _" @. I+ c    P6DIR=BIT4;3 q5 a" ~3 c/ U9 I
    P6OUT=BIT4;            //led
1 u, w. a) r' g' p8 g2 L7 o  c6 j    P2OUT|=BIT0 ; //CS=1;  
/ ]: Z0 y* _  L' x& l7 |; H    P2OUT|=BIT5;  //sck=1;
# t2 E$ p( P, V    //P2OUT|=BIT4;  // hold =19 `! R  m5 d4 P; d  M( B8 Y  y9 n
    _NOP();
, ]. f3 j1 b1 |    _NOP();# m  d4 f1 V  l" n8 b+ S
    P6OUT^=BIT4;
" f% Y4 ^- C" i4 M$ c    erase(0x20,0x00,0x00,0x00);      
+ M" p* Z4 v# I- a6 n    read_busy();   / _( D; X7 L* i4 |$ k  W
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
! T0 f; j1 g6 _    read_busy();  % a) ^3 M! q8 M
     readdata=recive_data(0x00,0x01,0x01);   
: C- d: f1 d, ]+ @    while(1)
- J: l& e5 R5 c3 ~# p    {
, M" Q; L( o5 e& g     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
  u% h6 g% Q' V7 {( w% w$ s           
9 g' g% `/ r5 l      // if(readdata==0x00)
7 K+ H* v# Z, k       P6OUT^=BIT4;; ^/ o/ D9 b* N
       delay();
7 m) F7 F* D2 e! o    //  readdata=recive_data(0x00,0x01,0x01);  4 a, E  M# h  C
    }
& h* s5 |+ T6 D1 [' |- @" Z+ |  % r! j* j3 p1 T" \1 y
}+ w7 I' t, u. C- [
void write_byte(char data_byte)( f! }; u8 \5 z* Z
{& f& F* d: L3 U$ w6 b& S* |. u
char num=0;  2 v* P% q6 L& d: O5 g, g5 W4 S
for(num=0;num<=7;num++)& o* R; V" z3 u4 q8 _
   {- U: T2 b% u- W- _1 l/ |+ X2 b  w
  
: N: b  W1 N& |; I  |( \# I# k     if(data_byte&0x80)9 n2 Y& b4 g/ U) p& b
       P4OUT|=BIT3 ;                //si=1;' ^' O4 U! E) U  S3 ]
     else3 j" R9 k) q7 C
       P4OUT&=~BIT3;              //si=0;  
* m6 W: T9 |) V  v  i" g       P2OUT&=~BIT5;             //sck=0;
' Z* H9 I0 J4 v* Y/ f/ q       _NOP();  6 p$ }& m5 [! Y6 [5 V+ Y1 U
       _NOP();
" f; x! Q& O1 E: `0 w# L       _NOP();
' W% H- |2 K" {# i       _NOP();1 ], Q& R* X7 B
        data_byte=data_byte<<1; //数据从高位传输  
# s7 C  f; U5 Y5 w  i/ h: Q3 Z3 {  i       P2OUT|=BIT5;        //sck=1;   0 Z; O& f5 _6 p1 R1 t
        6 I; y6 ^; M% p" C  ^8 D  h
      
  X$ O( m+ H' H( F% o( u   } 1 K+ N8 g) l- ]! v
}9 ~) a0 V) I5 q
void send_command(char address1, char address2 ,char address3 ,char data)
) d, r6 l7 V' W- y* k2 T& }{6 [* Y+ {7 T( h$ r* E. g
  P2OUT|=BIT0 ; //CS=1;  
" a# f8 u6 |% I9 t& X  P2OUT|=BIT5;  //sck=1;$ k8 k# t+ a' U3 ?) k' {9 f- \1 V
  _NOP();, x! E7 p, c* C( c2 r8 g0 w
  P2OUT&=~BIT0 ; //CS=0;, V6 {3 O! [* @: k" A. l6 [7 U; ]
  write_byte(0x06);   // write command
" ]+ N% J. l. j+ i" q' o  write_byte(address1);: U4 v0 J- O5 z% N
  write_byte(address2);
$ |* z9 M+ _; U5 h; E# F+ w  write_byte(address3);
0 ^2 w5 \5 |( t  write_byte(data);0 ~4 y2 y; t- R+ Q# a# W
  P2OUT|=BIT0 ; //CS=1;
$ j9 O; V- O- ~  v: g  _NOP();
- ~3 t4 p# J1 Y2 B8 l% S: c$ p; C  _NOP();0 G& V7 k" X3 x+ e/ u
  _NOP();( \7 t' I' I/ h
}, _9 n0 ], I( u
4 B; i! Z5 l+ o
char recive_data(char read_address1,char read_address2, char read_address3)
+ b* K7 _9 [2 H8 T" v, J{
1 o: [- b; l7 {   char read_data=0;   
' j+ s6 ?6 f1 e( P  w6 g   char num=0;5 h( j$ G; x" Y) g' z. {( a
  2 C( H0 }6 s! @" K7 y
  P2OUT|=BIT0 ; //CS=1;  8 f" b) l, F- q$ ]* b/ p
  P2OUT|=BIT5;  //sck=1;) ?2 n( `: t8 m( D5 b
  _NOP();
, \+ I+ j) ^8 ]  V  P2OUT&=~BIT0 ; //CS=0;
4 C" h6 y+ A  P/ o; P/ j  write_byte(0x03);
& r4 [9 j" F$ x5 |3 Z  write_byte(read_address1);  
3 Y7 V* x- |* [; E8 q  v  write_byte(read_address2);
  E4 a- U( G  O2 P  write_byte(read_address3);
$ l, Q# y+ Q! S) F9 R/ \! C) U4 \  
+ \9 U  u3 |+ @$ c. K9 u  for(num=0;num<8;num++)1 z  h& ]$ m6 r1 z0 o
   {1 F$ P, a2 W$ N" L8 P
     P2OUT|=BIT5;        //sck=1; 1 J# p+ h& }2 t  j5 d7 @
      read_data<<=1;6 O  I% u, _9 Z
      _NOP();
" G* s& I- |/ F# c6 a6 V" m      _NOP();
# E9 _0 Y6 T" x( L6 N  Y      _NOP();( s6 r% {/ h2 G
      _NOP();
# q; C+ {9 }! T      P2OUT&=~BIT5;       //sck=0;
3 U/ |' D" l( d( t# I    if(P4IN&0x02)
+ @: f; A1 p' {3 I) K0 R       read_data|=0x01;
% K* ]4 f/ e+ J6 \" f3 z# V    else  S% ]" h% j5 w- E* _3 Z5 F7 s
       read_data&=0xfe;     5 ?& R# I6 q- X8 y6 x. L; ^1 G# X7 [
      _NOP();
# ^0 U* Z9 x- ?9 ~  s      _NOP();9 }: v3 `0 H: W
     } 2 o) j' e. G, ]0 M
   P2OUT|=BIT0 ; //CS=1;' K5 y1 V& X6 }
    _NOP();; r) j! k. P( \1 E9 h. z
    _NOP();) a) A9 a/ f+ z8 u! l4 z" T
    _NOP();
( L  P/ b# z& i* q  |  D7 K  B* W- `   return read_data;
( K, j4 U3 q# K# K" {6 o  1 N3 W& c2 r3 X
    / t9 k# F9 [: X2 p' c' c" E. z
}
6 c' ~  A2 M# I$ y: b' K+ Mvoid erase(char command,char erase_address1,char erase_address2,char erase_address3)2 D) v/ F0 {* M0 S$ j$ O* o3 O
{" q& z8 m) L! K3 {9 {& J- L) X2 C0 m
  P2OUT|=BIT0 ; //CS=1;  
& }, Z. q* S% v% ]1 }- n  P2OUT|=BIT5;  //sck=1;9 y) x8 x8 ?) C
  _NOP();5 {# r% l, b6 e4 @
  P2OUT&=~BIT0 ; //CS=0;' |0 [, I% {: ?; C! F( ^% y
  write_byte(0x06);
3 y; Q3 g7 V, x  write_byte(command);
8 l. S& k9 K$ G; V0 ]  write_byte(erase_address1);1 e7 P, c% y1 h4 ?) D2 H1 f
  write_byte(erase_address2);" k2 O) ?! l  H/ l1 [
  write_byte(erase_address3);
9 }% M8 Y: H  @; t$ X0 E  P2OUT|=BIT0 ; //CS=1;$ l( m; \% r3 |7 A% a
  _NOP();9 Y- ^: m8 s. ]( f, ]
  _NOP();
. m  F; |& H" i8 D1 C- O  _NOP();; `$ y8 ?! L5 Z6 l: W  C1 r
}" b! F' y. ^* I- v( G
void delay()
/ g9 M" X- T) i# r$ M) g6 ~" @/ v{
/ G0 X7 B1 T) p* M, W9 r  ^( \ unsigned  int i=0;
/ B  E. V' p% v" Q+ Y2 @$ [1 p unsigned  int j=0;7 ?% E! I2 `$ G
   for(i=0;i<=500;i++)1 O" p, \. p- w3 e6 u, s2 ]! J
      for(j=0;j<=250;j++)
6 l7 w; l/ c$ D4 E7 g" L+ n1 Z( q        ;
# Y1 f9 h5 c' W5 H2 N}& m/ ?! F7 O) j' h& f
void read_busy()3 I# n! ]$ ]" c8 H
{
' Z1 J! l1 N9 M5 R# L   char read_data=0;   7 s$ C0 a% b' h' j
   char num=0;
* K8 ^: S8 Q, F0 c$ K   P2OUT|=BIT0 ; //CS=1;  
, {* L9 i- I* O% Z& G7 l; X# a   P2OUT|=BIT5;  //sck=1;; a& b% q) ~- A  k
   _NOP();
* A$ P* L* l6 e: O   P2OUT&=~BIT0 ; //CS=0;% f5 |' {! i: m2 d
   write_byte(0x05);        // read the SR1  
* |& q& P. {' i5 z# b+ z5 y; V   do{
( o6 D. v( l1 K4 g; J! g) A: e                  
. Z8 }5 q3 i' Y1 o/ }            for(num=0;num<8;num++)
4 l( s& S5 K+ ~5 n( l             {
# |% v1 K# E- x, m               P2OUT|=BIT5;        //sck=1;
$ h; I6 ]% A5 o" P) A                _NOP();               
7 z6 x5 B8 F, f  I+ j5 g; I! G, t7 w                _NOP();
. q1 B" q6 Q6 [                _NOP();
: O% n9 w5 G% \7 J$ \" S$ p$ Z6 q. G                _NOP();
7 V5 h5 Z5 e% g* P, N                P2OUT&=~BIT5;       //sck=0;              
$ ^$ c% n) q+ e4 p3 C                if(P4IN&0x02)
  L% s' i, c9 J$ |- v# K0 Z                 read_data|=0x01;
1 L! S7 [0 K5 F                else0 G7 x4 _8 |1 Y) I7 U
                 read_data&=0xfe;               
" i% `. b$ D& Z                 read_data<<=1;
3 J/ j) v4 W9 s4 N# f" L& d. ]              }
8 Y- I" P6 x- v! ~            _NOP();4 S6 Q4 I1 P+ y, {* v
            _NOP();$ a+ y* c4 ?9 W7 I
            _NOP();           8 T2 B# C$ V0 J0 h( V
          busy_data=read_data;  
& H1 Z. @* j) r2 j& s3 G- q     }( T6 {& R2 b* E" Y
   while((busy_data&0x03)!=0x02);
2 d- M' O, Q. N: K# L8 c  P2OUT|=BIT0 ; //CS=1;0 D7 K# I' |7 Q, i3 G( D
    ( _" L# O4 P) B$ e* C+ N2 z
  0 N1 F/ Q) y1 x7 {* s
}! z1 _/ w  w+ W: o- M! A" t* H" T
3 R, m' o0 _4 X/ b2 O
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!2 q- t3 \) l% n, W# i; O* e

) T* A( x; K; [% s! |" i* ]) E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-4-19 09:33 , Processed in 0.055795 second(s), 32 queries , Gzip On.

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

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

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