找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>
  g* K5 O7 d5 {2 W$ T% ^) Z8 f. U' Uchar readdata=0;. V$ r. D& C- d5 X' z
char busy_data=0;
8 o6 c% o% y% S  O& ?void write_byte(char data_byte);/ j$ H+ h' @$ G4 f! W# t; A
void send_command(char address1,char address2, char address3,char data);// command and address and data
8 Z* ~3 I+ t5 x# `char recive_data(char read_address1, char read_address2,char read_address3);
" [4 _5 D$ h4 J8 n% i! {void delay();2 m2 x" f/ ^: l6 W2 R3 I
void erase(char command,char erase_address1,char erase_address2,char erase_address3);$ c% @& |9 H3 s# |0 o4 P* q
void read_busy(void);
1 _+ A5 u/ X- |! ^6 x. Y# fint main( void )- {. j& K1 S1 x5 X; W/ x
{
" ]/ G) ?3 S* G( b5 C: R2 k. E  // Stop watchdog timer to prevent time out reset( K+ w% ]5 w1 A
      @! M! G) o- Y/ `
    WDTCTL = WDTPW + WDTHOLD;
2 a0 l; [' E. i% h  c: ~. J    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
  t, G2 H6 F4 A    P4DIR|=BIT2+BIT3;   //flash  wp si output& B* t2 C2 |1 @# \" }; b/ b
   
$ J4 X% S* w- a  K$ {4 b$ o/ W    P4REN|=BIT1;            // so pull up
7 i5 B' Q+ S4 R* ]' A: w* f; {    P4OUT|=BIT1;             //flash so pullup  selected p4.1
3 t1 p$ d2 C$ Y    P4OUT|=BIT2;             //wp=1
4 f2 F7 P: C6 E- d+ F8 I( C. Z/ ^   
7 e- q- J7 m! B* |" }    P6DIR=BIT4;
3 ?  H9 s# x8 L; m    P6OUT=BIT4;            //led
3 l) Y) k/ q: ^2 |    P2OUT|=BIT0 ; //CS=1;  * k1 t4 Q2 D) Q
    P2OUT|=BIT5;  //sck=1;
" H/ B  V4 k! L/ y' _2 \7 M2 S    //P2OUT|=BIT4;  // hold =1
3 x8 L3 _( S1 c+ S, m    _NOP();
) H1 B+ I5 r3 N8 `( }) e    _NOP();
1 G: B$ a% X3 g6 N    P6OUT^=BIT4;
+ ?  F# i+ F; z1 y! ~- R$ g8 v    erase(0x20,0x00,0x00,0x00);      
8 }) f6 z4 M! m4 B+ Q( ?, l4 n# R    read_busy();   
) r$ d8 u8 g% T: e- G; {# a( D    send_command(0x00,0x01,0x01,0x00); //xie,mingling         - h# W+ q$ y& Y! |
    read_busy();  
2 B5 l. Q: M, i$ N- M     readdata=recive_data(0x00,0x01,0x01);   : c7 `1 w! ^+ \& F
    while(1)
6 @: @  r0 H9 ~. b) V  m    {# v+ P5 ]! j+ q# P
     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
/ ?/ C4 Q1 S: A  ?: Z. [, l, K           
! O. M4 _; l" ~: n4 `# P      // if(readdata==0x00)
) X* ]4 w# r* V6 }       P6OUT^=BIT4;; R& j* i  u7 a+ i
       delay();' j* E* d) V: y
    //  readdata=recive_data(0x00,0x01,0x01);  - N  `. m: f% ^# s. S7 f5 L  q& r: W
    }1 }8 Z% I5 p9 G; }' [# J7 s$ p& R
  ) z- u, U. w$ A. V7 ^# b
}
/ m* m+ u7 K) B, }/ `. {" qvoid write_byte(char data_byte)) i+ X7 V+ A, h$ [. a' M7 l  C
{$ u- p/ ~  r" a: m- A9 W, W" j
char num=0;  9 d! L% [" H+ E4 K4 c7 g6 ^
for(num=0;num<=7;num++)
% G) P8 s# p$ ?, x   {% s5 e9 u: ~2 m% t
  
, g* {5 G7 r# p2 u( F# g' B/ b6 a     if(data_byte&0x80)2 u# ], g4 Z- H! j( h
       P4OUT|=BIT3 ;                //si=1;
6 w& s" i' j1 J& G     else4 I2 k; o' }) _2 Q" v
       P4OUT&=~BIT3;              //si=0;  
, m' {/ v9 e6 z9 j       P2OUT&=~BIT5;             //sck=0;) W4 @- m7 S# ]) `
       _NOP();  , O- O) ~  u+ a# B
       _NOP();* {% @( l$ U1 D. E
       _NOP();
& K- ]- O1 V7 ?( Z8 N/ H       _NOP();
- a  J" ~# v& z        data_byte=data_byte<<1; //数据从高位传输  ! s$ Q" o9 W% c
       P2OUT|=BIT5;        //sck=1;   2 A% d- S* f! o$ l
        
4 s! q5 y1 B; e4 v& |      
- r8 C) }  I( l( g6 }0 N( j   }
; H( Y* t0 L1 a) k) ^}. [8 t9 k" _0 p% J! g
void send_command(char address1, char address2 ,char address3 ,char data)
: h$ d5 v6 \: S. v& n- t4 t, {{
( T% ^0 Z* y8 I  P2OUT|=BIT0 ; //CS=1;  % w. Z9 z8 J9 F: [1 P3 l% D$ s2 l
  P2OUT|=BIT5;  //sck=1;
. _1 l/ F0 ^" I3 i; U  _NOP();/ \6 d. [! l1 t
  P2OUT&=~BIT0 ; //CS=0;
9 M- {8 L2 F/ ?* r' a  write_byte(0x06);   // write command" r( A) D+ B- T3 A5 G+ I
  write_byte(address1);
2 h. a8 w3 C  v  write_byte(address2);
* r9 I+ Z8 L$ E& w2 @  write_byte(address3);7 T+ X, z8 g! P/ H. `5 [
  write_byte(data);
- F9 u6 F& v4 J: D  P2OUT|=BIT0 ; //CS=1;! ]( K1 p- Z* T  A, M' ]! Q
  _NOP();
/ {- R3 M$ n' r/ p$ V: n) _  _NOP();
; h% w+ c3 A! ^! \  _NOP();
4 R  X  P% V& w+ l}
5 O. f1 r- l4 c
5 u) i# ?. Z* ^5 N  d# Jchar recive_data(char read_address1,char read_address2, char read_address3)
0 f) r2 v0 @! v8 {% _# d/ d( F{* _8 C0 [. d! P0 H. m
   char read_data=0;   
8 s' f8 k. q! W- ^, s. a   char num=0;6 {+ ~5 X. g9 x) X( o2 k( T" L
  # T$ T7 E% v3 l
  P2OUT|=BIT0 ; //CS=1;  " V6 N! j0 Y: y$ j) q: [
  P2OUT|=BIT5;  //sck=1;
$ q- [/ B$ H# M6 [  _NOP();  Z( l8 n) r8 q0 c
  P2OUT&=~BIT0 ; //CS=0; , c. ?& U# J  e) g  c* `
  write_byte(0x03);3 _+ R* j7 L8 f) g) t  Q
  write_byte(read_address1);  
1 ?( \5 T+ p; ]$ J- d" [  write_byte(read_address2); 4 s: U/ r$ ]- d, ^1 ^' D( ^
  write_byte(read_address3); ) K- [1 e: D6 t. r' w) z
  
% L* w* n4 {; r- C  for(num=0;num<8;num++)
+ n: y+ a6 ^, r1 O" {   {0 l8 b1 _7 ^7 o, `
     P2OUT|=BIT5;        //sck=1;
; F9 ~* j. R$ @* i      read_data<<=1;& t7 }' y1 r6 g" j+ m. L7 c! q6 p  f
      _NOP();
! `) q( ]0 {' i. N3 Y2 L      _NOP();4 |" P2 G4 U, Q) G. r* H1 G
      _NOP();/ `2 N3 N8 A/ q. _% ?
      _NOP();
. s, Q$ ~* \7 M      P2OUT&=~BIT5;       //sck=0;
: `+ d2 P& y9 @. Z: y3 }1 L    if(P4IN&0x02)
% [. I3 n: M1 o. n0 L       read_data|=0x01;
. l" L. A( @, G$ N$ e4 _8 B    else7 C" ?- t7 t6 l" R* @
       read_data&=0xfe;     
  P! [6 }5 D+ b, y' }7 `+ a3 b      _NOP();
2 H8 N' B" X- q( R; R, U5 B      _NOP();* }3 X7 R& G0 U2 t6 n: r- n
     }
0 a1 m# L8 |8 R  B   P2OUT|=BIT0 ; //CS=1;, c6 D8 u; A9 x! _8 h4 t+ w
    _NOP();
/ [/ @9 g8 x' Z' j' S7 _  l    _NOP();
, ?/ D4 M9 H3 R! P7 @' P) {    _NOP();
$ r5 d6 q/ s7 e% L6 O% M   return read_data;8 Q2 ?( G7 [: L1 A: d+ u% f  y, g
  4 v- O% {$ Q8 i5 K* A
   
# Y' H2 A% ^: e! |6 {- K- p' [}8 ^! [& D' u) Z1 V6 \" _2 k5 K
void erase(char command,char erase_address1,char erase_address2,char erase_address3)8 y; A/ C( {5 u9 b' b
{
( W# r$ _4 ~# p! c- r! `  P2OUT|=BIT0 ; //CS=1;  
# s7 p4 @1 H+ S) U  P2OUT|=BIT5;  //sck=1;, f/ `4 G; q9 v2 I- w' [9 w, W
  _NOP();
  e. R) @  F" D  P2OUT&=~BIT0 ; //CS=0;4 Q' |7 h3 R" c( _; ]
  write_byte(0x06);
7 P( c  E6 x8 o; C* P6 }. {  write_byte(command);
6 @$ Q  l: Y# |5 x3 k  write_byte(erase_address1);
' a, i) T6 H6 t4 A. T: f; B! |% j  write_byte(erase_address2);3 `3 V/ S5 Q; Z) c3 p/ N  C
  write_byte(erase_address3);& X7 C7 w8 x5 g1 n
  P2OUT|=BIT0 ; //CS=1;
# [+ {$ ?( j: T" Y  _NOP();, }2 d" O( T+ N# n, a! ]$ o0 o
  _NOP();$ ^; q; j  V- o$ x8 b: W
  _NOP();6 }$ O; n3 {* w: J
}/ c" }; l! j& a" k. n' I9 F
void delay()# P8 B6 ^2 r7 ^- O
{
/ m! _, ?7 H) T+ n2 z/ S unsigned  int i=0;  j4 t: x4 {! o0 T1 M% U1 `
unsigned  int j=0;0 d2 \6 @6 J8 I# I3 y8 ^
   for(i=0;i<=500;i++)
+ d$ ^4 c6 |+ Z# i      for(j=0;j<=250;j++)5 v" H2 L9 [  ]5 {0 R0 k6 t8 `
        ;
( j% b7 {9 |7 C' G}6 h8 `* \3 v+ Q- ]1 U( C( v
void read_busy()
, x- \% i, E2 L4 u% p, e. \+ W{, F& I) e. P! u4 r  X
   char read_data=0;   # B* n* s2 p5 j. o; j
   char num=0;" g2 l7 L5 f  r+ z. b$ X1 \. G$ R$ L
   P2OUT|=BIT0 ; //CS=1;  ! Z9 w4 j+ ]! `% r9 u) y7 v5 n9 b3 z
   P2OUT|=BIT5;  //sck=1;  r: K& L! \# X+ W. Y
   _NOP();
/ a- T" I! _; L   P2OUT&=~BIT0 ; //CS=0;
* I* N9 t- R% m- R5 {   write_byte(0x05);        // read the SR1  4 K& H0 }* T4 k9 N  G
   do{
9 J0 S. r, m% u& \4 }; P8 }. j                  
( `- _5 G* Q7 `: G5 \            for(num=0;num<8;num++)' j0 v0 Y. @+ J; f+ n7 F
             {# i7 X# v: X, t8 h9 I
               P2OUT|=BIT5;        //sck=1; # A! a$ z3 m7 t1 w0 T
                _NOP();               
2 _/ ]' _- d2 v& t. x- G                _NOP();* _& G, x+ L) _; ?2 P
                _NOP();3 O9 }( `$ ~! f. q4 R7 P2 G
                _NOP(); # ?% q1 `/ `9 O# |6 L9 V
                P2OUT&=~BIT5;       //sck=0;              % z3 M& Z" |% b- B: H- b
                if(P4IN&0x02)
) C* q3 w  R9 {8 w! I                 read_data|=0x01;/ r- Q' W2 [: S. E4 R6 W
                else
  l1 A0 {7 a" t  N6 p0 F                 read_data&=0xfe;               
9 [  G3 S  m4 O2 e                 read_data<<=1;
% |& y- u- a% v. t7 ^% L              }
1 X7 {: x3 S. p( b            _NOP();
2 q2 T6 M. h& a9 `  Z- F/ y1 f            _NOP();: r- Y, h( d6 q# A9 F- j3 d: Y% b8 f
            _NOP();           
" ^8 X, T8 ]: b; ~2 v          busy_data=read_data;  0 u. H' L( `6 W3 h
     }. K. r* l7 e6 ?/ D3 s  c7 z3 }% L
   while((busy_data&0x03)!=0x02);* v, d4 F$ h  n2 V3 s. F0 z
  P2OUT|=BIT0 ; //CS=1;
/ n/ g# [) Q$ Y. f, B7 X    1 H4 s4 D: m5 ~2 a5 ^3 p
  
1 y- W- M9 ]$ W$ p8 J0 Q1 x}( A9 q, T. q+ m1 y5 p8 W. _  y

. v7 H) e6 B& o用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
8 b2 q7 u4 d& }5 E8 A, a( |' X# B
. J: v+ N3 Z" \0 \8 Z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

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

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

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

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