|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <msp430.h>
% \; s4 Q( Q5 E/ G; \char readdata=0;
2 w7 ]8 Z6 m8 f9 M7 T# nchar busy_data=0;
, _- i; l, D9 P1 c$ evoid write_byte(char data_byte);( {6 D; U5 |: O8 z) v+ ~
void send_command(char address1,char address2, char address3,char data);// command and address and data
& H8 w' }% ^ R# N/ v# Uchar recive_data(char read_address1, char read_address2,char read_address3);
8 g! r% j9 O7 N5 j, Ivoid delay();3 |; S: k2 a" r! R0 Z, _) t0 P
void erase(char command,char erase_address1,char erase_address2,char erase_address3); N) P. A* _" h' Z" d8 b x
void read_busy(void);
2 u' Q, u6 w( k1 O7 j) h$ h( \5 qint main( void )
! [4 o" x) V7 ]: [) B& S- l S{- ^9 F/ ]4 Y5 y2 T8 J2 j# B
// Stop watchdog timer to prevent time out reset
% {1 m6 |# T4 D% ^* k) h K# A1 Q: Q, k$ ] O
WDTCTL = WDTPW + WDTHOLD;
) e: K; L7 V- W w4 s P2DIR|=BIT5+BIT4+BIT0; //flsah sck hold cs out
5 h0 \6 c ^! O. i+ i0 q6 D P4DIR|=BIT2+BIT3; //flash wp si output6 L# k( `: ^3 t5 v$ D' q$ c8 k
0 x& G+ [* ^1 N4 }% f+ k- c8 P; @0 `
P4REN|=BIT1; // so pull up
6 E; ?; ?0 f' M' a+ D$ a9 c, ^ P4OUT|=BIT1; //flash so pullup selected p4.1
t, }$ p8 I4 P& j. J& o P4OUT|=BIT2; //wp=1
; h- j! i4 g5 f- S/ Q' w# O
1 O0 Z. V, g# I/ G4 s5 k/ Y P6DIR=BIT4;
4 e) b9 L5 a% @1 z( p8 L/ t+ T P6OUT=BIT4; //led' |" y4 v9 Q- g- ]
P2OUT|=BIT0 ; //CS=1;
: w1 C A2 B2 n) O( s7 e P2OUT|=BIT5; //sck=1;
, h! m% ?, }( i //P2OUT|=BIT4; // hold =12 o9 Z% f& s2 c5 \% Y
_NOP();
! C9 _ O& A" y1 M, @) q# q _NOP();
1 ` D$ H& q. U9 B P6OUT^=BIT4;
) t" i- d( i4 Z A8 e+ k erase(0x20,0x00,0x00,0x00);
$ l6 n) O" q) y z read_busy(); $ n6 W: G" {& j8 Q2 n
send_command(0x00,0x01,0x01,0x00); //xie,mingling
0 s4 a' F0 B+ j9 | read_busy();
: i8 S2 H$ Z. h: \+ | readdata=recive_data(0x00,0x01,0x01);
' i: e2 z+ f. q# y, R' [: k7 } while(1)7 P$ X/ p4 w3 `1 U
{7 r; u7 o( k" J' K! [( a. X
// send_command(0x00,0x00,0x00,0x0f); //xie,mingling
0 _" _. K( w$ |" ?) J 3 \- I: d- x3 c
// if(readdata==0x00)
+ W9 F' m# v! p4 u# L- y$ o P6OUT^=BIT4;9 g! ]# v" A# H/ ?: O5 E
delay();
o% F% E& t1 \" f+ q) t // readdata=recive_data(0x00,0x01,0x01); 7 q+ S u4 R% D4 D0 N8 i0 J* y: i; m
}
0 U* z' a% _' K! _8 \& l2 L# P
6 n v% e+ F7 ^$ K5 q' S}
5 D) Q" ? k5 g# g" ~+ r. [+ H" _' T4 k* j }void write_byte(char data_byte) `* a7 X v- F) f& y4 c- I- v
{
9 E2 }& `/ r, Z" L6 E! p+ l char num=0; f% o1 B# s; U$ |& @7 u& W
for(num=0;num<=7;num++)
9 q5 K7 _' g; x9 B% y9 c- R# m {
# U5 f f$ J( c! y . e" e, q' }: A4 G; {4 Z' z% h
if(data_byte&0x80)
0 l7 @' Z1 O& A0 K; [0 X P4OUT|=BIT3 ; //si=1;
/ y+ n! X1 L* v' H6 t# Q else
9 i( x) O3 j- N! Q+ W/ V7 y P4OUT&=~BIT3; //si=0; 2 w! O% A0 q- o% _2 C
P2OUT&=~BIT5; //sck=0;4 |) y# \2 G6 j' t1 l
_NOP(); * ^( d& v/ _) p) r! s9 I( E+ _$ N Q
_NOP();! O2 W" M) S4 p( a: B) F
_NOP();
% M0 O/ T; C5 A: d9 Y, }7 g _NOP();
0 Y) r2 }$ l0 o4 X data_byte=data_byte<<1; //数据从高位传输 / Z; q( t/ X( H6 M- p
P2OUT|=BIT5; //sck=1; b; P5 A" i, x ^
# P. t, C3 U a$ o0 f1 }2 I. N
* v# e# J5 g2 k; v) j5 O8 y! r( } } 6 T: V) G) r' G, y
}
- C) V& F4 E/ Jvoid send_command(char address1, char address2 ,char address3 ,char data)' E8 @; w! d$ L, G! h8 T( s
{
* {- d8 X. D1 J9 |6 o0 n2 W P2OUT|=BIT0 ; //CS=1; S9 @7 Y( @. _0 J! \, g0 x
P2OUT|=BIT5; //sck=1;; n# @6 c O0 j1 e/ y& _. W
_NOP();
! S0 ~7 Q9 Q o) w$ \# q P2OUT&=~BIT0 ; //CS=0;* |! }& z4 t+ _/ V' g( M
write_byte(0x06); // write command/ a- y8 q; p+ N4 h( A5 i
write_byte(address1);4 i, w$ g* P l. ?% B# T, e
write_byte(address2);
6 a" `% A3 R5 m( ?; n8 M write_byte(address3);( I! H9 {, u% y( R3 T- {9 e# T8 b
write_byte(data);3 N4 e0 c8 K, C. {- X
P2OUT|=BIT0 ; //CS=1;
8 } i. O4 ~; O! U& S _NOP();
0 Y9 C# t+ T' ~- t0 I* T _NOP();6 T" d: z5 C/ a
_NOP();2 J. M! s& C4 f! t1 r
}
) ^/ O# c! l( X/ S2 x, d
& h+ k7 \" e0 u! P" |/ bchar recive_data(char read_address1,char read_address2, char read_address3)
( @" [* j B4 ^2 Y7 F. H. l. i2 R- U8 r{
1 o& j+ W$ i! y char read_data=0; + |: E4 D0 h8 }2 f
char num=0;
% _& L9 C: W+ t- W
- g8 z& d" i y P2OUT|=BIT0 ; //CS=1;
) C* K( t0 i# t" d+ c* o4 X P2OUT|=BIT5; //sck=1;- @) `& k# O" l' [$ L1 K1 Y
_NOP();
3 U3 j7 {2 K" U- A7 S4 Y P2OUT&=~BIT0 ; //CS=0;
" G0 ~* _2 M5 H. ~ A write_byte(0x03);
1 |. q5 X# y3 U- T& @, g# n' F write_byte(read_address1);
0 X! ~/ H3 E O2 N6 F. k4 D write_byte(read_address2);
8 i- n0 t! k/ T8 Y4 I& w write_byte(read_address3);
, _5 s/ H" d+ ]! k- p% m8 n: Z1 _ 2 I% a) x& [, \5 ^; f, a
for(num=0;num<8;num++): A+ o! d# Z2 n7 x M& A3 P
{* q" N( _7 S. s/ ?0 _
P2OUT|=BIT5; //sck=1; 8 _3 c( M/ P9 | E) i# n$ L9 I
read_data<<=1;
- j% y+ z" p( s! r! L _NOP();
. A$ h* r/ i6 B2 v _NOP();
5 u, w! ~. C! B7 u _NOP();
4 B2 I& J A) @ _NOP(); * o+ J# {) G- ~! q" I
P2OUT&=~BIT5; //sck=0;
- f8 ^ u6 [( K) Z if(P4IN&0x02)
, }( e# \9 _# y: K read_data|=0x01;
2 _) C& ?/ E3 d7 i9 f+ x- W3 u! a* h else* @$ H1 l- _9 e4 }3 J
read_data&=0xfe;
$ P. C8 _# q/ v _NOP();& M3 n* T) L; P% B+ }
_NOP();/ ~" f$ s4 ~* C8 c% r0 X
}
; T$ i, s$ t5 g* E4 H0 ^ P2OUT|=BIT0 ; //CS=1;; X5 v% ^; X4 x0 W" {% I* D+ i
_NOP();! x" q! b( U/ L" Y$ u* j
_NOP();; M6 `$ \5 U }* h/ ]7 v
_NOP();
7 ]! F, A) i% z9 ^) [ return read_data;
8 p- v. A9 l# k* F/ p* h ( ^+ L( ]3 O) J: x
1 z6 A8 S5 q2 B& C& h n( m& q
}& ~) y. m3 G* \6 R) A ]; g% p
void erase(char command,char erase_address1,char erase_address2,char erase_address3)4 g) L2 V1 ^& u" x
{' P( @/ K% [: W, z2 {$ \
P2OUT|=BIT0 ; //CS=1; 6 E! {9 e p5 C% F2 Y
P2OUT|=BIT5; //sck=1;
; e2 V; S) w% x5 [8 j3 d _NOP();- } i3 r2 M: i3 L7 j
P2OUT&=~BIT0 ; //CS=0;; q7 B4 ?+ r6 f
write_byte(0x06);1 {+ g! o1 I! k6 _3 S" q
write_byte(command); 0 O+ l6 | S; J( ~4 S
write_byte(erase_address1);5 A& H+ b) O) [# D, c) X9 c
write_byte(erase_address2);
0 \9 j* |& M3 M+ ^3 a0 l7 p9 b write_byte(erase_address3);+ H* ^0 ~3 d% ^7 ^. x- l
P2OUT|=BIT0 ; //CS=1;3 p/ C& m8 B4 I
_NOP();4 Y* b( G+ M* z0 s& I. J3 C, O
_NOP();. f X; I _ t
_NOP();6 d3 h2 D) z! b/ X7 W
}, N, V( a; H" P# W+ Z
void delay()4 H' }3 q! m% a w: {" s0 {7 _8 ?
{+ @6 @. h5 c1 z0 O8 c
unsigned int i=0;0 g5 [/ Q- m& D' L! d( ^
unsigned int j=0;
0 c! ~3 L, F) E for(i=0;i<=500;i++)
0 g: Q) M5 c" h- Q8 O for(j=0;j<=250;j++)
, C& G% J/ k! ^0 f ;
/ |3 ?3 ~8 b* E}
( t/ I8 B- D# n- j+ z* mvoid read_busy()
' b8 f4 K$ |2 S7 P( c9 p3 c{
8 Y; r% H( P/ I1 s" |. Q. | char read_data=0; ! G9 z1 m: x8 t, ?6 p
char num=0;! n- h" U0 e9 L% ], N1 f
P2OUT|=BIT0 ; //CS=1; / J% V% i/ f! I* n
P2OUT|=BIT5; //sck=1;
5 Y; c( @, l7 R. J: { _NOP();+ S% g1 {, @& k+ H- M3 R6 {6 _
P2OUT&=~BIT0 ; //CS=0;6 Q& V% Z2 G7 ~; w [. w
write_byte(0x05); // read the SR1
3 _9 Z7 T% d7 v do{; v% T8 v: b% }% P
1 b5 _+ h% `- N for(num=0;num<8;num++)
9 J# ?: h4 Z7 k9 w4 }: u/ V7 c( E {" `4 a# i" {( z5 N1 n) d/ h
P2OUT|=BIT5; //sck=1; , \9 p) t, w# q8 i4 g: C2 ?
_NOP(); & |0 _6 x$ d# N v4 q4 f
_NOP();" o( a) l! `2 |
_NOP();# k1 W( s2 S) h+ H! c6 n* c
_NOP();
9 L8 p" t6 |0 w2 I2 u P2OUT&=~BIT5; //sck=0; $ m8 M: j& K" f6 m5 y3 D0 p4 E
if(P4IN&0x02)
* S! t0 B+ v1 c4 u% l. Z( h6 m read_data|=0x01;
( H# @9 i# ]7 i; w9 | else$ U% ]0 K9 [& M
read_data&=0xfe;
. k4 y4 P: `0 y7 \# M read_data<<=1;
. w9 T# r4 U8 ]2 B `6 z% t" N } ( }! |2 E& ^+ l- ^ m# D) f6 ^
_NOP();4 _6 n; {+ w. Y# h% S8 U: g
_NOP();6 q& B8 t; {7 ^8 m
_NOP();
8 X: F1 ?7 y8 J% Z busy_data=read_data; ' F! [. d9 ~6 W" Q
}0 t4 a' v0 c% Z# {7 @& i
while((busy_data&0x03)!=0x02);
: C& i% ^6 A! }; X% E% p5 }6 }8 U P2OUT|=BIT0 ; //CS=1;
J4 ]/ f" y4 |: ~ l
% [1 W& |$ k$ o9 N7 ]( [" g 0 y' k9 N* L% n
}6 V E9 f! G' H; e0 z( w( t
5 F0 ?0 j$ e7 Q) N用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
) r$ Y" a7 \0 D, j2 {: P3 L1 p4 r/ d7 c3 x( X9 e& U% S/ K
|
|