EDA365电子工程师网
标题:
msp430 模拟spi实现对flash的读写
[打印本页]
作者:
hefuzhang
时间:
2017-5-31 21:37
标题:
msp430 模拟spi实现对flash的读写
#include <msp430.h>
1 J9 b; K7 L' y( p. K% ~
char readdata=0;
0 u- u+ o; J7 U" ?# f
char busy_data=0;
0 \. A' O6 s! t
void write_byte(char data_byte);
8 x& D' \. _, `9 Z
void send_command(char address1,char address2, char address3,char data);// command and address and data
4 Z, B Q& L6 G7 ~6 ?( _( Y
char recive_data(char read_address1, char read_address2,char read_address3);
$ H2 l2 `5 _- h/ r6 t
void delay();
' l4 O3 A% l. p, s2 c
void erase(char command,char erase_address1,char erase_address2,char erase_address3);
% H" Z7 ]: i" Y7 w
void read_busy(void);
' U4 h7 u7 q3 s% y
int main( void )
, o* H* a+ [4 W2 x# [0 C0 `
{
, d( n- ]1 j6 S' z9 p0 Q
// Stop watchdog timer to prevent time out reset
6 V- O( c: M9 G$ W$ N( ?/ i
2 ~- l$ h' p0 l, M4 T. R
WDTCTL = WDTPW + WDTHOLD;
, B9 c3 S3 }# B% w+ ~0 H& Z- R
P2DIR|=BIT5+BIT4+BIT0; //flsah sck hold cs out
c. t) V, z x) K% g. ^4 M
P4DIR|=BIT2+BIT3; //flash wp si output
$ J* T* C1 F+ v8 y5 \* C+ i9 J
0 s6 k$ O: T% E( b7 q" a
P4REN|=BIT1; // so pull up
: E+ W& E. `* v) i* p/ T
P4OUT|=BIT1; //flash so pullup selected p4.1
& X* Z1 V# |3 }+ @3 a3 ?
P4OUT|=BIT2; //wp=1
0 o q, M; S0 z. j
5 o" B$ \. N: K, A. J: z, k. B* L3 p
P6DIR=BIT4;
5 S* S" l2 \) ]7 B+ q
P6OUT=BIT4; //led
# B$ g8 V1 ^7 y* z$ C
P2OUT|=BIT0 ; //CS=1;
9 [' Y" U& V# L$ `( ]5 h* u# C& b
P2OUT|=BIT5; //sck=1;
+ B- Y9 V: ^% o. e' [5 z% ^
//P2OUT|=BIT4; // hold =1
9 r2 `/ ~, Q% T2 z
_NOP();
: L" K" q( Q3 b8 g6 A2 H# [8 R
_NOP();
1 I- h+ U: b c$ m
P6OUT^=BIT4;
' a4 D8 l0 Y: U
erase(0x20,0x00,0x00,0x00);
9 e" _- W/ Q" I4 \6 d- w6 v
read_busy();
5 y) N9 r2 J! C' S( R
send_command(0x00,0x01,0x01,0x00); //xie,mingling
$ e, F/ u R N8 J5 |/ f
read_busy();
) b% ~ d, O& M/ ~! i
readdata=recive_data(0x00,0x01,0x01);
# n2 N6 {' `7 b" D+ e7 J+ n- D% _- F
while(1)
% K2 e3 X2 ?1 p$ e: p0 d
{
$ n; p* a" x6 O6 _
// send_command(0x00,0x00,0x00,0x0f); //xie,mingling
2 i2 J/ A5 u6 e9 }2 {
9 q u1 D, G$ p* k) Y& y1 f! c
// if(readdata==0x00)
5 k' g" ?7 f# w7 }" v* P% A2 c
P6OUT^=BIT4;
- Q! G$ Z" W6 Q6 O; ]8 F
delay();
! m' J' K! f3 \6 d; a7 G0 K" F% C
// readdata=recive_data(0x00,0x01,0x01);
) _( y0 ^' m" F- E
}
) O4 v6 A: T3 w
5 R9 N5 `/ A2 X$ a Z- D0 y3 Z
}
. U) e0 v. g* Y" f1 k- ?
void write_byte(char data_byte)
) R4 e: b4 @' s0 e3 N$ Q" A1 M
{
6 r/ @( k) O) Z+ `3 p4 y4 K
char num=0;
9 F9 e \) l; K2 Y& Y) A' c
for(num=0;num<=7;num++)
* x3 J5 O! f4 Z/ F; o! O+ v& ~, C
{
8 o Z" u# [$ [
* q+ T/ S$ {3 Y3 L& W2 P! }
if(data_byte&0x80)
% O4 x+ ~, {2 R
P4OUT|=BIT3 ; //si=1;
8 m1 B9 d6 q7 O, G0 F* r5 v5 J: f, B$ b
else
1 U, x, K) g- c% O+ L
P4OUT&=~BIT3; //si=0;
& Y W7 u5 P1 E- d6 x% Z
P2OUT&=~BIT5; //sck=0;
1 \' o: h3 V: ~) w5 ~1 ~
_NOP();
6 s9 x. W+ ] O! p. j: }' d
_NOP();
5 w( X7 i* i' W* U0 s" z
_NOP();
/ i' b6 ]' k, @! s: ]
_NOP();
3 N5 G$ Q5 J1 ?8 b) T6 [- j1 b" i
data_byte=data_byte<<1; //数据从高位传输
9 f7 |" n7 ?; T: i# m
P2OUT|=BIT5; //sck=1;
+ ~. Q+ E3 s- G. b* C& M8 w
3 S, P0 {. g+ l u. G
8 S$ ?, m5 L0 X& y( g
}
" h( D1 ?' d8 [& h+ L! n" Z- r
}
' ?4 u+ ~3 ^! o3 Z! y. l
void send_command(char address1, char address2 ,char address3 ,char data)
/ q5 n/ O) N: a1 V
{
; ~8 n% [/ Z% x7 V3 H7 H1 Q" a
P2OUT|=BIT0 ; //CS=1;
, V( E: w) Y" d6 y: d
P2OUT|=BIT5; //sck=1;
% G8 I3 m, Y. s8 z8 H
_NOP();
2 m' M, \! Y, O; h( U
P2OUT&=~BIT0 ; //CS=0;
8 f6 f9 d: T: I, l
write_byte(0x06); // write command
+ h5 q: Y Y) z6 ]
write_byte(address1);
( m6 C9 h: n+ w$ N5 q/ o
write_byte(address2);
l# P! w$ f; V: Y) U j& i
write_byte(address3);
- p6 Y6 {% l2 n7 w( R7 L+ Q1 F
write_byte(data);
* M ]4 y; m5 w, Y
P2OUT|=BIT0 ; //CS=1;
5 ?% i! W1 Y$ v: M& A
_NOP();
6 y( K5 Z ~) v8 n
_NOP();
/ h, t* V6 g$ r! k2 V5 D) k+ { Z
_NOP();
0 t& ^0 n6 O9 P9 i
}
7 k" o& H$ `* |
& o% u! l3 A p/ i! c, f5 V
char recive_data(char read_address1,char read_address2, char read_address3)
" g; d4 [+ L9 }0 v" R4 d d* e
{
1 w2 K7 w! M' H; z* S9 {# R; ]
char read_data=0;
& C9 [; E5 E1 K3 L3 M: E
char num=0;
" ]1 N$ ]+ T/ G `9 s, i7 i8 \
+ o, a8 L1 {0 s: l9 {# |
P2OUT|=BIT0 ; //CS=1;
7 w# n$ P: _! T, J4 y) a
P2OUT|=BIT5; //sck=1;
+ |3 n; ~1 e5 M+ K9 V7 G
_NOP();
: B6 B; C! x- I1 f! S: `6 Q
P2OUT&=~BIT0 ; //CS=0;
7 p" @5 l; Z. q) b6 s
write_byte(0x03);
% R" {! j- P: a/ a! ^" c
write_byte(read_address1);
! T8 V, o: f& t; p2 D: E
write_byte(read_address2);
6 \& a( S9 n3 A5 i' M! T/ R
write_byte(read_address3);
' d: U% e: m( a! h. b( N
, P- Q7 g$ R! {/ b9 g; w
for(num=0;num<8;num++)
4 S7 X! U5 I1 u! k% p1 y7 g! s# G
{
$ e& X; l' r, T0 C7 a2 {) O; L
P2OUT|=BIT5; //sck=1;
" L) {. T; t% W4 F
read_data<<=1;
% s2 D" _% i1 D7 z
_NOP();
3 W% R) B# r/ a
_NOP();
* T, L9 V1 a0 }1 x' H
_NOP();
- m0 X9 H m2 e* u& i R
_NOP();
* f }; r# |, F, q% u" B
P2OUT&=~BIT5; //sck=0;
0 Y1 f0 R* ~! ]
if(P4IN&0x02)
5 c5 _8 ?$ s% c' ^0 F- r' P% c( G8 o
read_data|=0x01;
7 A) a7 O( ^2 h' b: g; L1 Y
else
8 C" `( O+ ]9 K% w( |; m
read_data&=0xfe;
2 A8 ?1 h' d8 C \2 D2 J
_NOP();
0 t. j" u. V& R3 I7 L/ \+ @
_NOP();
* N6 i- _" j3 O$ s+ k
}
: `! A# |- [5 F7 p$ i3 S
P2OUT|=BIT0 ; //CS=1;
: l- V* Z& m5 M! q5 `
_NOP();
9 G; ^/ O8 f# V+ U/ q; C
_NOP();
- T- w k' Y. [! z0 C2 t& r
_NOP();
; J, j. s/ |$ C; S. c/ w0 p: Q
return read_data;
% @( G3 G) `! W2 |; ]) c
4 U; K3 C) v8 Y& U+ b
7 N( n- W0 [9 M3 Y# a
}
0 g0 X p( k# O
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
' Q$ m7 Q& m9 Z4 O
{
9 s2 x% w+ _" I O
P2OUT|=BIT0 ; //CS=1;
, |0 D8 Q3 O. Q& f9 M" x
P2OUT|=BIT5; //sck=1;
* z4 _9 M, s0 w' B" d
_NOP();
Z G9 e8 n5 j$ T, D. ? X
P2OUT&=~BIT0 ; //CS=0;
. X) q# K c' G& _1 e
write_byte(0x06);
2 n* k9 Z) E+ L0 r
write_byte(command);
9 A, ?( Q( Q0 j8 s
write_byte(erase_address1);
( W+ r/ P+ i' D
write_byte(erase_address2);
. \$ x, s8 C' l" k9 q1 B' x
write_byte(erase_address3);
1 }5 ?3 j" q/ r# v) G, L6 c9 S+ A# F
P2OUT|=BIT0 ; //CS=1;
# ], J, R% A' B1 z( W' l3 u
_NOP();
1 t( e+ _) z5 O- X( V- h" e6 ?
_NOP();
4 O: ?' L. ~! A. ?. B* F ]
_NOP();
# k7 P. q& ^, l
}
5 l+ ?; r9 k* j9 p' I ^
void delay()
% i* z& B# @" S* M5 _. l8 `5 @4 d' V0 \
{
7 |0 h/ r: j) I+ q
unsigned int i=0;
. X9 E: h4 `0 @
unsigned int j=0;
. z/ Q" ?) e0 z& w3 B
for(i=0;i<=500;i++)
1 T, v8 \# n! a1 l! `
for(j=0;j<=250;j++)
: b4 s) ?% }- p% g$ F
;
; F2 ~* P' E: b8 E8 ?9 C
}
: b/ w; g: w, J) Q
void read_busy()
7 F+ m2 Q# b) t! X) G
{
2 G2 x8 c8 ~4 ~: X# o
char read_data=0;
/ W& F/ t& `* C3 b
char num=0;
/ o" |. [6 N5 [. ?1 S' f/ [4 `
P2OUT|=BIT0 ; //CS=1;
" E1 V1 P! j8 _5 F2 q2 w$ C E
P2OUT|=BIT5; //sck=1;
3 d) y' u/ |$ f$ k8 |3 ?+ R; {
_NOP();
% `2 C7 @5 N2 `
P2OUT&=~BIT0 ; //CS=0;
3 R2 g/ n; S0 H
write_byte(0x05); // read the SR1
0 M; P" q8 j8 X
do{
6 B. h1 i- _% q/ }
) H. B. P2 s8 K3 S; T4 `
for(num=0;num<8;num++)
" k' J: Q7 F" o9 n& N8 P
{
% w( [4 S; m3 q; H2 C! l: a
P2OUT|=BIT5; //sck=1;
8 U0 ]7 j8 L+ ~' P# i& k; \
_NOP();
7 P9 _" S; Z" _5 B& H: ^
_NOP();
+ N1 a* P1 C& p6 K* W+ I
_NOP();
% e5 g3 g- |# z- B9 F
_NOP();
* D. C3 O r, [' j4 p. V
P2OUT&=~BIT5; //sck=0;
' d( T( T" E7 ]
if(P4IN&0x02)
2 `8 F; B* e @! t1 r6 Y
read_data|=0x01;
" d ?' T: c& O- z( G+ d" w) m# |
else
, A8 J( G2 L" D4 W, j# G
read_data&=0xfe;
. |! H# K( V% k# L1 V
read_data<<=1;
: G" a/ I& u6 J" k( M; h x
}
8 v+ I$ Z: e/ s" S9 g; d* R
_NOP();
* `1 A! o6 J5 H. o5 C# t4 O
_NOP();
% l, @8 X" w, ]+ B6 E
_NOP();
+ f3 t- v; _3 Y5 } E0 ?' X5 l
busy_data=read_data;
# J% X" }( J- o# e6 O% F
}
3 }$ w+ i; U }3 Q4 `
while((busy_data&0x03)!=0x02);
4 T$ p( z0 v2 S
P2OUT|=BIT0 ; //CS=1;
0 C. L; Q% R" T
8 A5 w2 E( m0 X6 }
/ V/ b2 V ~! Z' K* D/ C7 S
}
, m) [3 C4 ~% `: {3 ?# {
: M5 f" Y6 G- ]" c% T `
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
/ a4 l% ?) ^7 n W
4 p' G. l, S+ G* Q
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2