|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
#include <msp430.h># t$ }8 @- t' i: C2 ?
char readdata=0;$ g% l$ K* x$ A( B
char busy_data=0;
9 i- |1 ~$ W: s# R/ W' wvoid write_byte(char data_byte);- q; Q% u9 ~1 M( V! O
void send_command(char address1,char address2, char address3,char data);// command and address and data
8 |' Y0 p8 ?2 q4 Fchar recive_data(char read_address1, char read_address2,char read_address3);, x& U, z) N# u$ _4 @, w2 L- e
void delay();4 V3 L F+ x8 o, x" b
void erase(char command,char erase_address1,char erase_address2,char erase_address3);* G |/ w# ~6 X4 }- s% \+ Z1 h
void read_busy(void);* i- o, X& K! ?0 n. g6 t
int main( void )2 j8 M7 X; G" W, H0 ~. F
{2 k/ h. d5 f% _) b
// Stop watchdog timer to prevent time out reset
$ ?+ O" D. i; X. ~
: V. c3 i& l1 m7 R- }9 _+ j$ x! ? WDTCTL = WDTPW + WDTHOLD;
& y- k- M7 Z/ ]: d* [ P2DIR|=BIT5+BIT4+BIT0; //flsah sck hold cs out
: `+ ^* I% S0 ` P4DIR|=BIT2+BIT3; //flash wp si output
- ]3 E8 W& Y% x3 N
- b3 }2 p7 N! P. e P4REN|=BIT1; // so pull up
+ ]) o9 r7 I( ]% q* I" d P4OUT|=BIT1; //flash so pullup selected p4.1
% x. p% p+ _* d. } P4OUT|=BIT2; //wp=1
" i4 D8 ~. s0 n) p 6 X2 m, |: E! p8 L
P6DIR=BIT4;5 R8 Z5 L! E, }* [3 E+ ~$ G% H4 G
P6OUT=BIT4; //led& ~+ }4 L& Z6 Z9 e+ r
P2OUT|=BIT0 ; //CS=1; 3 {- G9 h9 o. d/ ~+ g/ y
P2OUT|=BIT5; //sck=1;" E0 m3 H/ A/ W
//P2OUT|=BIT4; // hold =15 U3 J" T! d0 N/ _, m3 G
_NOP();$ {/ P9 g& b/ Z& Y6 o/ S
_NOP();
& ~2 q+ b4 _7 j P6OUT^=BIT4;5 ~4 v$ g3 m! H# s: y
erase(0x20,0x00,0x00,0x00); ( @# A7 ~$ m& N
read_busy(); ) Z+ l& D! r: m) ~1 Q) B, b% N
send_command(0x00,0x01,0x01,0x00); //xie,mingling & L Z* |! v9 ]! f3 a: j7 f% H4 K
read_busy();
' j# G; d0 k1 _ readdata=recive_data(0x00,0x01,0x01); 0 q, C( F1 I% C |; z/ w3 G& F; t
while(1)' U y3 J' L' _4 D% Y
{6 m( A8 P$ e+ ]+ a7 }
// send_command(0x00,0x00,0x00,0x0f); //xie,mingling& x% {* [% ^: I5 ^) w; }6 V
; r8 H* @2 k, k G0 l# L1 Y // if(readdata==0x00)
( q$ c9 x5 h0 Q( d P6OUT^=BIT4;
- Q( m2 Q/ F5 B; S delay();3 t3 |, N) D! K5 S4 U- m
// readdata=recive_data(0x00,0x01,0x01); 4 E- @% b$ s4 R, H( \
}8 _. P) w; G% R& ^) q3 v' `
# K' p: K2 ^9 a, \* x
}
' q7 o& y3 v2 r2 D$ C: n: E; v- evoid write_byte(char data_byte)
; f" q2 C; C- g+ x o& k. b1 o{
# v( Y' z+ @6 H3 V7 D5 f char num=0; 5 w4 T! G" T; O% S* a
for(num=0;num<=7;num++)
( ?0 [/ z! f3 E2 S& C: O8 p8 w {
, o3 z( h& f* Y G . _: o7 N" w9 G
if(data_byte&0x80)+ n' Z/ h$ p4 g( e$ o3 W
P4OUT|=BIT3 ; //si=1;0 e; d8 I+ A; V3 v9 G( N
else
- w' m/ }9 d# E" y3 I P4OUT&=~BIT3; //si=0;
& U5 I6 w; E7 M8 M# K P2OUT&=~BIT5; //sck=0;' N! Y* W3 d$ q. C% {+ [" c' C J
_NOP(); * I8 M3 M+ _( ~! h( I8 Q% J
_NOP();
- u. x6 V6 B" C8 p _NOP();
7 [. j: {9 b1 k( b" f _NOP();
6 X6 A2 m( {3 G& R data_byte=data_byte<<1; //数据从高位传输
) i3 p1 k) e2 r! n1 N1 n P2OUT|=BIT5; //sck=1; - r4 {# n9 K# m$ ?3 e
t; ~" f. r1 s# B0 P/ S
, F. D# n# Y2 G8 |, X } % I% b1 a5 A$ @/ M" \! G4 G
}
* k& I( j' x/ Wvoid send_command(char address1, char address2 ,char address3 ,char data)
" E& H6 K+ F" G2 _{
9 y; F0 P/ k7 F- H P2OUT|=BIT0 ; //CS=1; # X% q3 Q( h, Q
P2OUT|=BIT5; //sck=1;* ~7 O% C( }# c
_NOP();
% A* P* G8 M% K- i+ t P2OUT&=~BIT0 ; //CS=0;6 F% }. T; V4 k" Q2 @, L2 p% Z
write_byte(0x06); // write command
* P$ k i0 a6 h3 i write_byte(address1);9 q6 N- A7 P) K6 o, N7 j& D
write_byte(address2);
2 c1 J8 d' }- w& Q3 O* Z" j" P write_byte(address3);
+ ~; O+ ]; C3 N write_byte(data);, s B# `" p$ D9 I
P2OUT|=BIT0 ; //CS=1;
* p- H* ~$ i3 f. G* t# t _NOP();5 t- o! z( z: P: {
_NOP();; F4 X( x: }, _! b0 q
_NOP();* @. ]' b2 E' d7 Z6 l0 Y
}
6 P+ V7 Q5 M ~& X+ Q/ ]
; Y; y% A. j' E8 F/ k9 j, ]char recive_data(char read_address1,char read_address2, char read_address3)6 f. r( Y0 Q" V: u' }
{/ ~1 l. F, Y K: i+ g- H* i1 L# c( x
char read_data=0; - ^" u' N9 z" Q8 F6 r7 s
char num=0;) G' e4 G' Y V/ Z, {
/ |) R1 v9 S4 f
P2OUT|=BIT0 ; //CS=1;
: h7 g# T5 a: c9 J P2OUT|=BIT5; //sck=1;: y4 M! c' T' P
_NOP();/ ?5 s' p0 P6 _9 B$ }9 {3 v
P2OUT&=~BIT0 ; //CS=0;
) A1 S0 ]6 ^) x4 J4 a# K write_byte(0x03);9 I* H! J$ n- n, m# k5 M3 w
write_byte(read_address1);
7 _5 B" B1 s6 O) o write_byte(read_address2); ! k4 H' I* Y, {; R) O9 q
write_byte(read_address3);
$ L* J2 r1 M" n& n, u) c : |- ^* @. |7 J) F
for(num=0;num<8;num++)
2 B- P5 T1 {* {" |' Y5 D {
: r/ W( |& k i- q5 l2 c P2OUT|=BIT5; //sck=1;
2 m6 n; i5 Q& e1 b read_data<<=1;
0 G9 c: `+ M& e& D _NOP();
5 F* Q8 i2 D0 E2 M, Q8 V# v _NOP();/ V7 g2 ?' ?9 x: m
_NOP();
# c9 X8 r2 [; V+ W, Y _NOP(); ' K' F$ G/ n) N1 z4 B J0 [
P2OUT&=~BIT5; //sck=0;4 r5 X+ h, }& [/ o$ `; S
if(P4IN&0x02)
6 D6 @1 ~3 _/ M: E8 Z7 O0 h read_data|=0x01;
0 x; X1 j" t3 u7 ]) _% C! l8 G U& s else
4 d; U A% W8 y read_data&=0xfe;
: n$ p5 A% g" n _NOP();5 [: ]8 D+ |( v
_NOP();
" o9 Y# V$ ?+ n I" e( c }
4 p; D5 I3 a9 H/ X P2OUT|=BIT0 ; //CS=1;
! ]& o# j/ O2 j* j _NOP();; G5 D! _2 `: ]) w V6 u8 N1 ]
_NOP();! f, i) z. A2 B1 Z
_NOP();+ F. n4 A0 r/ C. n- `
return read_data;
/ X6 r! X, j: ^& n2 _: \: F . V' Y0 A" Z6 L4 }1 b! o, i
0 U! D4 ~) x6 P, ?7 B0 Z
}) X6 {3 y$ d! i1 S1 F
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
( u" o7 k; l( K/ E{
8 t# n5 t+ w. T P2OUT|=BIT0 ; //CS=1;
@$ T, v1 E. `: \$ i" u' { P2OUT|=BIT5; //sck=1;2 J/ p; a9 F8 @9 ]2 r+ r' K
_NOP();9 G+ Q2 U( n8 W- z/ y+ [! @
P2OUT&=~BIT0 ; //CS=0; Y/ n( G7 W8 t) x
write_byte(0x06);
" f* w; p& G. B! R2 d5 Z# S) l write_byte(command);
. w9 X a& h7 }1 X- ^ write_byte(erase_address1);5 |8 H' T3 X! `$ m: b5 m! B
write_byte(erase_address2);
( A1 Z g+ }/ _- @" q- Y6 U write_byte(erase_address3);
: I, n) G8 l+ Z8 V O P2OUT|=BIT0 ; //CS=1;
, L9 A6 H% M l$ K# F _NOP();
7 h; [5 T8 e* Q! d+ [ _NOP();2 V' y8 Y- ^8 C6 b
_NOP(); h$ w8 @, E5 z% C6 {: ]
}
- j6 _' W. I& p6 Nvoid delay()( h' h" D4 p' ?- w! W/ a
{0 \. |% l# l2 S% c" J3 Z
unsigned int i=0;
: c* r; \7 W K3 I+ \2 u unsigned int j=0;4 D( i# m: g3 O7 I, k; k8 n9 M
for(i=0;i<=500;i++)
6 Y6 e+ Z% w. V& k for(j=0;j<=250;j++)) q3 J8 {# P6 C4 ^1 f6 h
;1 Y6 V( t& |' {0 z: O
}
' @+ K; \( N; n1 N- i# I ]void read_busy()8 B1 r- D' c& w
{3 }* Z7 @/ d* _! I7 u# z1 ^2 M
char read_data=0; . Z# ~9 f- u; ~# _
char num=0;
' L# G1 L+ \0 S3 s6 Q. F! b) @% C P2OUT|=BIT0 ; //CS=1; ) j) S' P, k( y7 n; W8 T
P2OUT|=BIT5; //sck=1;, `) I* p# r$ F* S( K
_NOP();
+ u! O: G- U' E4 z P2OUT&=~BIT0 ; //CS=0;
* I' H' T2 i, W, I write_byte(0x05); // read the SR1
) h, l0 S' t' Z! Q- n3 k do{9 v; Y5 m2 w$ T
4 S( L0 W; w( `. K5 N
for(num=0;num<8;num++)- g: l Z! P, f0 b6 e' g: |& r
{
! j% J5 N2 C1 X; M* A8 Y$ ]7 D P2OUT|=BIT5; //sck=1; ( _0 Y4 l, D4 @8 w. d
_NOP();
2 t5 Y' P: \" m& e0 }. V4 Z% x* S _NOP();- J) c( K/ t# w6 S9 y. D0 \
_NOP();
1 f! _: I6 B! x) n _NOP();
. q+ C! F, Y1 o: Y2 O P2OUT&=~BIT5; //sck=0; 1 A6 }7 _) s+ K* Y
if(P4IN&0x02)" i: O2 V" l- F) M8 |9 C0 R- L$ e
read_data|=0x01;
b" S4 `# q" P1 W5 a1 w else x/ e. y; }: Z6 b# _' d% K* r+ [
read_data&=0xfe;
3 X6 U% K" b2 A* E read_data<<=1;
o% E% T$ {$ n9 t4 s. D9 @# R }
2 r L" z2 _! \0 s6 M _NOP();0 [7 b3 j( B5 l* `- i: n8 Z
_NOP();
3 X7 q/ w& ^- f1 g K4 ? _NOP(); 8 z/ }% E1 `) s9 m. B# E3 y
busy_data=read_data;
; K* W1 x4 ^( s2 u1 y% A! x- E }# b; u8 Z% `* P5 x) F7 p9 S& I
while((busy_data&0x03)!=0x02);
$ G# Z, N! E8 ~2 \3 b' w# E P2OUT|=BIT0 ; //CS=1;
7 v, a. W1 H0 }6 r7 e- q. b# t( e 0 ]' G6 F6 w; i. }' R4 R( u+ p
0 x2 u. _5 r" @- E4 Z$ K" I}
+ O+ a( b. ?# ]
5 Q, W- ^" C5 Y用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!0 k, u- x/ _5 ]1 |7 f
! k ?1 g) e6 m! _/ J& H f0 _ |
|