找回密码
 注册
关于网站域名变更的通知
查看: 421|回复: 0
打印 上一主题 下一主题

msp430 模拟spi实现对flash的读写

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include <msp430.h>
' J% _8 x- H% C2 _# Zchar readdata=0;
. R: T5 ~' H; o8 N  t& uchar busy_data=0;
# s" V5 r! U3 g- S3 V! Bvoid write_byte(char data_byte);) P8 r& }2 s0 Q- @
void send_command(char address1,char address2, char address3,char data);// command and address and data6 |1 E9 w+ L+ t# q; w* g
char recive_data(char read_address1, char read_address2,char read_address3);; q- L  L2 T. p
void delay();. F% @. P; `; i
void erase(char command,char erase_address1,char erase_address2,char erase_address3);0 @: v3 o4 K) [, r' c5 K
void read_busy(void);# a% h+ u4 t& Z% \4 K. Y- j' D
int main( void )+ }- P# B$ x% R4 P: y
{
# t; [8 f  x8 s7 j) @0 z" X  // Stop watchdog timer to prevent time out reset
1 Y7 w6 J, @$ }) s   
2 w2 e' T8 q) @. `9 A. q  [3 z    WDTCTL = WDTPW + WDTHOLD;
& v5 b) |9 ]3 f8 k' U    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out6 V0 N) P% ^  _( t
    P4DIR|=BIT2+BIT3;   //flash  wp si output' r& j/ W3 t( A! R
   
5 b( k/ m0 D* a/ W- W: E    P4REN|=BIT1;            // so pull up
) |8 b, i# O; |* c( s    P4OUT|=BIT1;             //flash so pullup  selected p4.1
% |# v& t1 H" \    P4OUT|=BIT2;             //wp=17 h8 P6 f/ a3 C$ E" ~% \$ `
   % Q0 i) A; R9 E
    P6DIR=BIT4;. O4 m! I$ I) w. N3 O2 e
    P6OUT=BIT4;            //led$ W( [4 Y+ Y3 T, N6 D' D9 f
    P2OUT|=BIT0 ; //CS=1;  
/ u$ r, p+ L' Z. m    P2OUT|=BIT5;  //sck=1;
$ A; W( X9 G6 d4 }    //P2OUT|=BIT4;  // hold =1
3 |" n0 |. ]8 h* \8 ^$ w# e4 R    _NOP();
: M: b; L0 Y# i) x) a( d3 H    _NOP();
$ m& W& z4 g: u    P6OUT^=BIT4;
, G. t/ X1 \, {- l- b$ z    erase(0x20,0x00,0x00,0x00);      6 I  V% ~, a7 Z9 [
    read_busy();   
3 z/ X* P6 `; a    send_command(0x00,0x01,0x01,0x00); //xie,mingling         # y. W: L' l0 i( {
    read_busy();  
  j+ K; f# S7 @3 }6 [5 @+ O. q% i4 Q     readdata=recive_data(0x00,0x01,0x01);   
( b: ^6 h% u4 z( H7 v    while(1)5 ^* i: f( b- A, s; B& [/ P
    {
6 V! _. p. ?1 ~4 W; S' P     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
0 ]! W+ p! p- Y5 T3 b           ! w5 a/ N! C) e% `. s9 r* B
      // if(readdata==0x00)+ l; C7 I/ @( i2 w. i2 b4 |: @, \$ w
       P6OUT^=BIT4;, y: Y/ C4 C9 ^+ Q2 l9 @3 o
       delay();( P- |$ Z1 W* q) u
    //  readdata=recive_data(0x00,0x01,0x01);  + o" }8 U9 T2 D- b) C: j7 c
    }
* i" B4 E& g0 n1 ]2 [  
; S9 B8 B/ }5 i8 r}
) K$ X3 `! I4 L1 e6 k- K7 z  \% Nvoid write_byte(char data_byte); L8 d7 z: b8 p
{
( ~3 o. r6 }9 ]' ^5 Z2 R3 S9 D8 k char num=0;  . k" i0 w5 I! \9 @- ?; b
for(num=0;num<=7;num++)+ W; R% E. d& L4 I; P8 D4 Q
   {* `0 n- H9 |/ J4 e# H9 T
  4 C" T' E! A! Q
     if(data_byte&0x80)& d  \5 n7 }' y2 F. a$ C
       P4OUT|=BIT3 ;                //si=1;/ w9 _# o+ o( f9 F  m
     else
5 z# ?" W0 V9 i0 S: w8 Z# h       P4OUT&=~BIT3;              //si=0;  : U( h& i+ q5 ]* D! @
       P2OUT&=~BIT5;             //sck=0;
2 Z1 h" @8 \) _+ N       _NOP();  
  ~" V  `  ]8 G       _NOP();, \) x! I& Y& v$ B" x2 P
       _NOP();
5 o" q0 z0 R+ j       _NOP();
0 Z; d2 q& n6 b5 s* F9 u& D4 y        data_byte=data_byte<<1; //数据从高位传输  7 |$ v5 H  g5 m, q
       P2OUT|=BIT5;        //sck=1;   ) ]2 |+ x  K, A; S; _' Y# n
        ; v3 @0 X9 T' `3 r% t& y
      
% ~9 A; }  y$ T- o   }
, |; T% V# t. w. v1 r5 {. E  F# s' f# s}7 x, ~) R9 p- c4 I5 _$ z) N" i8 Z
void send_command(char address1, char address2 ,char address3 ,char data)/ Q# @: h7 s1 C: B6 r' E
{/ h8 p) l3 o! `6 Z, E
  P2OUT|=BIT0 ; //CS=1;  ) Z1 D3 {; f3 p; \' U
  P2OUT|=BIT5;  //sck=1;
4 O/ m& P& Q) c' N8 O  _NOP();
6 u4 f6 |  e3 S$ d8 J/ v" q; T* p  P2OUT&=~BIT0 ; //CS=0;
8 K) ^6 W2 g! q4 v  write_byte(0x06);   // write command7 u8 C# M5 R% d) d' P; C  u
  write_byte(address1);& h9 |# V2 V) I6 Z5 ~" g4 G% o
  write_byte(address2);
: H7 C( S( M2 n" _2 C! Q4 t  write_byte(address3);
5 \0 q0 A! v; `( e0 C) B  write_byte(data);9 v, S% _# X$ Q6 U, I
  P2OUT|=BIT0 ; //CS=1;+ l' `( g: B! L
  _NOP();
; T* f, K  u: J  _NOP();
$ V1 x, a9 J1 t* K  _NOP();
/ |) s. V1 m9 S}
& P: g  v0 t9 C
9 `) z3 c" i  ]1 n: c' D1 Lchar recive_data(char read_address1,char read_address2, char read_address3)5 v$ h  B: ?; D0 U0 i
{
, e' @  ^6 A8 ]+ L* E5 V: x   char read_data=0;   
% x+ c: f2 l. S   char num=0;
" @+ F/ s8 z9 u  8 p! z5 d7 s$ l
  P2OUT|=BIT0 ; //CS=1;  
* c! U& _4 l# D1 L4 _) `  a, l  P2OUT|=BIT5;  //sck=1;
. I' v! ?. q- u. x8 ^5 R! k1 K3 M" {  _NOP();; W4 L$ `9 Y3 G* H( o9 k% R
  P2OUT&=~BIT0 ; //CS=0;
. p  F+ M: I% D; ^  u; E" y$ @  write_byte(0x03);: M& |) \* |, X" c4 _+ X  w' e* r
  write_byte(read_address1);  ) d$ W* w3 |  ?7 f3 i* d
  write_byte(read_address2); * ^: V5 Z4 Z' g2 H  D/ M5 m6 t
  write_byte(read_address3); 5 w' q) o4 A  B8 D! B  @& P0 ~# U# h
  
) O/ B+ l, V5 p# A  for(num=0;num<8;num++)
" ~3 @: z1 j3 Z( w; R1 B! s; t   {" w7 w9 G) e& M5 H
     P2OUT|=BIT5;        //sck=1; 1 h7 `4 m; d9 P2 Z2 A7 E- ?# V2 }2 \
      read_data<<=1;
0 T3 p+ ]+ i% p8 w+ |      _NOP();
0 H* P. Y+ _  W- A      _NOP();( D7 T$ f$ R; q3 l* b3 b  c
      _NOP();
, a" d6 N, G7 K3 q      _NOP();
) j, O* W$ P( Y) |" w6 K/ E5 n      P2OUT&=~BIT5;       //sck=0;" J: j) g: j: ?4 P% p0 g7 r  ~
    if(P4IN&0x02)/ q' F( l7 B/ Y* {$ \' t
       read_data|=0x01;# L. j% c4 i2 L& f
    else2 B( l# C+ N2 Y' s: w  W
       read_data&=0xfe;     ' w! h$ v7 @; R* S& ?
      _NOP();3 E. g: h0 l9 Y3 `2 z) y2 y
      _NOP();
  h: P+ v) R( o7 y, x/ m     }
  G' l' }6 G, N  a( E  S: q   P2OUT|=BIT0 ; //CS=1;
* g, q2 k8 \- {8 m0 p) b    _NOP();
; @2 @$ w" K2 R. U( ~" Y    _NOP();3 {( ?) C& [! N& p( p9 I" w1 e. _
    _NOP();
7 C' i% Q( }: p. Z+ _   return read_data;
6 p  L5 r8 y. H7 k: E  
' i0 P/ L, o& }# {$ i. Q2 V    2 D( p( a/ Q" W6 i* G3 |3 j% ~
}
5 q$ A$ U" }9 [9 V+ xvoid erase(char command,char erase_address1,char erase_address2,char erase_address3)2 O6 K. w- v. ^; a0 L
{
0 t5 M* V/ d- a+ C6 j  P2OUT|=BIT0 ; //CS=1;  
( Q5 H) j4 N7 |; F) d# B1 T  P2OUT|=BIT5;  //sck=1;) }. U/ E5 B; ^7 x( W
  _NOP();7 A& d8 h0 T- m
  P2OUT&=~BIT0 ; //CS=0;
* p. B8 y7 m; n$ K  write_byte(0x06);
. E' J! v1 X1 ^* j+ X. i4 y  write_byte(command);
9 U4 e$ K" l4 o$ n$ _- P# l6 K  write_byte(erase_address1);
4 t4 a$ z. g2 G, h) c  write_byte(erase_address2);/ u( _9 |8 @2 Q
  write_byte(erase_address3);
4 y. M/ n, W! s7 @  P2OUT|=BIT0 ; //CS=1;) x& R# o! I4 S# r6 O. D- k
  _NOP();
; |4 d1 O& q- G2 M0 r# y( O  _NOP();
* E7 K$ b) _2 l3 J3 D! \% }' N  _NOP();; G6 p+ |! O9 ~7 i. r
}
" j* @0 u3 ^$ {- a9 @' `* _void delay()( c7 r4 J' L/ |0 _  x
{
1 L1 N' p  G/ v& n unsigned  int i=0;- {' Y" k3 k6 ^: K5 F. L
unsigned  int j=0;0 F7 B) U' t- F% k: T9 t7 ~
   for(i=0;i<=500;i++), F0 W7 I* T$ y' @- K
      for(j=0;j<=250;j++)
& n1 S6 {. H- k7 y6 `        ;- y0 s$ ?$ a4 ~2 O7 Z; U
}" c6 w* j; [, l9 N' F0 c- a
void read_busy()
7 K( t( Q: O- @- C0 |& W/ N( X{
5 b/ W- s. a2 m- y0 U) p   char read_data=0;   # ?; ^) e5 f% ?# [4 o
   char num=0;
- H" P) t2 P/ V6 o1 S( I   P2OUT|=BIT0 ; //CS=1;  
3 }' H' C' e6 B% g! U9 D   P2OUT|=BIT5;  //sck=1;
( u( A, s7 L6 s& g; @' L   _NOP();4 }' _/ J6 H! Q0 a
   P2OUT&=~BIT0 ; //CS=0;6 A$ U# U$ s' L3 j% F
   write_byte(0x05);        // read the SR1  # r" o, y% }* N# @1 z
   do{
3 x) t- f) u0 I7 C                   : H9 V) Z3 h# z5 W
            for(num=0;num<8;num++)
  A2 @8 q/ }9 ^' V* k% v             {
1 d4 H# A6 E$ M$ z+ H; ^" e               P2OUT|=BIT5;        //sck=1;
+ U# x# A4 J+ Z* q; u                _NOP();               
6 b7 x. @/ T6 y+ z                _NOP();
2 I8 B" A7 G( ]" J                _NOP();, H- z+ J) J. u$ b  @% A, X
                _NOP(); + S# I. P7 \, a" _  i% C0 D
                P2OUT&=~BIT5;       //sck=0;              
+ o* {: g0 h2 C0 c                if(P4IN&0x02)
( {. ^' r7 Y0 G3 F                 read_data|=0x01;* y# H$ D4 N8 \9 d
                else( B. O$ J2 q2 z* I5 |5 y' u
                 read_data&=0xfe;               
2 }9 L* Z6 q3 `                 read_data<<=1;
  U! v$ {: |4 j) s3 Y              }
/ C! I/ v6 b5 ^/ Y0 {$ D' b            _NOP();, u7 C+ r6 S2 c& y! C& l6 T% C
            _NOP();0 ^" I- `& @# `& ]7 z/ f( A
            _NOP();           
, b  |# }- G7 O* n7 ]8 p* f          busy_data=read_data;  
7 l" f. k# a' ~( o4 T* v% M' A5 h     }
2 A/ e2 V: H+ o* R, B9 I   while((busy_data&0x03)!=0x02);
6 }4 m8 y2 Q# \  P2OUT|=BIT0 ; //CS=1;
& J3 t6 r. b/ W   
6 @6 Z, n- v+ D. o  A1 m3 H  
; {# V* e% N  z" C- ]; \}
8 C2 c& _* U/ D8 @) q
9 T" ?, I, j9 I6 m* S用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!! _1 a/ q- v/ e- P! R! z8 _
% T& j! \; M6 L! Z5 W# b% L
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-12 13:11 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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