EDA365电子工程师网
标题:
msp430 模拟spi实现对flash的读写
[打印本页]
作者:
hefuzhang
时间:
2017-5-31 21:37
标题:
msp430 模拟spi实现对flash的读写
#include <msp430.h>
! ^0 x. b% [7 N# E6 Y) q- l* Q
char readdata=0;
+ ?' c# U9 k, D7 e+ x
char busy_data=0;
; P8 K8 S" C3 j
void write_byte(char data_byte);
- H$ N5 r, {; {+ \5 F# ^% n0 s2 {
void send_command(char address1,char address2, char address3,char data);// command and address and data
' X" E* x4 { d! s l0 j+ Y
char recive_data(char read_address1, char read_address2,char read_address3);
% l1 u7 W% O2 P7 W3 G
void delay();
4 {3 h5 u1 p5 h; [ |, U$ V
void erase(char command,char erase_address1,char erase_address2,char erase_address3);
( g& U4 G9 Y' a4 c6 v
void read_busy(void);
% w4 T4 o2 A" y3 y
int main( void )
. E9 `3 S& h+ U; z4 |
{
: z8 W* d9 H0 ^3 h6 A
// Stop watchdog timer to prevent time out reset
6 J, R3 q3 W. r! m' Y
4 P; w% d0 J& }+ ]
WDTCTL = WDTPW + WDTHOLD;
$ Y3 ?; X* v. {5 v0 x: v l
P2DIR|=BIT5+BIT4+BIT0; //flsah sck hold cs out
- k2 J8 B( r9 `" S% {; D
P4DIR|=BIT2+BIT3; //flash wp si output
9 G3 [9 t0 C" J7 N4 Q: N0 H; V
( D0 w# R5 _' L7 N4 x2 L
P4REN|=BIT1; // so pull up
5 c+ {$ ?1 m2 _* p
P4OUT|=BIT1; //flash so pullup selected p4.1
2 a1 i9 o) E) m( P
P4OUT|=BIT2; //wp=1
7 Q5 t2 U" C$ N3 ~- W- z8 H4 t
0 r* l* B. ^* f) Y2 z% }
P6DIR=BIT4;
9 F, N/ h5 X2 k3 i9 M& c) x
P6OUT=BIT4; //led
: L) Z. }8 i) P. U
P2OUT|=BIT0 ; //CS=1;
: U# E' h! r) ~8 ]. V
P2OUT|=BIT5; //sck=1;
. j; F& |* U; T* O+ J& R! J/ O
//P2OUT|=BIT4; // hold =1
$ L+ `9 ^/ V' v+ i& v
_NOP();
( X8 U! o- @% \
_NOP();
. {) B- A* B/ K6 e f3 F/ i
P6OUT^=BIT4;
$ n; z2 Y# ~8 n$ m
erase(0x20,0x00,0x00,0x00);
4 T& z# E4 ]! K' }' z# C2 y0 B
read_busy();
% y4 ]* Y$ k& `6 \$ T& ?2 @
send_command(0x00,0x01,0x01,0x00); //xie,mingling
3 E0 `& Z1 f: k6 ~4 J8 W
read_busy();
6 u7 _" Q7 ]( l$ P
readdata=recive_data(0x00,0x01,0x01);
4 s4 M( Z1 m w: P
while(1)
, z* o( h8 l1 U, i9 {. N
{
: X: }) m3 x! j0 g$ z
// send_command(0x00,0x00,0x00,0x0f); //xie,mingling
9 @( Q2 a# l2 Y8 M
1 x# y E6 A; I' N% p8 q6 P
// if(readdata==0x00)
3 z; J: f" K/ S+ j* @
P6OUT^=BIT4;
4 H) D6 H E4 P
delay();
6 r# d; C# v7 x) h
// readdata=recive_data(0x00,0x01,0x01);
9 N' E6 [+ l& B9 a; a# R9 q6 d* p
}
" }! t0 h7 n1 C" [$ a' N! c+ b
+ K: g" Y: N4 M8 K" m
}
/ b3 t b/ r# U( N
void write_byte(char data_byte)
% P [7 }% I" X: g6 r! G5 Y
{
& D# a- I" Z h
char num=0;
i6 a) q( n- L' t9 u
for(num=0;num<=7;num++)
0 m7 {! R& j! n# s
{
7 o6 Z! h. ^. o2 K+ Q9 r
3 h1 l, K2 ~* u0 @7 w1 c/ k r1 ?
if(data_byte&0x80)
* _5 \% J* v6 d. @; L7 U
P4OUT|=BIT3 ; //si=1;
( k$ k9 D- ~( `7 b- R: r* @
else
0 t- L, i0 S& G. _
P4OUT&=~BIT3; //si=0;
0 |: i- p) o* K* R$ o+ x+ {, i
P2OUT&=~BIT5; //sck=0;
6 P8 S' j; F7 q/ }; X8 X+ b: V
_NOP();
3 k- D" a3 F, V" O! J
_NOP();
! o" j8 h- z6 `( v4 I F8 u' d2 @ u
_NOP();
4 {: [- k! o3 H& q
_NOP();
' x& f3 ]2 e/ L; Q0 V& N5 [
data_byte=data_byte<<1; //数据从高位传输
" u. K6 C+ }) y4 Z* w
P2OUT|=BIT5; //sck=1;
5 i' T V3 V$ p3 b% D3 m
8 M7 m7 V! K3 D& Q1 D
8 y* ~, k8 _5 f- I
}
( C) C: t# p4 a
}
5 `5 u9 y: p; W* f5 W4 Y1 j
void send_command(char address1, char address2 ,char address3 ,char data)
* R' c8 K% t& h
{
) I+ \$ t! }( p# Y4 x& v* w
P2OUT|=BIT0 ; //CS=1;
7 X9 u1 H. i* s, P/ {
P2OUT|=BIT5; //sck=1;
4 G* M4 {' ]; D
_NOP();
) B/ ?( i* W+ o$ o
P2OUT&=~BIT0 ; //CS=0;
/ l0 a1 p. E1 o2 R
write_byte(0x06); // write command
3 Z( u! K; b( x% i, k( R" i& F* G
write_byte(address1);
& p+ P* }) Y, n, c x( m1 M+ I
write_byte(address2);
6 P, p9 q- Y8 d- V' {: I- f- G
write_byte(address3);
' C+ _2 V: j; ^- j
write_byte(data);
$ u8 l& v! q; ^. ~ B
P2OUT|=BIT0 ; //CS=1;
0 ]8 o% R1 ~+ s$ P. _) h
_NOP();
& O# f2 s* v2 ?: s
_NOP();
7 E; x2 f9 | \( Q1 ` q% A( U
_NOP();
) n* f5 e# v5 E; y9 l% q
}
; h2 F: W5 m w7 o( n, W
, ]& H+ c- j+ \7 ~4 T0 y# q4 W6 L
char recive_data(char read_address1,char read_address2, char read_address3)
1 n1 {* }$ R! R2 |
{
$ M+ \1 ~! {9 _' K/ z
char read_data=0;
2 c8 p: s+ Z9 y! [' ~* I+ K- _/ D
char num=0;
) ]9 I# y$ U u {7 ]
3 k# W4 x: ?. F) V6 {# [
P2OUT|=BIT0 ; //CS=1;
% j" T) G7 S, C" T& G( j
P2OUT|=BIT5; //sck=1;
& l8 R$ a; J# B( g: P
_NOP();
! W/ o& n. ?- M" U2 L5 L# _! ]
P2OUT&=~BIT0 ; //CS=0;
7 X/ @" o9 L0 y! R4 }# B
write_byte(0x03);
! ?$ q4 `; ~, a1 S: O
write_byte(read_address1);
; ^. J: y& g2 d: f, ], s* W
write_byte(read_address2);
: V! ?. y6 y/ S9 v% B! K' A
write_byte(read_address3);
" ?# M8 N5 h: ~) X" T- k' _ \
* m' A* \. E4 q, D6 q8 E, I3 E1 L
for(num=0;num<8;num++)
k8 c+ R4 j5 q+ V8 c
{
1 ^0 g* B4 x& d' H3 W1 } ?. q
P2OUT|=BIT5; //sck=1;
4 w2 f6 _" s2 N& q; W% p4 E8 U
read_data<<=1;
' r# T/ T, ~' M, D
_NOP();
% t9 _; f: q. e5 [7 f
_NOP();
/ B6 g# V. D) e
_NOP();
" }6 d1 s: c* t2 z |( }6 G
_NOP();
4 C5 i2 T, q' `
P2OUT&=~BIT5; //sck=0;
6 _% c! W3 q4 O3 w
if(P4IN&0x02)
/ v* [( E: V k( ~7 I
read_data|=0x01;
& {" z$ R: h+ {0 P
else
# W1 u/ O% g: _( J. E3 z
read_data&=0xfe;
! e) k2 o# e. v/ f6 r) C% s
_NOP();
/ ]5 p" R. V$ _* S2 m
_NOP();
- {9 o( x0 O' [- f+ w
}
7 `, b6 x/ {; @5 o$ i7 m# m
P2OUT|=BIT0 ; //CS=1;
' ~9 E$ q7 ~# O3 p$ b: H P
_NOP();
% u7 l) G' k1 Q; L3 K9 Q' C+ W+ P- F
_NOP();
; \+ l# w$ X$ O5 X- n
_NOP();
9 ]$ a& i1 Z4 |4 g5 `* t# `( m
return read_data;
+ e `, D) _; }4 D
. X# l: b8 j+ b- e- u6 n
7 p2 q6 o$ ?3 [- s1 c
}
; S' M7 T; P. ?% C
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
6 R* O5 Z$ w7 o" t
{
/ H& K( o3 |3 f; W7 r6 y
P2OUT|=BIT0 ; //CS=1;
$ U% b K$ e0 v: @, n9 d5 x1 j
P2OUT|=BIT5; //sck=1;
$ @" ^ f( o6 e& Z) Y) @
_NOP();
Y! d, U: Q( C2 ]
P2OUT&=~BIT0 ; //CS=0;
: S/ w0 z5 y& k! X$ j K. j
write_byte(0x06);
! G& d# a6 U# ]9 d+ `& j
write_byte(command);
, x3 L( S8 o+ X( [ S9 C
write_byte(erase_address1);
. P' j) Q4 u, [
write_byte(erase_address2);
; [: k+ t* |$ g' P
write_byte(erase_address3);
$ z; I) h. N7 w& w% b% o+ m% a
P2OUT|=BIT0 ; //CS=1;
4 _1 u, `2 K, q4 |! M
_NOP();
5 n! s$ ^- Z( T7 @ T7 e. C
_NOP();
$ F; U- _- j/ }, k
_NOP();
& z* ]4 H/ ~- c7 y @
}
4 _5 }) ]3 D% p; X( x7 ?8 [, }
void delay()
f6 f2 z/ A0 z0 c3 k
{
7 H& ^4 l3 K# \2 s9 F& s8 M$ ]
unsigned int i=0;
" `6 x2 ~# d2 p6 G: @/ P
unsigned int j=0;
+ K6 {- W$ Q' S4 w5 W9 y
for(i=0;i<=500;i++)
& }; N( h% Z' F! I
for(j=0;j<=250;j++)
: [ n3 w: t8 I9 M2 S# Q' A
;
& z( q0 }0 E& j
}
! K/ E' d4 X+ V3 k- p" [
void read_busy()
5 W5 l" M5 W8 w( |
{
* t/ Y) k$ }# u! E4 |( a9 e# M
char read_data=0;
5 G1 F* h/ n, |/ I" t3 f
char num=0;
1 H: R8 Q' f: V5 `; n& _! K1 ?
P2OUT|=BIT0 ; //CS=1;
1 l. P5 V4 t/ G$ j) d6 c
P2OUT|=BIT5; //sck=1;
9 ?& L |2 U7 c( _
_NOP();
- {+ x' ~) N. C2 }- n5 Z$ B# P
P2OUT&=~BIT0 ; //CS=0;
( C$ y$ d9 Y1 B: E3 C" F9 T
write_byte(0x05); // read the SR1
& D" I6 |, W. Z
do{
/ [9 j& k- B. p K! w% D. G
* Y: d8 Z. S, `* x4 F
for(num=0;num<8;num++)
( t, I! G1 e* X7 W9 T8 G
{
1 v3 p% _1 ^. @; C$ R# R
P2OUT|=BIT5; //sck=1;
5 U! D4 s% ?6 D) Z( c A- T' K
_NOP();
# e; h t( i4 i
_NOP();
; a- Z P8 Q; U) Z7 @: }% L( p( B
_NOP();
5 t I* D+ l/ ^. Q' j3 m4 ]" I
_NOP();
8 n6 d" h9 ]' d# k. N, _
P2OUT&=~BIT5; //sck=0;
2 B P5 M( X2 E) X( l9 e
if(P4IN&0x02)
# m5 ?, t8 I! W T, y, e ^& M
read_data|=0x01;
2 B2 t/ _2 X1 P9 z
else
( z$ U% |0 o! s
read_data&=0xfe;
7 u7 ~7 m0 F; `
read_data<<=1;
( v' y$ A# W1 v3 Z% g0 i3 e
}
2 \- ?- s3 m4 H" h
_NOP();
- ]: j0 g, E+ m, l. l) h2 a3 n
_NOP();
* C2 @/ ]$ I+ B0 b' J O
_NOP();
5 o1 r% } ~( v5 Y
busy_data=read_data;
4 O, l$ Q# [& e( j1 Z, M' T/ r, W5 |
}
/ A! |, f5 R# Y
while((busy_data&0x03)!=0x02);
+ K7 `9 x5 p! J. F' d4 K/ T" j
P2OUT|=BIT0 ; //CS=1;
0 v' [( e ?3 E5 S* F/ |& ~7 p1 z
2 u9 B# B( H9 M3 _
- K" N/ j7 ^8 o5 x! U
}
2 h2 Q3 _) _) F
/ `$ x6 u4 n/ S3 j9 K1 D
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
2 k0 l) f4 d; h5 r
4 n9 L2 p/ C9 h& x9 O8 H
欢迎光临 EDA365电子工程师网 (https://bbs.elecnest.cn/)
Powered by Discuz! X3.2