你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

铁电模块FM25CL64

[复制链接]
GKoSon 发布时间:2018-8-8 16:13
分享一个代码模块,网上找的一个STM32的SPI2通讯的FM25CL64历程,我自己结合自己的板子改成SPI1很快成功了。1FM25CL64确实简单,通讯和使用都比W25Q64容易8 F2 N) i4 C  v, N1 a
2写之前没有必要擦除 类似EEPROM5 x" @8 C3 A  \3 a
先看我板子原理图8 X) M0 \$ ?: D/ D4 K
QQ截图20180808160614.jpg , B: l. I+ A; z
两个存储设备挂在SPI1上,CS脚铁电就是PA4
5 R* ~# b% O5 ~: r. U2 R1 i; b上代码:$ r2 o7 n6 @  w0 ]
  1. #ifndef __FM25CL64_H_) M+ q) b( j7 ]3 e: q4 e9 }. O6 D
  2. #define __FM25CL64_H_                            ' ~( B7 V/ f0 j
  3. #include "sys.h" . H" H; \4 V$ B" S5 o

  4. : K( D6 Z8 V) i! E: o4 s

  5. ! x2 _" d9 [8 a
  6. #define        FM25CL64_CS                 PAout(4)                  //FM25CL64片选, S8 ?# w2 y2 }- z/ `3 V) u$ `

  7. * h- D9 w% [9 g9 ^* l* H
  8. ////FM25CL64指令定义
    3 W/ b7 j1 B7 b0 ^7 Z" h1 `
  9. #define        FM25CL64_WREN                0x06                //使能# k. @; x9 g2 H: h8 \+ c; {
  10. #define        FM25CL64_WRDI                0x04                //失能) C9 A- f' k4 w% `
  11. #define        FM25CL64_RDSR                0x05                //读状态
    8 h5 }/ _: O: f0 g# i  c2 `3 `/ l
  12. #define        FM25CL64_WRSR                0x01                //写状态
    : y' v. Q' U+ t% F5 }: _
  13. #define        FM25CL64_READ                0x03                //读数据; h( M0 ^8 ?4 y* i3 g' L! R
  14. #define        FM25CL64_WRITE        0x02                //写数据, t7 [2 b. t9 m" S. |
  15. , l6 `* L; R7 l3 U9 w5 b) @
  16. void        fm25cl64_init(void);//初始化
    - i. V1 k+ c: K4 ]( U. X- Q
  17. uint8_t        fm25cl64_read_sr(void);//读状态
    3 I" p6 I; `$ x
  18. void fm25cl4_write_sr(uint8_t        sr);//写状态7 Z3 k" Z4 r; X/ t) q* n
  19. void fm25cl64_write_enable(void);//使能
    # P  |5 J4 q- l. u
  20. void fm25cl64_write_disable(void);//失能( S% V* Z5 F3 s$ T( z
  21. void fm25cl6_read_nbyte(uint8_t        *pbuff,        uint16_t read_addr,        uint16_t read_byte);//连续读取N个字节- J# P/ `3 h. }! G
  22. void fm25cl6_write_nbyte(uint8_t *pbuff, uint16_t write_addr, uint16_t write_byte);//连续写入N个字节
    7 z; D# C$ d7 y$ g/ m% H  U; T
  23. uint8_t fm25cl6_read_1byte(uint16_t read_addr);//读取一个字节
    0 e1 N6 o' B. x# l; P
  24. void fm25cl6_write_1byte(uint16_t write_addr, uint8_t write_data);//写入一个字节
    5 _, u1 R* J% T2 R  L0 z- ^
  25. void fm25cl6_clear_data(uint16_t write_addr, uint8_t len);//清除LEN长度数据
    1 a2 t: m# W. a" a6 A
  26. #endif1 J, B" A1 T  l
  27. * H1 n4 T7 ?1 g2 L) o
  28. & C2 t  I- ?" Z% _

  29. & M, V( H! J! b  e

  30. ) x' Y) a9 J; v

  31. 9 t- H- y! T( u& M3 [
  32. - p6 C2 B" O. o5 ^
  33. * f1 q2 E. ~; s) t. L3 e3 T- c
  34. $ ?8 Y9 n' I! X; T' z
  35. ' n$ t, c) R' w
复制代码
0 ~! u) ^& P- G" {
% {, e2 Z6 i, z* V, x) `) C, l, O& X6 @
  1. #include "fm25cl64.h"
    ! _; d& |9 t& z2 P& Z% {) E5 O: A
  2. #include "spi.h"/ I; X8 Z0 i: u. }: [) i
  3. 3 N, r0 z# v# ]

  4. * ~0 n$ z$ D3 o. m$ V

  5. : J  J! m1 h& g+ X% H3 m' \+ a

  6. # p9 T$ C  E# g& ]; @+ J% @& s
  7. ) a6 J1 a+ d! f7 _: p& v
  8. /*********************************************************************************************************
    8 m6 K" x$ o$ B6 U, x
  9. **函数名称:        void        fm25cl64_init(void)+ e$ H' u1 Q" F: x9 _" A
  10. **函数功能:fm25cl64初始化
    $ G9 O6 {( x4 a) k
  11. **入口参数:无
    ! k. o8 p/ u3 n0 L& X: N: o5 k/ ~
  12. **返回值:无. C, n% j8 K. a& _
  13. **注释:
    9 L6 m/ y. M. d' u( P% t% S
  14. **********************************************************************************************************/
    , ~; R5 d4 N' a0 E+ N
  15. void        fm25cl64_init(void)
    $ {' f' U1 ^- Z$ Y7 n, T5 w5 W
  16. {& {; r; i9 {# x# B: D
  17.         GPIO_InitTypeDef GPIO_InitStructure;
    : _+ _$ E3 j  X: R% s( {
  18. & E  E+ }4 u0 O* a# I
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );0 G' [7 W2 k$ n. g3 c
  20. 1 E8 ?, L9 {( L. ~
  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  # j0 T( Y" `, Z, O$ c" F
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    ; j" J  i( A& p" ^/ d% f. l
  23.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;$ i- D0 b0 |0 K& e' o3 r. W
  24.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    5 T7 u0 A4 S1 p, r) A. B/ Q
  25.         GPIO_SetBits(GPIOA, GPIO_Pin_4);                       
    8 @2 {! Q' V3 ?2 ]) D

  26. / U  a. y7 s' r) w& T
  27.         FM25CL64_CS=1;                                //SPI FLASH不选中
    # K( a& O' B3 C6 X
  28.   SPI1_Init();                           //初始化SPI! n& W  s0 j1 e( S' D; m4 W
  29.         SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式
    $ n* K3 T/ I5 d
  30. }
    - V6 W- ?; K7 s! v6 I

  31. , |% v6 b7 f- R& ]4 h1 B
  32. /*********************************************************************************************************
    ! ^! {' \2 {; k  C0 k
  33. **函数名称:        fm25cl64_read_sr
    ' t/ E/ q4 T+ @9 z9 P" _; x
  34. **函数功能:读取fm25cl64状态  C+ |! J6 c- a9 o
  35. **入口参数:无
    ) C1 Q3 V- Z$ ^4 U0 O7 I( W  s
  36. **返回值:读取到的字节/ S: |* p3 r# P0 ]6 @: y7 \, l$ s
  37. **注释:
    6 X0 E/ |9 D% j1 P' q# H6 @+ H% r
  38. **********************************************************************************************************/
    ! E( Y3 F/ L% `3 A3 U6 k5 L5 a0 r
  39. uint8_t        fm25cl64_read_sr(void)* Z, r0 X2 m9 H. q- _% C0 {# j
  40. {7 F4 k/ i6 s( M, K- u- {% I
  41.                 uint8_t        byte = 0;
    8 S5 J; f: [" [: j. p; i1 ~3 Z
  42.         4 \. \0 }/ |& h" q* {
  43.                 FM25CL64_CS        = 0;                                                                                                //片选5 N" H0 U  j- a! K* O% W  d6 u
  44.                 SPI1_ReadWriteByte(FM25CL64_RDSR);                //写入读状态命令
    . Q) b. v, a; _. E
  45.                 byte = SPI1_ReadWriteByte(0xFF);                        //写一个空字节再读数据
    7 j4 w0 G3 q1 ~$ D% q
  46.                 FM25CL64_CS        = 1;                                                                                                //取消片选
    $ ~5 G8 O9 N( U$ Q+ K& Z
  47.         2 ^) ]& D# U. p  M" G
  48.                 return        byte;                //返回数据
    7 ^5 o! I+ T6 E' R; Z& L
  49. }
    ) K, s1 a) W# n& E8 N0 s0 S: F

  50. , c) J5 I0 g4 `

  51. ; ]. i; [4 _, y) b, l' C
  52. /*********************************************************************************************************
    1 k! O/ T: }9 ~3 I9 J) o. k
  53. **函数名称:        fm25cl64_write_sr: U: F# }8 j/ t
  54. **函数功能:写fm25cl64状态7 q  _% J. y' N& r) @) M
  55. **入口参数:状态数据
    - u$ L5 p6 g- S. }$ Z
  56. **返回值:无: j# D; o, p5 S- b- r
  57. **注释:
    ) `2 I+ D) l# d; J. Z; s, ^
  58. **********************************************************************************************************/% x1 f% E6 G; e8 f
  59. void fm25cl4_write_sr(uint8_t        sr)
    * e8 p) L( d1 F7 O
  60. {' J3 N& D( M8 t( j' d9 D. _" `6 a2 X
  61.                 FM25CL64_CS        = 0;                //片选: E* r0 {: G/ V) E5 a" g1 U
  62.                 SPI1_ReadWriteByte(FM25CL64_WRSR);//写入写状态命令, T( k8 e/ B2 u( }1 k' I
  63.                 SPI1_ReadWriteByte(sr);        //写入状态数据6 U( n: _/ ?6 N" ~
  64.                 FM25CL64_CS        = 1;                //取消片选/ c7 ]% j2 D: ]" U2 k4 j
  65. }
    4 b* H6 l, S! {. F7 Z

  66. , Q0 Q! C5 X) e4 d. ^0 n- _: ?
  67. ) s4 j- k3 P6 S: c1 ^
  68. /*********************************************************************************************************
    ; z5 H1 i- `; K3 m
  69. **函数名称:        fm25cl64_write_enable
    1 ?( N$ j0 T& [2 O# W% o) F
  70. **函数功能:使能FM25CL64; Y& u4 h$ ^. i5 [
  71. **入口参数:无# E, N0 Q! u! P0 Q* e. n
  72. **返回值:无2 m/ V: l: U! X7 S
  73. **注释:; e* M" n) R' R
  74. **********************************************************************************************************/
    3 u$ s8 T5 e/ t0 ~3 e8 e& K" E+ @
  75. void fm25cl64_write_enable(void)
    5 P! {$ I5 E" j" N
  76. {, j# [1 C# _6 @* w4 m
  77.                 FM25CL64_CS        = 0;//片选; t: @, g# x' A4 P
  78.                 SPI1_ReadWriteByte(FM25CL64_WREN);//写入写使能命令
    8 W$ ^: D0 A" y* ^2 [5 r+ X
  79.                 FM25CL64_CS        =        1;//取消片选& a: h+ e) y& y; n
  80. }
    ' y: ]: v: Y  N) B3 W. j0 h

  81. 8 t  a  W% h2 A, Y6 i5 y( j

  82. ' m6 g" l3 W# |6 j8 Q$ q( x+ ^
  83. /*********************************************************************************************************
    7 m  f( u5 E1 Y/ E# @( P
  84. **函数名称:        fm25cl64_write_disable( D: O$ I- S) j: }% i6 e5 x1 _
  85. **函数功能:失能FM25CL64, l; D0 ]1 I2 [1 m8 b
  86. **入口参数:无5 a! i  M5 ]3 E$ @; x# A4 e5 a
  87. **返回值:无$ K. k1 H+ `3 i, v9 h
  88. **注释:- T4 q; f* D% Y. G
  89. **********************************************************************************************************/
      j! B& V! p5 D; r
  90. void fm25cl64_write_disable(void)7 S7 O$ f. Z/ K' b' F( L! v
  91. {
    # X7 ?8 f* p) W% V
  92.                 FM25CL64_CS = 0;//片选- w: B# Y8 G0 U, e/ k% m
  93.                 SPI1_ReadWriteByte(FM25CL64_WRDI);//写入写失能命令5 h0 ?9 q8 p: X# {5 \9 U3 K
  94.                 FM25CL64_CS        = 1;//取消片选  P' f  v8 _. Y) H; s! W
  95. }
    6 v& f2 k% [- n' W) o+ A

  96. : Q7 i- M/ w: _' |7 w. O3 m+ k
  97. 0 A. x) u, a3 K4 W
  98. /*********************************************************************************************************
    ( ~: L+ n8 i' j/ b7 p4 P1 C" M
  99. **函数名称:        fm25cl6_read_nbyte
    ; g2 ~) ~3 v& D1 h% ?
  100. **函数功能:连续读取N字节数据8 {% ~! c: R$ C* u9 c6 G
  101. **入口参数:*pbuff,读取数据到指针,,read_addr,读数据首址,,read_byte,读多少字节0 L& F. j7 T  e) N' O7 t: ]
  102. **返回值:无$ W: l9 K) r5 Z2 k8 K8 w
  103. **注释:
    9 `. C2 Q8 x8 F/ `
  104. **********************************************************************************************************/3 _9 C. f3 F8 E  \
  105. void fm25cl6_read_nbyte(uint8_t        *pbuff,        uint16_t read_addr,        uint16_t read_byte)/ J& @' k& ]- Q, N
  106. {8 Q7 c; `5 D* q
  107.                         uint16_t        i;; X$ P& t$ S( N! H" e& C2 }; ]+ h
  108.         4 a9 p6 F  w3 C& M' B
  109.         ) h% i, M' z+ }- Q/ u3 L& Q* N) N
  110.                         FM25CL64_CS        =        0;//片选
    2 Z" n1 f: Y9 H7 G) |9 _) k
  111.                         SPI1_ReadWriteByte(FM25CL64_READ);//写入读数据命令" Y  D& E& J7 F6 e* u  j  m/ |6 c: G
  112.                         SPI1_ReadWriteByte((uint8_t)((read_addr&0xE0)>>8));//写入高8位址,最大地址13位/ P+ g" @$ b, X3 U
  113.                         SPI1_ReadWriteByte((uint8_t)(read_addr));//写入低8位址,
    - v& h% e% X7 }8 J0 c- l
  114.                        
    ; i. @7 y, V5 ?% e
  115.                         for(i=0;i<read_byte;i++)//连续读取数据# g& D0 }; U4 y: j  c  D! |+ `
  116.                         {
    ) ]/ ]5 Y5 W2 q6 ]5 ^
  117.                                         pbuff[i] = SPI1_ReadWriteByte(0xFF);5 r% k8 [! Q" y; V
  118.                         }
    - n0 o0 e$ a, s) G! Q
  119.                         FM25CL64_CS        =        1;//取消片选
    , ^" F- G1 Z5 @) \

  120. 1 m: C. b' h, g# D- `
  121.                
    ' o8 a4 U1 n5 R+ n, @
  122. }( O6 O' B3 j5 v# u$ W
  123.   k) G- W* S5 i3 }/ ?# F
  124. ; t! L3 K6 z) Z- [  Z
  125. /*********************************************************************************************************, Q6 \5 d4 L: B$ ^9 S: b* X
  126. **函数名称:        fm25cl6_write_nbyte
    4 e3 |& M; e$ ?6 l7 y5 A
  127. **函数功能:连续写入N字节数据# i% I6 `/ m  V1 G1 a1 w& C
  128. **入口参数:*pbuff,写入的数据指针,,write_addr,写入数据首址,,write_byte写多少字节9 n2 Y5 l$ _: Q5 {* u
  129. **返回值:无$ m! h9 J3 L4 b4 P
  130. **注释:3 n& Y6 H: G, f
  131. **********************************************************************************************************/, `* n& k; R7 q8 b
  132. void fm25cl6_write_nbyte(uint8_t *pbuff, uint16_t write_addr, uint16_t write_byte)' I$ ^( ^9 J  S5 i
  133. {
    ( i1 ?9 u& E2 C4 i, o4 @6 |5 i" a
  134.                         uint16_t        i;
    ! D  c, u0 Y$ F% b7 i! A$ J8 b

  135. ) v- g; {+ y+ ~5 |" ?* q% `+ l
  136.         * ^- u2 Z6 Z5 O5 ?- }$ J
  137.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作% Q6 V" Z4 x+ Q' W# O  B3 r
  138.         ! w9 Z) _& J- i& |$ d, `
  139.                         FM25CL64_CS        =        0;//片选7 f+ X6 L2 I- ?% G$ r
  140.                        
    ) x; U9 p( o& g( q: J
  141.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令
    & S- W' x4 g% N7 f/ _" B" g
  142.                         SPI1_ReadWriteByte((uint8_t)((write_addr&0xE0)>>8));//写入高8位址,最大地址13位
    + s$ o: k  L& F, P8 g1 Y) V+ d. d
  143.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//写入低8位址,0 [( i1 V' _% S9 h! I1 F& j8 W( o
  144.        
    5 R, m* |" ?. w+ B3 [
  145.                         for(i=0;i<write_byte;i++)//连续写入数据$ P+ [% G3 ?4 U
  146.                         {
    9 I6 Q* I" |0 i
  147.                                         SPI1_ReadWriteByte(pbuff[i]);
    ) t8 T% {" r  I" |/ I+ R( M6 {3 }
  148.                         }
    + [% U: G% r% T1 `: D
  149.                         FM25CL64_CS        =        1;//取消片选
    ! B( z) e4 z( U& M3 Z  q5 e  \
  150. }
    , e' i& l. J; d6 J. Z$ F1 ]
  151. * r4 c  O4 N7 i
  152. * \; V' l7 L/ N( t) l: d3 V. q; C

  153. % a6 q9 f5 H2 N( Y9 D) C  S9 @  l
  154. /*********************************************************************************************************: a, |5 C) e! G5 F
  155. **函数名称:        fm25cl6_read_data_1byte5 k7 R. ?+ ]$ `( l+ t/ P
  156. **函数功能:读1字节数据
    . T. W+ u) c6 H  |4 c4 T/ v- {
  157. **入口参数:read_addr,读取数据地址
    2 S' ~* |/ R/ a$ J* u# X& s
  158. **返回值:返回读取的数据
    7 {8 u9 o, D. N7 G
  159. **注释:1 |2 M$ O- f' F8 t' p
  160. **********************************************************************************************************/! Z: c& w3 q9 n4 b
  161. uint8_t fm25cl6_read_1byte(uint16_t read_addr)% j8 p5 T" I- J: B! j4 F
  162. {4 V% \5 x0 u: O& B8 E5 {' t
  163.                         uint8_t        dat;- E/ p& ^3 C" O3 B+ [9 U
  164.         $ c6 ~1 o1 H3 v! M3 g" j) Z
  165.                         FM25CL64_CS        =        0;//片选6 y( l8 k: y$ s2 K! C- T
  166.        
    9 e: V( f) E+ O0 |) S, t& F
  167.                         SPI1_ReadWriteByte(FM25CL64_READ);//写入读数据命令8 h  t1 n+ P  v5 J5 n
  168.                         SPI1_ReadWriteByte((uint8_t)((read_addr)>>8));//最大地址13位
    : e6 o! {1 {! y; j
  169.                         SPI1_ReadWriteByte((uint8_t)(read_addr));//
    ! G  K) i. V7 T
  170.        
    5 H: j7 [5 s) q6 z
  171.                         dat = SPI1_ReadWriteByte(0xFF);//读一字节数据
    + _. c3 Z  H; s

  172. ) g9 U4 G" y$ j5 P/ y8 U* ^3 A
  173.                         FM25CL64_CS        =        1;//取消片选
    ) O- b: Q  d, @7 s+ h4 J

  174. + ]" G# C; m% k  M4 g) X: Z$ G
  175.                         return        dat;7 E, i, `) x; K. u( Z* f0 o/ v
  176. }
    1 F1 M  _+ N/ c1 o4 L

  177. 6 A; A4 ?+ \' p# Q7 l8 z

  178. / r- x  ?/ Z+ @- J  v/ m3 ]1 f
  179. /********************************************************************************************************** z8 G! C- Z- c# x6 w
  180. **函数名称:        fm25cl6_read_data_1byte
    ! Y; n" A* R3 U2 `4 u6 I! ?
  181. **函数功能:写入1字节数据6 E6 k; G7 k/ U; M
  182. **入口参数:write_addr,写入数据地址,,write_data,写入的数据
    $ o  I; s) x7 f- K- a
  183. **返回值:无
    4 S. A) z, B/ V% P  U
  184. **注释:
    2 g/ e) @9 E2 ~* [
  185. **********************************************************************************************************/( N* }' n! ]8 [* e/ @7 s
  186. void fm25cl6_write_1byte(uint16_t write_addr, uint8_t write_data)
    3 a. C( s8 |% ^5 n
  187. {$ l8 w- g+ b; f+ f; `
  188. / F  I, _: o" d3 R0 z
  189.         3 h$ y( @  n; }# Z3 [
  190.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作& g6 x- J/ U  Q1 F
  191.        
    8 I- W9 Q  y" w. J% d
  192.         * u/ g! \/ E+ Y3 B1 n1 O
  193.                         FM25CL64_CS        =        0;//片选" {; |9 f. _# e- O8 G3 e
  194.        
    ; a! N2 k" j# V8 u) o8 o
  195.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令
    8 B! a; M( @8 d4 p
  196.                         SPI1_ReadWriteByte((uint8_t)((write_addr)>>8));//最大地址13位( B) ?- j0 i% ?. |
  197.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//5 u1 K" [4 r) {7 v1 |. t
  198.         # D9 R  D) @" K: b. h& }
  199. 4 G& H! Q5 B/ ^$ w
  200.                         SPI1_ReadWriteByte(write_data);//写一字节数据
    7 ^8 }- [. O/ _, ~9 }! Z0 y- p
  201. 7 H4 a* T/ Y2 }) `. N8 r" I! l6 @
  202.                         FM25CL64_CS        =        1;//取消片选
    0 H  K% O; }& M' V2 r% `
  203. }
    - M3 S! n, t$ S

  204. - S5 U: j' x6 J; t, {
  205. 4 a# e, Q5 \! z" n3 O
  206. /*********************************************************************************************************- d$ ]5 s! w; L1 _, L
  207. **函数名称:        fm25cl6_clear_data
    6 V+ l6 }4 M4 k; E. E
  208. **函数功能:清除指定长度数据" C; F, m9 |7 c" M! b  J
  209. **入口参数:write_addr,清除数据地址,,len,清除的数据长度2 |0 t+ Z: [  R8 F
  210. **返回值:无
    0 H- ]1 n4 T5 r; k' ]: K$ \
  211. **注释:
    + I3 j9 Z( G# b' S/ I
  212. **********************************************************************************************************/
    1 ^) h& k7 o7 s3 ^/ N( m' p
  213. void fm25cl6_clear_data(uint16_t write_addr, uint8_t len)% l5 i$ T3 @) H0 V
  214. {
    7 U+ k6 N4 Q; Q( k9 T7 d6 ], ]" e

  215. - b1 E( i! W# u/ I6 t
  216.         7 K8 k8 P2 E3 E; `4 }
  217.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作+ A2 \. N1 @9 a! S: K& e
  218.        
    # R8 w  G9 V0 n/ E: p( V9 D5 M1 l
  219.         ) u* U" `6 c5 H5 M& E: T3 f
  220.                         FM25CL64_CS        =        0;//片选1 N/ q) v1 Y6 M2 n3 |
  221.        
    & E( c/ i5 x& v
  222.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令
    ! Z3 ^$ ?2 p0 i  l
  223.                         SPI1_ReadWriteByte((uint8_t)((write_addr)>>8));//最大地址13位+ S! u0 K% f, b/ b
  224.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//( p1 ~' b) U; ]
  225.        
    + P+ l  U/ c6 d8 x2 n: x5 H
  226.                         while(len--)
    ( {; U1 B# F% ~7 u3 f
  227.                         {
    # O% d" R4 o  c- G1 ^0 ~, n
  228.                                 SPI1_ReadWriteByte(0x00);//- L1 a% C3 _* w
  229.                         }
    4 O) ?. [7 ~  w$ Z7 D! C- E7 @
  230.                        
    & {' A) X% u0 J3 V9 A
  231.                         FM25CL64_CS        =        1;//取消片选* u& k4 e& w  A2 d+ T1 p
  232. }, T. k! V7 k7 ]3 V) Z9 _! v5 |
  233. ! M+ r4 R8 }. g8 j3 o
  234. 2 q3 L. {! C- q- H6 P) `0 Q

  235. 1 R* E+ g1 Z( y4 D$ y

  236. % g6 @, [2 u, X8 V( x

  237. ; z# W& J) R8 H

  238. # O, D& M, F. P+ O% G- `; u8 Z

  239. ( S# o: i* T/ ?' X) a
  240. ' G( N' V9 k! d9 @( A2 J
  241. & ~; y) w, z. H' p9 N, j" R6 r
  242. & l0 M9 {! @" ~3 J+ z1 ~+ P
  243.   s* e7 `1 u8 G' i6 G$ y! o3 l
复制代码
其实如果面向接口编程,模块调用SPI的函数SPI1_ReadWriteByte还可以抽象,以备可以切换为SPIX_ReadWriteByte。0 _4 W" s% Y/ G3 f, X
' r# l0 J/ |4 j* J
测试代码
. m. Q" [! J  @
  1. fm25cl64_init();
    ' F/ y7 c( Z9 j7 R6 Y
  2.         fm25cl6_write_1byte(0,0xAB);! T$ f9 R0 e( N# _  N; i! ?
  3.         GG=fm25cl6_read_1byte(0);
    2 N+ n+ L! A1 b& r
  4. //        fm25cl6_clear_data(0,1);
    * V" `( t( l/ m
  5.         fm25cl6_write_1byte(0,0xCD);
    * E  d% e9 Y6 ?8 F
  6.         GG=fm25cl6_read_1byte(0);
复制代码
. z0 }* K. S' m( k: J) S# L* k+ {- b

6 w; D) K5 M' i, H, y, Y. A
收藏 3 评论2 发布时间:2018-8-8 16:13

举报

2个回答
x5y4z3 回答时间:2018-8-9 09:50:00
楼主连驱动代码都附上了,真是很给力!! 2 J4 G+ w9 [' L' M  d1 q; ^
十多年来一ˊ直在用 24C64 的 FRAM 路过...& v0 ^! ?, U/ ]6 u9 F9 i5 n
yangjiaxu 回答时间:2018-8-10 15:49:43
模拟SPI就行 铁电的应该不难

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版