找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>
0 F3 c8 z6 a. B5 d; F& k8 Fchar readdata=0;
4 ^4 Z' q. C9 G, rchar busy_data=0;
& M& k0 V+ J$ b7 e8 M& a8 n' q  L2 Bvoid write_byte(char data_byte);1 R# Z+ g# y' V- x) X! n
void send_command(char address1,char address2, char address3,char data);// command and address and data+ f; B' }! S5 S1 F9 N
char recive_data(char read_address1, char read_address2,char read_address3);
, v( ]/ t' V& W0 S6 h- r% pvoid delay();
% i0 r0 t2 `* A) Y9 e5 n) |void erase(char command,char erase_address1,char erase_address2,char erase_address3);
0 w6 }9 ?3 b' D; X" V5 yvoid read_busy(void);- k  N+ n2 j: O
int main( void )
: B1 D/ t3 |# N& _7 r- d/ H  k{( b& m# }/ E( f! ?5 {. u/ E) x% d
  // Stop watchdog timer to prevent time out reset
6 c9 x" @% t; y4 u6 E    ; C5 O+ j% m+ y2 p
    WDTCTL = WDTPW + WDTHOLD;
, C# v+ q" `" Z# H  {/ O, d$ J    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
1 I! A6 c9 o- y8 z5 R) |. F6 U% j    P4DIR|=BIT2+BIT3;   //flash  wp si output; {: x3 c7 F8 Z
   
! Y  @8 y$ i$ U; l0 x4 K    P4REN|=BIT1;            // so pull up) J( l, e4 w1 K/ p1 f
    P4OUT|=BIT1;             //flash so pullup  selected p4.15 v" m/ z3 Y/ _, F$ R. Q
    P4OUT|=BIT2;             //wp=1* [$ l/ B( ^3 ~9 l0 ^- l) d1 R+ e/ s
   ! C4 x/ s' |, ^& m" S9 ~, f' m
    P6DIR=BIT4;
: w9 P+ X* S: B5 L/ o+ k1 l& V- i    P6OUT=BIT4;            //led  ~1 M5 s) C5 h& _
    P2OUT|=BIT0 ; //CS=1;  
7 s: O6 v' F( w. F. ^    P2OUT|=BIT5;  //sck=1;6 r4 t+ F' K8 Y2 @: N# B' x% o, N
    //P2OUT|=BIT4;  // hold =1
" I5 i1 n* |/ t( {    _NOP();
3 A6 n( H6 u# g$ g4 t2 w    _NOP();( k  d; q; L  ^" n+ ^3 c' {
    P6OUT^=BIT4;1 \% Z2 ~; B0 Y3 i# k1 \
    erase(0x20,0x00,0x00,0x00);      
+ }8 `8 ~; v7 ^8 P# C+ e    read_busy();   ' z5 b# i% m# S% I$ Y$ @5 S1 K- h
    send_command(0x00,0x01,0x01,0x00); //xie,mingling         0 J4 r* j% `3 D3 B" k( b2 y0 J
    read_busy();  
# [$ H' J; B: ~  ^! J$ {. |3 o     readdata=recive_data(0x00,0x01,0x01);   % o" _7 ]8 J: Q1 l, z# H
    while(1)% K& h" |- A6 t- u+ @+ W( m4 [
    {
1 a" L( l+ ~. c9 G     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling* [( s8 S" ?8 X: p$ {: ~
           # M, S: u' s- [1 J% ?
      // if(readdata==0x00)' L9 ^9 w6 e# d) }8 H
       P6OUT^=BIT4;
  \8 b5 T3 L/ r' f       delay();. ^% t9 o7 Y) i: X2 c# H
    //  readdata=recive_data(0x00,0x01,0x01);  
# G( d; D# Z; a4 W9 q# d    }
/ _  I4 @$ a4 X8 j2 S  1 W/ M9 e! _; W" u
}1 U4 M& V- ]5 e! O) U* I" `( t7 x/ S
void write_byte(char data_byte)3 c2 s6 F+ f2 c% D+ d! n  V
{
4 ]. p! k& Z0 R/ V3 P( k; A4 x char num=0;  . G  W% B6 [4 @- {% l
for(num=0;num<=7;num++)9 [5 N0 i3 I7 G
   {/ u6 j9 C7 K( ~' F4 F
  
* D; Q# m. U" |+ p     if(data_byte&0x80)
( C, O8 i) w1 ~& G3 J       P4OUT|=BIT3 ;                //si=1;, c. J) X. Y0 M
     else
5 N! Q( k0 U. I+ v/ B+ \! K9 {- e2 B       P4OUT&=~BIT3;              //si=0;  
7 P5 _1 U) J& ]1 q) z       P2OUT&=~BIT5;             //sck=0;# o' t1 U9 g1 M, h# x
       _NOP();  
% a* i$ Q0 _& ^; V- U4 K2 k" ?       _NOP();
) i* u! g, v' Z% @1 k* C- u       _NOP();% `7 W% h" _4 y3 _1 A
       _NOP();; L9 v2 H/ Z1 S4 {$ j
        data_byte=data_byte<<1; //数据从高位传输  
0 \) B2 p% q' z: I0 G% X- Z5 [9 w       P2OUT|=BIT5;        //sck=1;   
/ J% T$ N  M; x1 P: z0 ]' g        0 S+ @. v4 @9 k0 o% s  k
       # g- S. o3 w/ _# h, w+ v
   }
% |4 F* k/ |6 v& y, @}
3 [( T- E* @8 D- d5 Avoid send_command(char address1, char address2 ,char address3 ,char data)
. z* T- @1 Z. `  M: ]4 W: j{) N! o* c4 m& W
  P2OUT|=BIT0 ; //CS=1;  ! f3 o1 I% j/ ~6 \0 S( K
  P2OUT|=BIT5;  //sck=1;3 b/ N; [# e7 f( O7 ^8 E
  _NOP();2 v8 z4 c- y# y1 F& T" L8 h
  P2OUT&=~BIT0 ; //CS=0;1 G/ m( T9 n  J. ~9 A3 ^3 x
  write_byte(0x06);   // write command$ F! I- Z+ M+ \5 H& \8 ^) F
  write_byte(address1);
8 ], k- Z0 I0 p3 I; x2 U; G  write_byte(address2);# p1 H0 x/ Z4 d+ U
  write_byte(address3);! m% s1 n% L0 b8 G7 Q) f
  write_byte(data);: |% V+ J+ m2 A' y$ u
  P2OUT|=BIT0 ; //CS=1;
) H! a( I8 E% ]# _. w  _NOP();9 }0 n9 {' h3 q# q) q2 o
  _NOP();' j0 i2 d5 A0 a2 H$ m+ g& A$ ]" U
  _NOP();
7 h4 B7 Y) ?# `$ j/ @1 I  M) S}
/ u" {8 ~8 ?' c, `+ G( m& S' @+ {! v' b  {
char recive_data(char read_address1,char read_address2, char read_address3)
$ Q8 U1 ~! t9 b, P/ Z* t. u{
3 Q. [4 o0 e* K   char read_data=0;   
7 D- ~, |% M" Y/ f   char num=0;+ {6 _5 w% b. z/ |6 V# o! `$ ~8 c
  
; g" i  S; l5 L$ I: {) g) T" u7 H  P2OUT|=BIT0 ; //CS=1;  . A9 z" E1 u6 e( c0 t: E! G/ B* W
  P2OUT|=BIT5;  //sck=1;
) c! T. T3 L/ {; F! l  _NOP();3 L% J3 `7 S: g' h
  P2OUT&=~BIT0 ; //CS=0;
& _" e; g8 g! F- Q3 f) H  write_byte(0x03);
- S" v( ?$ w0 s8 f; h! ?, M  write_byte(read_address1);  8 w+ F" Y4 @+ `) {
  write_byte(read_address2);
  ]. y) b7 N, z# z- t& T  write_byte(read_address3); 0 A& P" A( R' X* O
  
7 y" H$ ^9 F' W, ?  y6 t! }+ N" L9 G  for(num=0;num<8;num++)$ ?+ W2 D8 y, ~6 N' D8 d: D
   {
/ }+ O. y4 y6 p8 f- n     P2OUT|=BIT5;        //sck=1;
' I6 n8 M% j2 B+ R8 o2 D      read_data<<=1;/ k% W! Z6 M  g' \7 `9 e8 K& B3 c# Q
      _NOP();" z: Q  m. \) J, Z. S# C
      _NOP();
8 G2 U6 i7 C+ }5 R3 o; g% o      _NOP();" o  V# J, n9 C# _; U* v7 U
      _NOP();
( y  a& {/ C, o      P2OUT&=~BIT5;       //sck=0;
# X( [. J( P  K+ h' x: y/ I    if(P4IN&0x02)
) T6 h" t0 M1 J# ]: c; a       read_data|=0x01;
# [* T8 ~3 |4 O6 v+ m( z7 X0 B    else$ D4 @, p- d7 P# Y6 g; \
       read_data&=0xfe;     & U+ a! i% d* u4 I) e
      _NOP();
: n" h) v. G7 N5 Q; }8 R      _NOP();* u6 U9 u* B: F" X$ E
     }
0 }/ c2 g5 O' p2 F% ~" r3 g9 ?( j' u) P   P2OUT|=BIT0 ; //CS=1;
/ h5 l9 M1 [7 I' G  a2 N+ P    _NOP();- d! z- P: D' G( g' O% [; p0 F
    _NOP();  p8 A/ z6 l" t$ Q# O  x* P7 z% q
    _NOP();  v) F) i1 m& q* u5 p4 @5 m; w
   return read_data;
* m# m& P! I7 v7 p- h  
8 d& `# t0 D9 G2 P1 ]. j    ( R/ `7 {' a( r" j8 Z5 S
}$ w- e( D; X6 X1 F& X3 \8 e
void erase(char command,char erase_address1,char erase_address2,char erase_address3)- x* M5 w5 g0 R$ b, |. ]
{; p; y, n/ ]% B+ {# b2 J
  P2OUT|=BIT0 ; //CS=1;  9 m+ w) S5 J! Z' }1 D7 t
  P2OUT|=BIT5;  //sck=1;% Q$ D; c9 c3 y* f2 {$ X
  _NOP();$ X; k; h! p" a* O( N9 `
  P2OUT&=~BIT0 ; //CS=0;
2 Y" ?/ |( b7 i; Q' ~3 a* e  write_byte(0x06);2 a6 e, c( Z+ q5 ]8 R1 l; {
  write_byte(command); + o9 C7 l  ]0 [0 z; s
  write_byte(erase_address1);' k. X9 e( ~5 \. `/ A/ Q
  write_byte(erase_address2);
0 v) K( c- o3 G& x8 Y6 v# U8 X  write_byte(erase_address3);
; Y* V2 p4 r) u& I$ r! S7 A( y- E  P2OUT|=BIT0 ; //CS=1;
; A& F# S* w  j, K! n9 v1 C  _NOP();5 I" L4 v: W& U7 D
  _NOP();
( Q4 v8 ~+ ^9 g- U# S  _NOP();& b4 d8 R. W$ D2 L' j5 c
}
5 W- n& i8 s/ O! i6 b: C! Vvoid delay()7 d) X0 w5 [" N' S
{
, G- J! R  O" y% H5 a/ Q  j unsigned  int i=0;4 k( Z' t" Y+ y; Y& n/ V& b5 U
unsigned  int j=0;5 s# d% `) i% }! I% f9 H5 R, v
   for(i=0;i<=500;i++)" k" q/ D# J2 D$ X6 A! G% f$ y
      for(j=0;j<=250;j++)- y0 C  d) f$ p! p; A
        ;
* y# ?, P, Z# Q7 F}
# j) g! ~( v. u+ A8 q3 B3 Nvoid read_busy()
- _% k7 R, o2 N+ k3 g6 Q{
# k3 b8 [; c! ]) @   char read_data=0;   
& T! D1 s5 g# Y$ Q' ^   char num=0;
- c% }, X9 b. h) l   P2OUT|=BIT0 ; //CS=1;  
( h- }. }7 s! I' h! l0 [5 K" S   P2OUT|=BIT5;  //sck=1;( T  N  ^! ~  c9 ?2 R, T3 u  ~5 \
   _NOP();
- U& k$ p! t3 p" h+ R4 p8 x; i8 j3 k   P2OUT&=~BIT0 ; //CS=0;( T5 L6 A( E% U) m, u  w% |' V7 E
   write_byte(0x05);        // read the SR1  
' u8 Q( c+ I2 F   do{2 X( M/ i% u6 w! Z
                   # e+ P0 ~/ u$ L/ o
            for(num=0;num<8;num++)
/ _8 l  o( Q0 B7 E: _             {
5 e4 u" [: Q) c. ^               P2OUT|=BIT5;        //sck=1; * X7 X7 R; c6 ?( e2 C" ]  o3 h
                _NOP();                4 ?  M/ \0 Z2 L- {$ L- J* I- ~" d7 h
                _NOP();
- E$ H$ f7 i) c. j                _NOP();1 q4 p1 n5 ]2 [/ k, t
                _NOP();
* \. i9 f) c- {" C9 i                P2OUT&=~BIT5;       //sck=0;              + k! Z( s7 B2 W" ~7 Q
                if(P4IN&0x02). q$ C7 v* D& w( k& P$ ~) a
                 read_data|=0x01;
2 i6 }/ `3 N1 s& k9 i2 A                else
8 b, A4 k) z* N2 U                 read_data&=0xfe;               
& W$ b3 T/ u( L9 s) q                 read_data<<=1;
9 P+ d' n8 M* `- V              }
; t7 M! J9 `# Y            _NOP();+ k# r: D+ T/ a8 ?* L
            _NOP();
7 \3 S/ G$ ]! v$ ?* r9 p            _NOP();           
7 b" A. n/ d) e' q3 u/ d+ H7 u( k          busy_data=read_data;  
. I  Y/ q; b) U5 W. K4 n3 j; v     }. O: ~; ]0 a4 E  r1 u
   while((busy_data&0x03)!=0x02);
7 x+ P, \" H3 z: S% V0 o  P2OUT|=BIT0 ; //CS=1;+ b  L( y: d8 D4 l) i. J0 e
    2 H: M; e7 f) j9 `8 b/ _8 V/ g: _* d
  
7 f+ p% s' [3 p( J  `}
" J1 ]' `% L7 b% m9 g
% {# F# l9 q: g! H7 K用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!: h( |! B* m" Z+ _5 U6 J; A2 P: \
5 v' }/ m! |" l3 q# l- \- s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-27 13:57 , Processed in 0.059217 second(s), 33 queries , Gzip On.

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

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

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