找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 71|回复: 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 M7 c* k* [+ {# \" f
char readdata=0;# C4 p8 D8 v' j6 `4 B
char busy_data=0;
; x) s* t, h& A3 Y5 y: ^) Yvoid write_byte(char data_byte);. Y/ Y0 ?+ {6 K) h# D% r$ U& c0 {) h
void send_command(char address1,char address2, char address3,char data);// command and address and data2 V1 T2 R/ \& t0 g; T0 w4 O
char recive_data(char read_address1, char read_address2,char read_address3);2 x. m1 M6 a3 V0 Z
void delay();! O1 F1 L0 k% Z, L4 H3 v
void erase(char command,char erase_address1,char erase_address2,char erase_address3);
) H, v8 c7 `6 _2 G% Avoid read_busy(void);
) S; W: G, W  X, Y  G' f) pint main( void )
0 t+ `* N7 \; k+ G{
+ N# @* r2 M7 M6 e/ p  // Stop watchdog timer to prevent time out reset
+ M3 [1 a, r, F3 t( _4 U    . T, _) h1 M( o( x( a
    WDTCTL = WDTPW + WDTHOLD; , `! c3 a& X- j; O. F; V
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out& N; a$ N5 T+ F! \2 J
    P4DIR|=BIT2+BIT3;   //flash  wp si output! Q, D( r- t+ Z( C5 p7 L) r  C
   
+ P# R0 S( w. z' z! l) q    P4REN|=BIT1;            // so pull up
2 }. i+ d- j0 p% {2 F    P4OUT|=BIT1;             //flash so pullup  selected p4.1
: h0 E  |- B/ a. g8 L    P4OUT|=BIT2;             //wp=1
% P) A- j. f2 w   
6 q) v. ^+ v* @1 W    P6DIR=BIT4;1 h1 R+ k3 v- T2 g4 q# m7 d
    P6OUT=BIT4;            //led
1 J, d( V& w: R, o7 d8 \% ~0 z    P2OUT|=BIT0 ; //CS=1;  
7 w  F- g9 O$ _# x4 T    P2OUT|=BIT5;  //sck=1;0 o( H/ p9 s2 Z0 M; D
    //P2OUT|=BIT4;  // hold =1
2 M0 B. |2 j. }% h8 u    _NOP();
  J) O7 o& Z" N5 o% P" r/ v0 H    _NOP();
& C0 ?4 {# E) `2 f) }    P6OUT^=BIT4;! F: U/ A! [7 \4 ]3 t/ M
    erase(0x20,0x00,0x00,0x00);      
2 z. d& j% ?+ a+ J# H    read_busy();   
& C2 L8 ]9 w8 B    send_command(0x00,0x01,0x01,0x00); //xie,mingling         : X# }- ~" d  G' F
    read_busy();  
& p# A) m7 j$ L$ B9 ]     readdata=recive_data(0x00,0x01,0x01);   
* \  K3 E$ b& j+ N    while(1)0 ?9 j' t, Z( \- ]
    {& k: B" F8 M) v- I
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
: J& d) c& E; k6 H2 X; g           
. q0 K! P3 a8 X0 ?      // if(readdata==0x00)
& f3 R9 M: I% ~- z/ Y* u       P6OUT^=BIT4;
1 t$ h( J5 W& `% J1 p" [/ ]       delay();/ y$ W+ o9 N2 u, i! `
    //  readdata=recive_data(0x00,0x01,0x01);  $ M6 A3 C6 B+ Q# A3 S8 V
    }2 u! n0 o5 J+ u7 I! W
  
0 f' W2 C' E; u}. [! t5 a( n- H* E9 G
void write_byte(char data_byte)7 R3 b1 ?/ y, N' G/ y
{
, Y5 H7 [5 W/ Y char num=0;  
( e3 i! Y' }% m for(num=0;num<=7;num++)
) {+ \# B; |% n" s   {9 u; [, H( x) {. }. Q
  + N2 Y3 n. v* T0 U) K( W* }
     if(data_byte&0x80)+ F* X  l1 |7 p5 B
       P4OUT|=BIT3 ;                //si=1;
, H& x/ n% H7 z) h3 K+ m     else
6 Y- z1 l. s3 ^; e. Y6 }# I+ Q6 C       P4OUT&=~BIT3;              //si=0;  
  `" d; \$ O# o2 N       P2OUT&=~BIT5;             //sck=0;
: U* J- j! M; W/ I* S% F! @       _NOP();  : _3 N& t/ a7 p6 a( }% h* \
       _NOP();8 n# D7 n+ [4 J% C  d8 y6 i
       _NOP();! Y0 E* x  V- ^9 |- A% c$ c  k
       _NOP();
1 f4 l& l, _3 g6 r        data_byte=data_byte<<1; //数据从高位传输  
3 u7 U" k9 }. k3 U& d; o       P2OUT|=BIT5;        //sck=1;   
9 y" g7 i# p, f        4 T$ i* ?) G$ p  ?
       & ~3 f* _' S: S3 f( c* J. z. E
   } 0 j2 P1 @9 q8 O/ `, e, ?8 C6 M
}+ g  Y& j% q9 R$ j
void send_command(char address1, char address2 ,char address3 ,char data)
: V. |: l4 P3 h$ t3 W( z$ Y{
/ x6 F4 X& D. p! ?4 D  A+ \  P2OUT|=BIT0 ; //CS=1;  & W) }. v, r$ _- {) w, T8 X
  P2OUT|=BIT5;  //sck=1;/ Q* I$ R# Q2 e0 n
  _NOP();
& B4 b9 ]$ F; ?8 c% y7 e* U  P2OUT&=~BIT0 ; //CS=0;
4 y5 C9 C) `, P) v  write_byte(0x06);   // write command
( t4 \2 |6 D$ p# I3 m' x  write_byte(address1);2 f) q, i0 o: q2 q# y
  write_byte(address2);
& s* ]. e; C+ C. Z" Y8 O5 j- g5 n) @  write_byte(address3);! O2 `4 T( N7 `. ?0 z) C8 M0 Z
  write_byte(data);
: \. D  j4 b: b2 K# l  P2OUT|=BIT0 ; //CS=1;
+ R* e( {0 \! ^* Z1 R3 i# ]( {: @  _NOP();" o9 x/ I$ d. [; C
  _NOP();' x# O1 n* g: d9 R5 U- W, e2 J; k
  _NOP();
* W! R# H& Y2 M/ W, ~, J& M$ Z$ c}+ B8 `4 W! t- u9 j/ f( l, Z
% ^' s2 h; N" m8 h' z
char recive_data(char read_address1,char read_address2, char read_address3)
4 E7 u* W. a  s2 y{& V' V1 Q- {* ]0 z! p
   char read_data=0;   * W  q' Y* ?! O
   char num=0;
# n- P1 ?3 F! B+ l  
8 `3 a  P3 }% P; Y+ g. ]0 G: i3 E  P2OUT|=BIT0 ; //CS=1;  
- n9 ^6 x4 b* y6 U: s  P2OUT|=BIT5;  //sck=1;
$ x1 ]$ U& E. T  _NOP();
- |" S: G: o& _5 ?3 j  P2OUT&=~BIT0 ; //CS=0; $ |+ M* w( F1 ^) R- {
  write_byte(0x03);+ S6 b: b8 O* X; d! _5 W
  write_byte(read_address1);  0 E3 C$ W- O, Y9 O4 ]
  write_byte(read_address2);
; B- k  d, ~$ `: ]- K" w  write_byte(read_address3);
2 f% S, f' y( v' f' G  
6 [% {* C0 e2 ^7 R0 D  for(num=0;num<8;num++); ^$ u9 |+ h- l* s% R
   {* F7 H8 n5 n) _+ _$ ^/ e
     P2OUT|=BIT5;        //sck=1; : V* v  f+ a" t
      read_data<<=1;
* L( e* g; U% E/ o$ p$ i      _NOP();
& I# M' E& l' ~( j& E6 K2 J      _NOP();+ [& ?$ f8 {2 m- v
      _NOP();
3 z! w+ [2 k4 ?+ D      _NOP(); & U4 n: C4 H' I8 [2 c! l0 I
      P2OUT&=~BIT5;       //sck=0;4 g: ]& F/ _4 Z- ]6 Z  z' E' T4 S
    if(P4IN&0x02). r& j' F8 |$ g0 P% ]0 e1 i/ p
       read_data|=0x01;8 N: w2 V. A! M8 d" B0 U; K
    else
5 f! M: _8 `6 h9 F       read_data&=0xfe;     
8 g# ]$ V" `+ Z+ X* S0 y( q# e) G8 g      _NOP();
2 Q  I( k! z3 I! p& s+ n      _NOP();0 B; u1 M+ G3 A! }7 Q! K% z
     } & n4 }9 Z# a. j
   P2OUT|=BIT0 ; //CS=1;
7 S% a$ W* C( x    _NOP();
+ x( {3 a  ]9 g! x. t* V    _NOP();
% Z) x8 b5 k* r; n! c    _NOP();
1 h* }! L3 H, Z8 }/ M  J   return read_data;
, u. A# ~! u3 c6 n+ K: w  1 \. C$ \3 {8 W6 t% z5 K
   
* }, s. o& E8 e! c* v3 O; L}* [0 g' _& @( w  A
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
" H. ^, U. ?+ I& i  a{
, N0 ?8 Z4 B4 ^8 M6 Z  P2OUT|=BIT0 ; //CS=1;  
3 D0 ~, o) I4 \$ j+ `, ?. f  P2OUT|=BIT5;  //sck=1;
% l% v$ O6 s# s( M" I, @  _NOP();
2 T5 t% {# J2 U6 \  P2OUT&=~BIT0 ; //CS=0;  q. u# A  k+ o& u$ w7 l9 _7 j& d* L. L6 z0 I
  write_byte(0x06);
  G# Z  X$ z3 e7 ?( F  write_byte(command);
4 N8 r# c6 s, j  B4 c* E" t  write_byte(erase_address1);' |' m$ ^1 q. l( i: ^! o
  write_byte(erase_address2);- h: `' B! Z8 S6 `1 D! Y' z1 W; O6 f
  write_byte(erase_address3);  C5 A5 f; C8 N; q0 q; h, a
  P2OUT|=BIT0 ; //CS=1;
) q" `0 g$ Z$ P2 G  _NOP();
$ K  t1 [0 \3 \4 d% L8 f. p: C  _NOP();
6 a  ?3 {: {1 e  C( G; F  _NOP();3 W! ?) G8 H8 Y# S% ]5 @+ b
}# X! O) [" b( ~7 u$ s
void delay()
4 w8 q# j8 s$ G$ i/ f" B* y{
' r+ s" }6 p% z: J9 E" J unsigned  int i=0;
9 V9 z! d1 ^' L' g" v unsigned  int j=0;
" q% j4 M1 Z" C% ]! E   for(i=0;i<=500;i++)! ^" o+ F8 K$ m( ?- {+ S
      for(j=0;j<=250;j++)4 h) |7 c- A- b: y
        ;8 J* Q* N7 l6 h9 t( J* P8 q2 o
}
( v! B6 k  s: bvoid read_busy()3 f. y2 L1 r7 n. |7 c
{
" u" [& @, U+ z4 t8 {* Y% m   char read_data=0;   0 b! C- h! J8 n; X3 N8 m# b
   char num=0;
# ]3 T( {3 d7 m1 ?" O   P2OUT|=BIT0 ; //CS=1;  
  }1 P/ a; E* {' n( F1 W7 f   P2OUT|=BIT5;  //sck=1;
" r: {  o8 w% l6 b8 p  S   _NOP();
% }9 E+ A/ }6 b6 ]- C   P2OUT&=~BIT0 ; //CS=0;
& H% H2 s, _9 l7 }: _   write_byte(0x05);        // read the SR1  " k3 }4 G( N& m: |5 S
   do{
/ @9 ^! N; {  H. C" V                  
+ J( n1 u+ Z& m$ w            for(num=0;num<8;num++)+ L0 b$ s2 l) ^: w- D! g
             {
2 g5 A1 Q+ G) i" l- m* h               P2OUT|=BIT5;        //sck=1; $ r% E. E. ^5 ?$ m- K# ^7 `" P, P
                _NOP();               
$ z! C; r. O$ Y; E( ?( P                _NOP();
. e/ U' M7 F: s1 U8 T4 s3 _                _NOP();7 W" G( A. z& l7 D
                _NOP(); ! f- D3 r+ q/ t3 `4 `
                P2OUT&=~BIT5;       //sck=0;              
# Q4 j5 B5 }5 u2 E- [/ ~  j                if(P4IN&0x02)
5 v5 [9 F. H) f  r: E$ N; p* y                 read_data|=0x01;
; w) R4 [: Z3 r. J                else/ w2 G* [6 \  a# ]! g
                 read_data&=0xfe;               
7 L3 z! r  B( K5 U, r1 s. ^6 K& l7 W                 read_data<<=1;# b  d6 `0 |: w- a3 [$ Y; f
              } * ]( \+ k8 l3 J. h8 d
            _NOP();& X0 |6 {2 e8 d4 P0 l
            _NOP();+ n* O7 s$ L1 q: ^: M- P
            _NOP();           
% V. C3 K. n+ M0 Z          busy_data=read_data;  
& k8 }3 w. b7 c% b$ R5 g2 q     }: o8 G. M' t7 _- E8 b6 m  P* W# _
   while((busy_data&0x03)!=0x02);& i2 h- h1 @6 _% w0 K
  P2OUT|=BIT0 ; //CS=1;
9 y) n% I4 X* U   
6 D# ^; b* ]; ]  r  s( J  i; a  / M* o* C& _6 I; H3 o1 v; Z
}8 U" `2 n! \3 o+ E2 f9 d  }

1 a  I5 D. Q3 q6 A$ S8 E- j3 A用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
! G6 N& [) ^  v, S: }
; c' _9 b, x- @: V* f/ l9 K+ _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-2-19 06:39 , Processed in 0.055544 second(s), 33 queries , Gzip On.

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

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

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