找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

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

EDA365欢迎您!

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

x
#include <msp430.h>' c1 W% C- }8 Y# d) j$ Y! h% A9 D" p
char readdata=0;
% I+ V( I6 I+ o6 ?# rchar busy_data=0;
" J1 N) v; t7 V$ lvoid write_byte(char data_byte);$ m* g0 o7 f3 x- ?* |" w5 E
void send_command(char address1,char address2, char address3,char data);// command and address and data
1 r" e' ^/ h/ P3 ~% i* Zchar recive_data(char read_address1, char read_address2,char read_address3);
! f5 i( V5 a7 V4 o4 ?1 g+ dvoid delay();
/ Y$ P% ^# t$ T$ h' xvoid erase(char command,char erase_address1,char erase_address2,char erase_address3);' L" Z( r' q# Y% S% p8 G
void read_busy(void);7 c' {+ A1 F& m0 E1 C: B" E' |; Y9 p
int main( void )
# ^; Y: C0 }& {{, Z. e8 B' ^. q+ z8 }$ ^
  // Stop watchdog timer to prevent time out reset6 q2 W( ]5 K' w0 |3 J
   
, r: h: Z, _* U8 W. A    WDTCTL = WDTPW + WDTHOLD; 1 R7 j1 n) j' C1 w' c0 W4 s8 f9 F$ \1 m
    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out$ g/ p4 Q0 g8 @$ a! L
    P4DIR|=BIT2+BIT3;   //flash  wp si output* }8 I' U8 ]- s$ l/ _9 k* G/ U
   
" r9 L6 l) U( @. d$ `& A. w9 a8 f* w    P4REN|=BIT1;            // so pull up
9 n" |" X- w! r" w5 u3 R& D2 ^    P4OUT|=BIT1;             //flash so pullup  selected p4.1# H+ @0 q9 g* e! S+ u' W+ K8 T
    P4OUT|=BIT2;             //wp=1
0 l% I8 v! t5 d# n. D   
1 V& g+ V* \! J    P6DIR=BIT4;
, c- @% M8 O- |* U" l    P6OUT=BIT4;            //led0 O$ J' J2 M& X5 U; i
    P2OUT|=BIT0 ; //CS=1;  0 K# `* K- N+ A
    P2OUT|=BIT5;  //sck=1;
% m9 ~* p/ S- H    //P2OUT|=BIT4;  // hold =1
; J( O9 Z9 J4 f5 u7 m    _NOP();* `  |. q  a  O8 O5 s( z$ O6 D
    _NOP();% _4 W4 P: k! j' G( o8 h) i
    P6OUT^=BIT4;/ ~; P" T. {4 Y. r$ {
    erase(0x20,0x00,0x00,0x00);      
. V, o. h4 v$ d  _    read_busy();   
$ r- I& y: F1 e7 j    send_command(0x00,0x01,0x01,0x00); //xie,mingling         7 E0 L9 j: \% k# Z
    read_busy();  & B; d% o2 G/ v" |# I
     readdata=recive_data(0x00,0x01,0x01);   
2 h7 D1 S  i' c0 W    while(1)
* Q7 f. F9 h; f: f- e    {
, V$ V& e5 C; k. g" L* p3 Q! ]" U     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling6 H# D- z. z. G+ g" J
           
) Z% u/ q4 `# ^. o, H      // if(readdata==0x00)6 K( T/ G: h  g, h! {( }" i4 j" r+ p
       P6OUT^=BIT4;
) ^+ N. }* N  C* u( Q% c  e       delay();5 r# W1 g* k/ ]# o- |: ~; |4 E
    //  readdata=recive_data(0x00,0x01,0x01);  - u* T) m) E" z- X/ }2 O* u
    }
; |( j/ r* D+ H7 |- r: i7 j  
) d' a+ S& ?7 K, ~5 d7 O7 U' Y}1 \# ]. S/ y: h2 J& }4 W5 e6 r
void write_byte(char data_byte)* p$ F$ {6 a  N8 s  v: z3 [
{
0 q( O0 ?* l) }+ X3 R char num=0;  
0 `% P8 H8 ~6 |# { for(num=0;num<=7;num++): Q4 c  w1 G& E( X  X, @) T
   {. _& F) w( W9 t% w+ I
  ) \% B- e) y. X
     if(data_byte&0x80)7 z3 X9 Q: l7 w% Y4 R, @/ D
       P4OUT|=BIT3 ;                //si=1;
0 }+ E' {8 b# C& Y6 j     else
8 ^! j3 i/ l8 q9 ^+ h       P4OUT&=~BIT3;              //si=0;  
- X/ j; F$ ]+ D# u% P       P2OUT&=~BIT5;             //sck=0;7 @/ g5 l* ?  o' E' u) {( ~2 }1 P6 y' a
       _NOP();  
- P+ S+ R# i) G9 C- _0 S5 i; ^  L' E       _NOP();; w# {' }+ \6 `
       _NOP();
$ D) \' T9 g  H. _9 e3 D       _NOP();
. I: S# h8 P# F* d5 H        data_byte=data_byte<<1; //数据从高位传输  $ m: ]# j; n. x6 Z# T1 B
       P2OUT|=BIT5;        //sck=1;   * F  h3 M+ x/ ^  N0 h6 b8 }) P+ T
        " f8 O) \2 ^# l
      
0 ?% a4 C5 e* X7 M1 B7 b: E& |: p   } 1 J/ O9 R+ w" p! Q( E
}
! {# S- Y9 I4 I' R9 kvoid send_command(char address1, char address2 ,char address3 ,char data). a% H! j7 T' L! i: N6 K
{
3 A8 c' i. H8 y7 |4 F  P2OUT|=BIT0 ; //CS=1;  " q# O) j" ?6 A( m9 M1 D
  P2OUT|=BIT5;  //sck=1;6 \. V6 H' b3 @' z- {
  _NOP();( g; g1 L7 s& \1 x
  P2OUT&=~BIT0 ; //CS=0;5 B4 c- v! Z2 a* X
  write_byte(0x06);   // write command6 d" K6 c- h) ]: M2 u% r# r
  write_byte(address1);
  j1 [9 c' O9 \  write_byte(address2);
; O" B5 V% C5 d+ G" q9 p  write_byte(address3);1 f) d, }! F' D% @' ~& j, {5 @! h
  write_byte(data);& o3 v+ ~, r+ q+ Q5 K; f
  P2OUT|=BIT0 ; //CS=1;
1 Y' F1 I0 J9 `  _NOP();+ V$ n# h/ U5 Y4 j  n; Z  ~- I/ P
  _NOP();. q2 q% s' [# u$ @
  _NOP();7 H  F3 O: f$ |. W
}$ e% T  E2 s& G

* k  T, b0 t% w+ h/ [char recive_data(char read_address1,char read_address2, char read_address3)
; ]' _1 F( F7 g3 I9 {{
7 ?: U, x# s3 [4 V2 `* ?   char read_data=0;   1 C3 e& z4 M2 O. N2 k
   char num=0;( B% G% ~/ D! |0 z1 |
  * y# X% u7 v: U% c. N8 f
  P2OUT|=BIT0 ; //CS=1;  0 Z  o( G1 k9 g/ P$ ^* J
  P2OUT|=BIT5;  //sck=1;) Z: p6 Q. E! h0 o: D+ d
  _NOP();
  l* B. b% g) M$ e, V, K  P2OUT&=~BIT0 ; //CS=0;
& Z: Z' j1 i& w0 U  write_byte(0x03);* s( j% {3 M1 Y4 a9 W
  write_byte(read_address1);  # p! x4 }, T- K! U) R
  write_byte(read_address2); 1 C$ C- ^* f# Z& v
  write_byte(read_address3); $ k& b0 `( ?7 O( D
  
2 }  s; o0 s8 d  for(num=0;num<8;num++)/ W* ^* D) S2 [& q+ t
   {
* \/ o. t* ?- S1 k. R     P2OUT|=BIT5;        //sck=1; 4 s, f4 K, p! f' D# p
      read_data<<=1;
. g3 ?+ B, s1 U2 P7 D6 ]; j      _NOP();
8 r2 `& e) T1 M      _NOP();
3 x! e5 A( D% h. {7 l! D      _NOP();6 c' f& r* A4 V
      _NOP(); & X3 [" ]! L2 u/ `, I
      P2OUT&=~BIT5;       //sck=0;! U6 N. J: ?6 P  R' j' [1 w* v
    if(P4IN&0x02)
% q0 Y9 S( E8 h0 [/ H       read_data|=0x01;+ s5 ]* _7 p) Z8 V, o
    else- f- E- O9 a* }# _$ Q
       read_data&=0xfe;     
& @4 S! ~+ [" E* T! x      _NOP();
% ]8 f" e# o3 o: X      _NOP();
- I) L: S' ]3 b$ y6 r- L7 Z     } - G. a5 j6 `- \: V6 L! e/ b
   P2OUT|=BIT0 ; //CS=1;
1 J/ m$ N7 D8 ]% q; p8 `$ r    _NOP();
: r! y7 b9 h/ [6 `, ~/ h/ e    _NOP();
) b* d  @& A( X! d    _NOP();
% H" C$ F2 M+ y- m- N& }. E   return read_data;3 J$ Q: a# D+ J- ]# O9 \  x7 s+ T/ V
  
8 x6 G) l' N; b4 E, W5 _    9 B8 G3 _3 ]1 S' v
}
. c2 v5 l4 O2 w" q1 f- T& Lvoid erase(char command,char erase_address1,char erase_address2,char erase_address3)
. A" [4 h) {  P. Q6 q{( t0 q- ^- y7 M" B3 ~
  P2OUT|=BIT0 ; //CS=1;  , h" H. L& p- v
  P2OUT|=BIT5;  //sck=1;1 m: U+ E8 ]7 h
  _NOP();
1 m3 v7 N6 w( S! v, P' h0 a  P2OUT&=~BIT0 ; //CS=0;
7 w* V. C/ r1 w. w: U. R  write_byte(0x06);5 X" R: ^. m& Y7 _* X
  write_byte(command); 5 }# M" \# _! p. M$ m: ]
  write_byte(erase_address1);
* @1 R% w* h3 t  write_byte(erase_address2);
0 L( m; c  l% g  write_byte(erase_address3);
5 g8 a9 z4 W+ z/ ?  P2OUT|=BIT0 ; //CS=1;  d/ @- i  x7 }2 Y" V
  _NOP();+ d( x3 N2 P+ N+ [( j1 x1 V* H
  _NOP();
4 _; s0 H4 s- v2 o0 {  _NOP();# l  m1 V' ~! T& s: o+ j
}
) Q/ n9 j% ^0 {; _" qvoid delay()
& x# L8 x; [( w+ k, ]! n{
1 K% b, z& [+ _6 w# F; f! j unsigned  int i=0;
, m4 d! K: i) @3 m/ B1 g unsigned  int j=0;$ n: D" K* `* [+ q" q4 d
   for(i=0;i<=500;i++)
9 J( ^& o( e  u# l. _$ {# g6 H      for(j=0;j<=250;j++)
3 a1 d% D6 V# }0 f        ;
6 y, b4 V6 }" b4 `" _2 e}
! w# f) N; h% t6 s# \void read_busy()7 ]9 m* z& A- ]( J4 w9 H
{! h" }7 _, _- J  O. G! Z" g
   char read_data=0;   
- _; h/ l8 k0 s   char num=0;
0 O# K. {$ G3 r5 a  R7 s4 e   P2OUT|=BIT0 ; //CS=1;  
8 k% J; O7 n/ g   P2OUT|=BIT5;  //sck=1;
& O+ }, `4 w1 f+ x4 M' z   _NOP();+ z( [2 G5 @$ e0 P9 g
   P2OUT&=~BIT0 ; //CS=0;0 x' S7 i5 k+ q$ P, I7 P
   write_byte(0x05);        // read the SR1  - Q' Z! k2 J" w+ M/ G4 [
   do{/ r6 x( A9 x' E9 t
                   : \* n( B3 G# L" i  _8 i0 Q; V" B
            for(num=0;num<8;num++)
( O$ y% C6 z7 X6 ]% L& o; E             {! b: h0 t, J2 ]' n& o
               P2OUT|=BIT5;        //sck=1;
; W, G! i8 ^% h$ X3 U                _NOP();               
' W3 ?. E+ Z: H3 Y! R2 h$ |                _NOP();$ s* Y+ ?3 x; G1 Y& e) s
                _NOP();
; ^8 Q, P, a" H( N( J& c) G2 h                _NOP(); ' [! Z) D$ j; P7 d
                P2OUT&=~BIT5;       //sck=0;              * y' {% I( G8 h1 R5 S& j
                if(P4IN&0x02)  {8 z$ O7 n- w# n
                 read_data|=0x01;1 o* X: v/ M+ e2 t
                else  U7 r3 L* k% Q5 S
                 read_data&=0xfe;               
5 i  m$ V! [2 K6 W! J                 read_data<<=1;& S8 [8 k. w  |# @" u% Y  z
              } 7 p) T6 P, L4 M3 z# y: ~
            _NOP();" y& D1 s4 H/ `8 Z
            _NOP();8 V8 ^9 q( i" A/ f
            _NOP();           
1 F6 }$ y7 p8 }- q6 H1 @          busy_data=read_data;  2 c+ l) w% k. l6 K
     }
2 ]2 y. d5 g. E' Y7 e   while((busy_data&0x03)!=0x02);8 G9 H& u- k+ K
  P2OUT|=BIT0 ; //CS=1;/ f2 \8 ]! k$ I$ Z) K
   
% ~; f# G+ y& p& y; E: _6 H2 }  
* k/ t3 a; D4 j, c}
3 p* n: v) V6 ?3 Z
) w" y' B1 ]2 q- q用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
- A: f- L6 R5 z1 H0 Y
; y/ ~/ o! n- P. B' \' J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-20 00:05 , Processed in 0.057329 second(s), 33 queries , Gzip On.

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

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

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