EDA365电子工程师网
标题:
msp430 模拟spi实现对flash的读写
[打印本页]
作者:
hefuzhang
时间:
2017-5-31 21:37
标题:
msp430 模拟spi实现对flash的读写
#include <msp430.h>
/ j" u5 `( c' t7 p# s. V
char readdata=0;
0 N+ \+ V8 r) h2 h* _- a) `1 q
char busy_data=0;
6 ]( [! B) A! R" f! ^/ K
void write_byte(char data_byte);
/ N7 g, T* d2 X0 ~# t% U
void send_command(char address1,char address2, char address3,char data);// command and address and data
- M1 C& C ^2 G1 [; p( ?, Q
char recive_data(char read_address1, char read_address2,char read_address3);
& d6 o W/ O1 c( |+ l7 M" H7 u) Z
void delay();
8 I. h) P- m% t- s7 D- t3 P8 G+ l
void erase(char command,char erase_address1,char erase_address2,char erase_address3);
/ m% o' `7 k7 e |. f
void read_busy(void);
7 q* Z! d' v( X$ W5 i8 C: x4 j
int main( void )
5 H; _8 o: k% E4 U, g
{
7 X2 D) f: p# |8 h
// Stop watchdog timer to prevent time out reset
( x$ N# S9 @" }; S$ M: u" E
2 k0 m5 R. b1 {; Y' _
WDTCTL = WDTPW + WDTHOLD;
) u( E' ^9 G3 u) n8 K1 A) \) K
P2DIR|=BIT5+BIT4+BIT0; //flsah sck hold cs out
$ }2 O+ m$ P( ~$ v
P4DIR|=BIT2+BIT3; //flash wp si output
) d, o [) X0 M
! @ y g w7 W
P4REN|=BIT1; // so pull up
m- _: A$ B" n( {) `
P4OUT|=BIT1; //flash so pullup selected p4.1
^$ v' f8 m8 V, ^
P4OUT|=BIT2; //wp=1
0 S2 [8 q* `" A1 \$ p- G
' |# q" E. Q2 F9 E- t
P6DIR=BIT4;
/ c- w1 c2 b- D' G9 }% H6 S. e$ ?
P6OUT=BIT4; //led
% B- C7 C6 S6 }# S' a/ U/ x/ n
P2OUT|=BIT0 ; //CS=1;
$ V% U7 f* C) v9 m: m, N# a
P2OUT|=BIT5; //sck=1;
0 d% R) h4 H# T j: }: w2 _
//P2OUT|=BIT4; // hold =1
7 V: ^/ g Q# F+ M5 o, ?
_NOP();
# j- u6 Q" H: h! M
_NOP();
s3 m- A; M! D( J: y* k: A
P6OUT^=BIT4;
$ P( e9 m( q P" [, |, G
erase(0x20,0x00,0x00,0x00);
; h5 Y: _9 l* r K+ T# p- p" U
read_busy();
7 b* S! r( O9 m' Y% i% |) g
send_command(0x00,0x01,0x01,0x00); //xie,mingling
$ q1 {8 T; `4 L* g, x
read_busy();
3 A# |% P' F3 h# i; v
readdata=recive_data(0x00,0x01,0x01);
- i: H+ t$ v. D' J1 V# F; H4 M4 b+ U
while(1)
/ L4 O0 z- i7 J; }7 E
{
6 M8 s4 Y- [/ [. x* a" W7 G% n1 i
// send_command(0x00,0x00,0x00,0x0f); //xie,mingling
! T/ ]3 ^8 J H4 a2 o: K" d
9 D7 f1 O0 |& i* W, l
// if(readdata==0x00)
7 M# D# F; B; Q) ^! C- t
P6OUT^=BIT4;
6 T& M' ?3 s- ~# T# n
delay();
! `, N7 {* k9 ^7 S( C' [; t
// readdata=recive_data(0x00,0x01,0x01);
8 U+ r3 X; K- Y" w
}
W( t8 T- G& {
5 f/ x- B( L$ ?* l
}
9 z# C$ o7 L9 z9 [1 C
void write_byte(char data_byte)
4 i: d6 l2 |% @3 T& M, }% Q4 W
{
5 c- s" Y/ _# P$ {
char num=0;
- H f6 F& |# F2 ]( b
for(num=0;num<=7;num++)
8 n4 e. V( }6 b3 G: C4 C0 d
{
! l( w& H( R9 g4 B% h' ?/ w
, s: r p+ q" m; l. o1 ~# g
if(data_byte&0x80)
2 `2 D+ p) s1 d$ @( o
P4OUT|=BIT3 ; //si=1;
: U& {& c( f* L% Z
else
$ w7 a& c5 Z+ E8 @- b7 [
P4OUT&=~BIT3; //si=0;
3 _, f2 R5 { ^) `
P2OUT&=~BIT5; //sck=0;
0 i/ G8 r( `7 j% X' s4 f' o
_NOP();
( U# z8 A4 G/ b$ i: O8 {$ {" E
_NOP();
2 E( [, D" E. o3 p6 Y& ?: j& n
_NOP();
+ S: S, k) q: c# K, [9 t
_NOP();
9 \" u) B) |( x. |2 I
data_byte=data_byte<<1; //数据从高位传输
- N8 A0 A- X( b7 s1 x& w# p& V
P2OUT|=BIT5; //sck=1;
% Z4 w5 N D# r1 |/ {5 ?
( R1 x2 ?& g' [6 n M8 l! b7 `
1 Q: H' j) ?/ v' L7 O% U, ^
}
& S, c( p5 c; t/ |( t' [+ v. X8 k
}
5 N$ O! X. p! v8 D* b6 z
void send_command(char address1, char address2 ,char address3 ,char data)
! s& ~- [; k& U7 ]& Q& y) [
{
# H) H! P' x- `9 f0 x3 W5 b
P2OUT|=BIT0 ; //CS=1;
5 k1 _8 ?* j3 p1 U# l# z- P
P2OUT|=BIT5; //sck=1;
; D' X" ]- T# s: D4 G' h
_NOP();
- d8 p- J: r2 I" k) Q8 b; q
P2OUT&=~BIT0 ; //CS=0;
+ r9 r7 h$ A$ I' _& P1 @" T
write_byte(0x06); // write command
2 J8 O& J: S G6 c& @0 e
write_byte(address1);
$ `; n% o3 X- a' }- M, j
write_byte(address2);
( Q: t7 @9 |5 O! L1 l
write_byte(address3);
' r8 v) C H# p' U
write_byte(data);
7 f6 E+ }. Q3 O1 ^( v9 {& m
P2OUT|=BIT0 ; //CS=1;
: B/ ^$ E2 p. i
_NOP();
7 a# Z% Z. I- k" B+ ~# `' V
_NOP();
v. |3 M! {: x* n/ w. e$ K! @" h
_NOP();
1 ~+ M/ B/ q+ G7 F( u
}
$ k- j( Y8 t( ]/ I/ |: i
7 Q/ D ]# {, z6 x5 F4 l4 M% f, C
char recive_data(char read_address1,char read_address2, char read_address3)
& x' w& y; k' D" ]6 w
{
7 \ N3 ~% b0 o) {( _1 i
char read_data=0;
$ B) K ~* @0 ^. i4 c
char num=0;
6 h+ {; S8 J+ A. G% B1 Q5 c
0 G/ q- S( Z* @* H9 _4 S, `( [
P2OUT|=BIT0 ; //CS=1;
7 h5 x8 u4 r9 ]3 p5 ` S/ }
P2OUT|=BIT5; //sck=1;
6 E2 M+ E, M4 K
_NOP();
7 S# X+ s: x5 | W" W+ e n. Q
P2OUT&=~BIT0 ; //CS=0;
: n$ U O% P6 @# O# ~
write_byte(0x03);
0 r8 R. o6 F& l5 g K
write_byte(read_address1);
/ Z4 `- L% R% G, F1 h2 R& g; i" T
write_byte(read_address2);
" m) ^' b) t6 C( ]& ~
write_byte(read_address3);
& K( [: b' K c: {" G2 M
( c& d8 o% b! h) p! m8 {
for(num=0;num<8;num++)
V' o6 j& d9 p* X* e! q$ z( P
{
" b! x. s g' A, Z' v
P2OUT|=BIT5; //sck=1;
- B w( E9 v h) E( t
read_data<<=1;
* X2 ]; P$ E/ j& @( D, z
_NOP();
a7 w4 }5 E( J9 Z/ s, m
_NOP();
! Z$ B8 V9 Y# J- W
_NOP();
" @1 ]* M0 u, n+ Z- M1 n A% m
_NOP();
# J( n1 [4 O: b5 J4 C/ c
P2OUT&=~BIT5; //sck=0;
8 t9 Y* x+ v3 X% @
if(P4IN&0x02)
' L |9 }! C3 z* I
read_data|=0x01;
0 X' Z/ W4 d1 W1 C0 i" A4 j
else
3 E6 X: _# m" H3 x
read_data&=0xfe;
" R; {8 T/ }- Q2 _
_NOP();
! o3 L: D/ ~1 x# ^. D; e4 x
_NOP();
- P! h% G8 B7 ]0 ]4 u( O
}
- g/ R" A0 J1 r7 e4 v" R3 @. b
P2OUT|=BIT0 ; //CS=1;
/ G2 r. d8 X/ a% }. ]1 N) r3 K& Y0 S1 ]: R
_NOP();
1 }- d; r$ t; C; Q2 W0 Y
_NOP();
. r; ?3 D; y e. k
_NOP();
3 L; Q" l$ w# y. }
return read_data;
4 Y5 Y8 }8 _1 }* i o! G! S2 S0 \
: t* I6 {6 \4 F; ?6 |; @! q- C
$ @ K" m7 }& m& f9 _% V# O$ u9 }8 R: |
}
, U2 W( u1 D/ d. e
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
2 H( N2 ^! q/ F$ ?: ]
{
$ H! w$ `3 p n+ V
P2OUT|=BIT0 ; //CS=1;
5 O0 j+ R3 n. x+ l( m
P2OUT|=BIT5; //sck=1;
* P* f, O* P1 b# | X
_NOP();
) b7 U( H1 `& @* ~- n
P2OUT&=~BIT0 ; //CS=0;
( F7 Y1 m1 D0 l! p8 n, O
write_byte(0x06);
/ m4 _8 i* W) @5 d/ g( F
write_byte(command);
4 R5 r# B6 S1 i9 R
write_byte(erase_address1);
' [$ p3 u( E t2 j. A
write_byte(erase_address2);
$ Y, E( w8 I! o0 ]# N! M
write_byte(erase_address3);
" f" x: L3 K4 F6 M: `" h
P2OUT|=BIT0 ; //CS=1;
h* \! ~. @# u/ ^# F# ^2 N
_NOP();
% S% o' A& w7 z* h
_NOP();
& X: E/ U# H$ M% j" U7 K- l
_NOP();
! I6 e8 ?. r: d6 `4 q! ?
}
0 q2 y. K/ S+ I' }6 u
void delay()
m9 u) s8 f4 w0 q7 y
{
& e+ b# A( @# ^, L X: w
unsigned int i=0;
5 X3 a+ b, T8 x, x
unsigned int j=0;
4 q$ D8 b; f) b$ j
for(i=0;i<=500;i++)
, A4 f: B& V. G- s
for(j=0;j<=250;j++)
' Z! J9 I. a' k( J5 C
;
$ J6 A( [) S/ }/ |- s
}
8 Y, g. e: O5 b0 i) K
void read_busy()
- q& K: U( e3 I' h
{
6 _# i# h- N4 `* G* z' F; x
char read_data=0;
: s! Z0 [0 }6 y( A. i: R
char num=0;
' L" D. h2 G; q% A, a5 v, K1 R' m
P2OUT|=BIT0 ; //CS=1;
$ }" ?8 |* b1 i" |% |' f& J: r
P2OUT|=BIT5; //sck=1;
* E! o0 X$ e$ @# K, t
_NOP();
. }; b; E7 P( k0 W# r
P2OUT&=~BIT0 ; //CS=0;
% S0 Y8 D2 O/ G0 e2 `4 U" a
write_byte(0x05); // read the SR1
2 ^* _, {3 T& [- q2 _
do{
( a! I3 D/ v' p* g( S) ~
% `1 w F4 @# a' V p
for(num=0;num<8;num++)
7 O5 q6 F, H* N9 u: W
{
5 V+ f# f6 j1 A [% `1 x% ^( b
P2OUT|=BIT5; //sck=1;
/ _6 o; ~1 O. j6 D9 T) h+ J
_NOP();
3 e `/ o6 @ q3 j+ M+ ]" n
_NOP();
7 i4 X. [, k- \7 _
_NOP();
0 N' { O' S8 ~6 s2 l+ a0 U
_NOP();
4 n' ^9 E8 Z# ^& S
P2OUT&=~BIT5; //sck=0;
0 C- f' {7 l A" K
if(P4IN&0x02)
# i' a, e' q x6 b6 U( j. r* @; g
read_data|=0x01;
8 B- K" f, O; ^& Q! S
else
2 p& X! D7 l$ m" ?" E
read_data&=0xfe;
6 \1 U& u, p% L: R2 F- t6 `% w
read_data<<=1;
6 F. d8 T8 y# [6 t6 |! r) \
}
$ N' H& h) u d: r
_NOP();
! k& Z5 Y" I5 c) z! Z9 \6 W
_NOP();
* K" T) @# m) A7 [# M
_NOP();
8 s5 t) v* Q w6 C9 M2 b
busy_data=read_data;
8 V$ }6 d) _9 V2 o
}
) [) p) i7 p" B1 [7 ~8 p
while((busy_data&0x03)!=0x02);
2 g, C2 G# J, S. {
P2OUT|=BIT0 ; //CS=1;
. m/ N) R; Q2 k* X
9 h/ c+ j* _+ _$ d
" o& v7 i" W# M' o
}
0 `1 t8 g4 Y: r' w% d
0 L. u3 H9 T9 P6 Z
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
' a% p. U% D$ b: L/ l
$ ^. v7 i; C9 d& E
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2