找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 73|回复: 0
打印 上一主题 下一主题

msp430 模拟spi实现对flash的读写

[复制链接]

22

主题

70

帖子

449

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
449
跳转到指定楼层
1#
发表于 2017-5-31 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
#include <msp430.h>" a+ V4 d8 k3 b1 q6 K% [
char readdata=0;
, e& P; i. K0 u  E1 lchar busy_data=0;
' S# t" e' R, wvoid write_byte(char data_byte);
9 L" A1 Z5 {& D  g2 Cvoid send_command(char address1,char address2, char address3,char data);// command and address and data
% D  G. }0 s  Y- Lchar recive_data(char read_address1, char read_address2,char read_address3);% Z8 _: \& d8 G( U; v
void delay();
" ^4 c: R0 K. R  g* [void erase(char command,char erase_address1,char erase_address2,char erase_address3);) ?: {- ?7 E4 c, x
void read_busy(void);! [9 I0 O+ c0 K) k3 J5 V9 `' x
int main( void )4 W( o5 `* j! a" I! U/ z
{+ G9 S; X* B( Z3 b1 F
  // Stop watchdog timer to prevent time out reset) |3 f9 r$ A1 f7 Y/ c1 g6 `
    ) r* M' ]( z0 ]. Q7 X' ]- u8 z
    WDTCTL = WDTPW + WDTHOLD;
/ U5 q  w7 h  m; o8 N    P2DIR|=BIT5+BIT4+BIT0;         //flsah sck hold cs out
! d* W( C: A+ W% K    P4DIR|=BIT2+BIT3;   //flash  wp si output8 H" G: v5 _) g) b: u% J
   / H; M# B) E, k9 [3 H' x
    P4REN|=BIT1;            // so pull up( R; c( Y. h5 \5 h- a8 F) V& Z& f
    P4OUT|=BIT1;             //flash so pullup  selected p4.1; N: \, c7 e9 W/ O' D4 c" P  _
    P4OUT|=BIT2;             //wp=1
$ P1 Q: x1 M, b; t% Z( w& T   
* ^3 E, T+ j5 C3 C" u0 G% S4 z    P6DIR=BIT4;4 Y( X# l! V; C, A' {
    P6OUT=BIT4;            //led" R) Z: t5 R$ U" ]9 H# B
    P2OUT|=BIT0 ; //CS=1;  : h; L$ i; P. s7 M! B4 J
    P2OUT|=BIT5;  //sck=1;
( L: a, u4 p. k) `    //P2OUT|=BIT4;  // hold =1
0 W; S+ U! V  y, o+ U    _NOP();% X# h$ L  y4 N$ Y- `
    _NOP();
5 e, ]9 C2 J9 `0 H1 o6 q, S    P6OUT^=BIT4;
  L+ F( J" I1 d# v7 H    erase(0x20,0x00,0x00,0x00);      
8 V2 n, v0 Q/ p8 `/ b! r    read_busy();   
7 Y' y* d( @0 d- W    send_command(0x00,0x01,0x01,0x00); //xie,mingling         
$ M1 M. p, I# p    read_busy();  & U. b8 M( d: O, E4 H
     readdata=recive_data(0x00,0x01,0x01);   
4 h& x$ w# S- J; d: {. M* G6 ?( a    while(1)* i% K9 r3 N4 _: l
    {
* S# D( g; ]+ A/ G) Z3 u9 \# Y2 h9 E     //  send_command(0x00,0x00,0x00,0x0f); //xie,mingling
/ l2 W- R# q: e5 k! |7 G+ s, s& y           
" p" A! w" l) f  q/ c      // if(readdata==0x00)
. b4 d' ]4 @. E  R       P6OUT^=BIT4;& d& }+ r! Y# X9 s
       delay();
# e1 p. g0 B: I    //  readdata=recive_data(0x00,0x01,0x01);  3 ^: u' H& l3 M+ U
    }/ n" p7 {- r9 H+ u5 B# v
  
7 r/ ^! O! m1 m! g7 Y0 I7 A}) g3 u" y5 G3 }, Q- k, m+ Y7 u( c) @' P
void write_byte(char data_byte)
2 P( u, B8 m7 o7 }  m" D/ P{
/ M3 H' C' p0 \7 r char num=0;  . ~, h5 {4 C7 j. J) d
for(num=0;num<=7;num++)
: w& `5 d# Y* i' T  t$ f0 d   {
6 B1 [6 p8 R0 x/ F( ]  R  
2 q/ G5 [/ [2 W/ q7 w2 [     if(data_byte&0x80)
+ N  K/ v1 S$ l4 @# a( o4 `  R       P4OUT|=BIT3 ;                //si=1;
8 p! a5 N" ]7 K+ B     else. d7 y9 F! Y: \4 O
       P4OUT&=~BIT3;              //si=0;  
0 {. x/ p0 H9 c8 ?( m  F5 h8 x* B       P2OUT&=~BIT5;             //sck=0;+ F2 z; ]& Y2 R! }
       _NOP();  3 [2 W7 W# M  |. _* D% I: T
       _NOP();2 `: c& U8 c9 p" `: b
       _NOP();2 i6 @1 G9 t3 C! F0 x
       _NOP();3 u1 N7 ]$ _8 c* ^5 E5 B" f; E. ^0 J( _
        data_byte=data_byte<<1; //数据从高位传输  
) y8 R: Y1 @3 r) a6 j' a4 o% D       P2OUT|=BIT5;        //sck=1;   5 a4 i' d3 z) D5 b& m
        , T6 ^# p% A. ?/ K% K4 n
      
# s2 T8 W0 g* ~9 w; X   } . n2 B/ A1 W1 l
}
4 |" T. G! ?* S- Y+ Q% T" K4 ?void send_command(char address1, char address2 ,char address3 ,char data)
* f% h' F0 O8 q7 K" z& _# n! L: D{
$ M3 t% ^6 v2 |+ L  P2OUT|=BIT0 ; //CS=1;  6 r; N" O/ r9 h$ }& C" z: j1 u
  P2OUT|=BIT5;  //sck=1;
) @+ p' B  ]4 V( A  _NOP();
0 ?  g5 B; O; t  P2OUT&=~BIT0 ; //CS=0;
" t; d7 y( R/ w, K  write_byte(0x06);   // write command1 |( N. d& I& ~- j
  write_byte(address1);: y- F/ x$ r$ W& R" Y
  write_byte(address2);
  |+ c; n# P( S( B  write_byte(address3);
' |& n/ |' M9 B3 {( p2 j4 e  write_byte(data);: G" K) x- z9 I# A
  P2OUT|=BIT0 ; //CS=1;
& W2 e6 Y. r, T/ ~8 X' d0 S  _NOP();! K! ]* n5 P+ Q0 r. p& ^( L
  _NOP();
; L: y3 N' X$ {6 g6 Z, C  _NOP();
* R- z) L4 r$ W}: C* }/ E: a' s1 u, O

* f3 W2 d: }1 n% H# Tchar recive_data(char read_address1,char read_address2, char read_address3); x; E6 B4 h- L: t$ w
{
% h( L7 ~% Y4 u   char read_data=0;   / j! T, u8 `. i3 t! ]
   char num=0;
0 x/ M" B# w- j- T5 \* L6 M: R  
( x- K# A8 |$ I0 H6 g% U$ K. h0 w( b7 J  P2OUT|=BIT0 ; //CS=1;  
5 P" m5 Z% T8 s7 `5 I  P2OUT|=BIT5;  //sck=1;/ ^4 x# ~/ \" W9 J
  _NOP();5 @! ^+ Z8 }& ~% {
  P2OUT&=~BIT0 ; //CS=0;
+ D! j+ m, N( p: o: N; P" F5 }  write_byte(0x03);
. B- D4 K/ P; {6 a1 a) g  write_byte(read_address1);  
+ Q4 j( x' N/ ~  J# O' j6 d9 m  write_byte(read_address2);
- {  Q- j( f+ o3 N6 `9 R  write_byte(read_address3); 9 O8 ]) a% v/ w/ ]7 e' a- m
  ) F3 J5 P8 V+ _( |# V) `
  for(num=0;num<8;num++)
/ T" K& d+ b$ `8 n+ j* N" ?   {( n. @) @; {0 y) @# [
     P2OUT|=BIT5;        //sck=1; 3 C6 J( _2 m& k$ t3 C5 u  j. @) l
      read_data<<=1;
8 _4 e6 K5 o7 @      _NOP();
/ m6 C9 y* v' j) [0 G; Y5 E      _NOP();
$ Y4 T, _1 V, c; z2 ^$ W& c3 F5 Q7 W      _NOP();
/ ~3 a' U/ B+ o* z      _NOP(); ' J. d8 o9 K0 X  @/ S" |
      P2OUT&=~BIT5;       //sck=0;
$ S# J2 Z0 o" V1 }& E8 b    if(P4IN&0x02)  j8 d6 @/ l( }" B) }1 c+ l6 Y
       read_data|=0x01;
+ P" B5 l- U" Y' [9 j    else
- R6 J- ~: C: ~: ]& F9 p+ x1 L       read_data&=0xfe;     ' h5 X7 p1 |; {, D- E
      _NOP();
7 c  ]9 A1 R/ K1 E$ t/ W1 c      _NOP();
# j+ A2 A, i  ~! ?/ v) K- G' `     } $ S" I0 s/ I' Q
   P2OUT|=BIT0 ; //CS=1;
) {3 H1 L  I: a3 H" ~; F: {1 z" e; b    _NOP();: A4 }# E7 d5 U5 ~  c: W: k3 U+ {
    _NOP();, U  p% ]4 W- Q8 `# M* M) @
    _NOP();
% Y! _2 T; ?5 I   return read_data;) \; z0 j% }) X
  
. D5 K2 m8 l, _  l; ?   
, T; a' z9 h7 k0 r2 N6 }* T0 J9 B}" M3 {6 W- D7 u, m! i8 p% }& w" P
void erase(char command,char erase_address1,char erase_address2,char erase_address3)
2 f: e1 h: D& N, m: Q: @  Y' X{$ d3 X6 g/ {; r& `! `4 |
  P2OUT|=BIT0 ; //CS=1;  
. Z7 m* u: E0 g  [+ u% ]  P2OUT|=BIT5;  //sck=1;5 D5 }2 W- e; {! [' i! E2 q0 \
  _NOP();
$ W2 @+ G5 k4 R  P2OUT&=~BIT0 ; //CS=0;5 g2 P9 m, _+ s  e/ j0 u7 W
  write_byte(0x06);# x: Q8 _! h$ o2 F; C; s3 c4 P
  write_byte(command);
5 E* S# W/ y  E& t  write_byte(erase_address1);& ?: Q  o( ^- q
  write_byte(erase_address2);. @& I+ I: f3 \& ^5 ^
  write_byte(erase_address3);
! Y1 k+ l% k; j  P2OUT|=BIT0 ; //CS=1;" J% d5 ]3 A) q4 {& r
  _NOP();
* P8 M" w9 V0 R9 E- `" y  _NOP();
0 r2 [- u6 Y" \1 k8 E3 ?1 y+ J; F  _NOP();. d  x: P* @% P2 i0 |
}7 b3 i% W5 o- z: N: E2 l9 q
void delay()* }7 `: S6 F3 z" |* P3 i
{
: x  Q1 M0 [9 Q* l% M unsigned  int i=0;+ {% y* X* P% h4 Q' h$ X3 l0 J9 ], Y
unsigned  int j=0;, a& B1 M3 n& a9 v8 K
   for(i=0;i<=500;i++)# Q. d+ F; ^' w2 Y
      for(j=0;j<=250;j++)
1 B8 k3 T. ^7 U# x/ h" A/ f; w" g        ;
7 [/ j5 I- j& j3 G8 v}# F: {: ]4 s# `
void read_busy()
9 }% v' s6 [% u{
9 e; h4 E8 Y: P% F( {5 {5 ]   char read_data=0;   
8 k# W! A, `( ?; Q" ^+ W7 C0 i   char num=0;( L+ Y) [8 O1 |* K6 [! l
   P2OUT|=BIT0 ; //CS=1;  # b1 ~% ]5 P: Q" ]% `! \& J
   P2OUT|=BIT5;  //sck=1;
! c: v. e* U  p; o. V+ |# t. {   _NOP();7 n7 t: p1 T4 v, @
   P2OUT&=~BIT0 ; //CS=0;
7 o6 m0 h; w& C$ }   write_byte(0x05);        // read the SR1  - E% ^7 L! @; |6 K( b
   do{" I- J0 M8 a# @- Y# d
                  
' p& A, S$ {/ u- `9 s' _# t& t3 V! P            for(num=0;num<8;num++)5 R. q1 {2 S$ S6 J$ U, X/ ^
             {
% G1 ^; [( g4 z! ]6 _               P2OUT|=BIT5;        //sck=1;
5 |/ p2 m' f( F4 Z+ l. Q                _NOP();               
4 r+ N& r/ N2 P4 w) s1 r& l: G% t                _NOP();! u, N! x0 {( {2 C& X' C9 T
                _NOP();4 z( {$ ]9 Z: l. A
                _NOP();
8 }9 W3 G) _0 g% m" f  \                P2OUT&=~BIT5;       //sck=0;              
. n* P6 ]7 j4 Z6 v! f; b                if(P4IN&0x02)
/ c' x7 [0 Y; [1 i: w$ P5 C                 read_data|=0x01;
5 e2 w, _- F$ Z8 I+ G                else
3 n3 B: e/ \4 k& A                 read_data&=0xfe;               
2 m) M. z, s  p9 V6 c. \( C                 read_data<<=1;
% L* o; q& w+ B4 c& G              }
# C! E5 U" z9 p& @            _NOP();
* A1 ^8 Z8 T- U1 `( i; c            _NOP();: v# u0 k* o  a
            _NOP();           & e: C3 J& Z/ `: [
          busy_data=read_data;  ( j* y4 p) `2 O5 O: w3 S. T
     }+ X0 t0 ?! B" p8 ^5 p9 Y
   while((busy_data&0x03)!=0x02);
% |4 b$ F8 W* D, Z0 d" N  P2OUT|=BIT0 ; //CS=1;% R; A0 y% R% {" E3 M. d3 K& r* m. h
   
$ n- {% P" p0 n  4 i8 a) `+ u" [) \- E
}
' c$ L0 Y7 o% n8 T0 G: X& g. T5 K# o" T. `* l! w
用的单片机是msp430f5438A,模拟spi实现对flash程序的读写,现在读出的数据始终是FF,即应该没有写进数据,那位大神开源指点一二!
; u: _) Z+ m( t
" ^# ?/ g" d  a) d4 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2025-4-16 16:30 , Processed in 0.055525 second(s), 32 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表