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

铁电模块FM25CL64

[复制链接]
GKoSon 发布时间:2018-8-8 16:13
分享一个代码模块,网上找的一个STM32的SPI2通讯的FM25CL64历程,我自己结合自己的板子改成SPI1很快成功了。1FM25CL64确实简单,通讯和使用都比W25Q64容易
! @" D, _: N6 ?7 e% q2写之前没有必要擦除 类似EEPROM
9 X% O0 f$ p% W) C: M7 p+ U7 n+ V: h先看我板子原理图5 ~% W* j! B! k2 s7 Z
QQ截图20180808160614.jpg ) w5 `- @# T+ ^
两个存储设备挂在SPI1上,CS脚铁电就是PA4; ~3 y) g- P. Q1 S7 `
上代码:7 c4 u) s% \- A' j; f  I6 l
  1. #ifndef __FM25CL64_H_6 p5 L3 Z  F6 n7 W: \$ f. m
  2. #define __FM25CL64_H_                            
    6 X& h$ c2 c3 \" p1 z! i) `8 f
  3. #include "sys.h" % a: Q# X8 Y- W# E9 t4 I0 E4 @

  4. # t2 F3 h8 M( b1 m+ A8 L* y

  5. , b! S) G0 s4 ^' @! I2 U  \; G0 ?
  6. #define        FM25CL64_CS                 PAout(4)                  //FM25CL64片选3 I8 F' C. V( c

  7. 9 G8 g: B8 V1 N2 j
  8. ////FM25CL64指令定义
    : u) d) U, Z$ C: j6 E7 k% b
  9. #define        FM25CL64_WREN                0x06                //使能8 ?0 q! P3 I% Q' t
  10. #define        FM25CL64_WRDI                0x04                //失能6 S: o2 M% t6 H. v7 _/ U& }
  11. #define        FM25CL64_RDSR                0x05                //读状态) Q1 r1 L' P* e# B, E; x  {0 e/ I
  12. #define        FM25CL64_WRSR                0x01                //写状态% t; w# z1 d$ u! t* c
  13. #define        FM25CL64_READ                0x03                //读数据
    3 i. o! S: T4 H; \# b: d( V; k+ Z
  14. #define        FM25CL64_WRITE        0x02                //写数据
    ; _, f# H, ~( ~" o' ?3 N2 [

  15. ' ?) q0 c8 [/ ^" S0 v6 n5 [0 y' }( G% I
  16. void        fm25cl64_init(void);//初始化
    9 M- M& v/ w5 i9 ^
  17. uint8_t        fm25cl64_read_sr(void);//读状态
    0 V+ Y+ v: X7 h8 H
  18. void fm25cl4_write_sr(uint8_t        sr);//写状态+ ~' o( r: C8 k$ X5 O* d
  19. void fm25cl64_write_enable(void);//使能
    + v* l& d! S9 d& X- f
  20. void fm25cl64_write_disable(void);//失能/ c/ M0 R) r0 W( C0 H+ c4 s
  21. void fm25cl6_read_nbyte(uint8_t        *pbuff,        uint16_t read_addr,        uint16_t read_byte);//连续读取N个字节
    7 h1 k# r( V: P8 z2 \, @+ g
  22. void fm25cl6_write_nbyte(uint8_t *pbuff, uint16_t write_addr, uint16_t write_byte);//连续写入N个字节; j5 _% S' n6 `0 {
  23. uint8_t fm25cl6_read_1byte(uint16_t read_addr);//读取一个字节
    4 G+ x! v( ^0 T0 g' k
  24. void fm25cl6_write_1byte(uint16_t write_addr, uint8_t write_data);//写入一个字节
    ! ~" j" d4 q! H* u
  25. void fm25cl6_clear_data(uint16_t write_addr, uint8_t len);//清除LEN长度数据
    9 B+ M; r  Y/ O7 Y7 ?
  26. #endif( _# B; k* J. ?' z* P0 n
  27. 2 R; i* a& \4 W' z
  28. : Z9 [- j9 x2 C9 W' B
  29. - o4 b/ x0 I- N! I8 k4 Z- k

  30. 9 u0 A( L; e& E3 p
  31. 2 u& S/ e; z- G
  32. 8 I0 t- @6 X% I; B/ e; i! h

  33. ! }- f! X: i# E' u, e. ~& s
  34.   k6 w: U1 h" L! K4 T
  35. $ L: g4 [5 F+ _6 H8 ~0 ?
复制代码

6 p; w& _0 `; y0 C: v) z! {) l- X; R7 `# H) `3 A
  1. #include "fm25cl64.h"
    , |! Y1 T% ~; \9 @, [
  2. #include "spi.h"
    - V* R% b' S) r0 k( G+ N4 ], ^

  3. ) I; U0 f1 L# Y- p

  4. 0 O2 M$ g4 Q" w+ s2 a# s+ Y$ F& I
  5. 0 N# `* U' L: X+ t6 I6 [% G: t; w& V
  6. & Z" P8 I- S; D9 i; [( [/ q% k
  7. ; M  z9 Z* v9 a4 `- s
  8. /*********************************************************************************************************
    5 R4 t* H: |, g7 @/ E* y
  9. **函数名称:        void        fm25cl64_init(void)& ~: ?$ f5 Q+ m( M' L
  10. **函数功能:fm25cl64初始化$ X) p: T4 n: s* O: g8 r& D' l
  11. **入口参数:无" D, z  I; S/ S5 T6 e# M3 {
  12. **返回值:无
      b- ~: k# x' X/ y/ a
  13. **注释:4 S4 t" Q  G! {
  14. **********************************************************************************************************/
    - n5 ]/ M( W2 T1 l: j
  15. void        fm25cl64_init(void)) y7 ~5 o  @+ s, A
  16. {
    ) r6 i: l1 b6 R; C
  17.         GPIO_InitTypeDef GPIO_InitStructure;4 i1 e* g8 _+ \6 l5 b
  18. ! F/ F: P+ D7 I0 a
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
    , @0 ?5 n7 `3 [( b* r
  20. # K( t9 W$ b! b0 q; S
  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  # y8 w6 Y6 m: ]; p, ^
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    / n3 S7 g8 }; {* F9 Y2 O8 X& @( F) q
  23.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; s5 a6 p) q! }( {$ m
  24.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    6 `2 I  q+ }- c3 _
  25.         GPIO_SetBits(GPIOA, GPIO_Pin_4);                        6 ]9 _9 y* |" n4 @  V

  26.   H+ ~  j& A& \- `' z
  27.         FM25CL64_CS=1;                                //SPI FLASH不选中
    ' ]/ D" W  L4 g" U- [
  28.   SPI1_Init();                           //初始化SPI8 q0 P+ M9 b4 v4 ~' f
  29.         SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式5 x/ h/ R# m$ N+ a( }) q' a8 p
  30. }
    2 B- v3 f/ `5 I% s7 n  _
  31. # I: ]/ M" g! `' c; R
  32. /*********************************************************************************************************8 V2 ^' p* y" t: O: p- S5 G$ J' h  u
  33. **函数名称:        fm25cl64_read_sr
    9 B" w; P8 w; M8 Z& f9 M# E
  34. **函数功能:读取fm25cl64状态
    4 N( K- M. z9 K2 y* f$ m* D
  35. **入口参数:无
    * d! i7 @( A( P, P$ `# _
  36. **返回值:读取到的字节
    ' v+ T6 t. L/ z3 N/ S
  37. **注释:9 Y  V' ]6 K; }/ f
  38. **********************************************************************************************************/" [1 U7 r1 h% C0 y* e
  39. uint8_t        fm25cl64_read_sr(void)& @7 f7 V, N, B# c; ~
  40. {8 T4 w! y& z2 M+ z4 `) E7 _3 E# z
  41.                 uint8_t        byte = 0;
    " [4 s. b9 C. v# R9 l( d& R
  42.         ! R: r. s% a( q
  43.                 FM25CL64_CS        = 0;                                                                                                //片选
    1 f9 w# F7 [' v: o2 `! Z
  44.                 SPI1_ReadWriteByte(FM25CL64_RDSR);                //写入读状态命令
    ( [! L6 Q- b! T9 @6 ?: E* c+ p% G
  45.                 byte = SPI1_ReadWriteByte(0xFF);                        //写一个空字节再读数据" @2 I( v8 R! f- H' p* F
  46.                 FM25CL64_CS        = 1;                                                                                                //取消片选
    + p/ U) x' M: Y; W
  47.        
    - j9 }, s- o' X- h
  48.                 return        byte;                //返回数据
    9 ?# _$ L, ~6 v- I. }1 q
  49. }- z! _* A; L" x  y# P% H2 c: e
  50. 1 p* `: n0 y9 c

  51. 4 O* p+ |. J) }: Z2 \4 H
  52. /*********************************************************************************************************
    ( o; d  Y6 |2 `6 x/ ]
  53. **函数名称:        fm25cl64_write_sr
    7 e- Z  z5 j* c! N' h/ {/ U+ Q
  54. **函数功能:写fm25cl64状态
    # A. c; W& B( v% p8 @
  55. **入口参数:状态数据
    $ {' H+ A5 [+ r2 C5 w  \0 d9 R
  56. **返回值:无- L# F8 S! |3 N2 N2 R
  57. **注释:% `: k- C5 Z' k# K4 D- R5 H0 t
  58. **********************************************************************************************************/* q7 b& O2 X8 Q9 p% {
  59. void fm25cl4_write_sr(uint8_t        sr)0 r- c+ ?5 F5 x( }7 V: n+ Y
  60. {
    7 r5 ~$ Q1 C2 I9 V
  61.                 FM25CL64_CS        = 0;                //片选
    2 ~: c* `+ F0 A2 j* k
  62.                 SPI1_ReadWriteByte(FM25CL64_WRSR);//写入写状态命令
    , I& X% ^7 t# w$ v! V3 X* J8 Z9 `
  63.                 SPI1_ReadWriteByte(sr);        //写入状态数据
    8 U; D* R/ F; U
  64.                 FM25CL64_CS        = 1;                //取消片选
    * p( \3 [+ j; m! p- K4 f
  65. }
    $ I5 j9 J% s2 h0 U5 ^
  66. " _: p+ v$ Z2 w/ e

  67. 2 r+ C: j/ j& d/ f
  68. /*********************************************************************************************************
    ; J7 P0 P9 Y# j
  69. **函数名称:        fm25cl64_write_enable
    5 d: }9 c8 D( m$ N* D' I1 @
  70. **函数功能:使能FM25CL64
    4 K! a7 k% _8 U8 k6 D
  71. **入口参数:无
    . n2 h* R9 n! m. x
  72. **返回值:无. |- c3 |5 a  H/ \
  73. **注释:
    6 V1 l7 U# [- d' Z4 P
  74. **********************************************************************************************************/' [& n* g# M- Q2 a* R3 r! e" o( ^
  75. void fm25cl64_write_enable(void)$ }0 u9 `/ Z5 x0 {
  76. {
    * @0 l! H, y$ w( O& ^
  77.                 FM25CL64_CS        = 0;//片选/ B8 K2 e+ q8 ~+ W" E3 n! s
  78.                 SPI1_ReadWriteByte(FM25CL64_WREN);//写入写使能命令( a3 r$ R3 ]4 W' Z- |
  79.                 FM25CL64_CS        =        1;//取消片选
    7 `; W0 O. A- s  n8 x* u6 ^9 @
  80. }
    ; ?- b5 H0 A. ?) B

  81. 0 @$ ]: f, X# Q) o3 T
  82. $ B! Y% L) u+ J2 j, h) ]
  83. /*********************************************************************************************************
    % I) v+ [. ^- N" r9 g8 s; V
  84. **函数名称:        fm25cl64_write_disable  f. Y: l7 r. A: x. \$ v
  85. **函数功能:失能FM25CL641 u- z; D; i5 |2 X1 W
  86. **入口参数:无
    2 G( x) V. d5 e7 Y( m7 u8 {7 P; U$ e
  87. **返回值:无4 n) n; Q5 x0 V0 Q" ^( y' g
  88. **注释:8 V0 X+ S) r3 s9 z, \* p6 s; k/ E
  89. **********************************************************************************************************/6 f3 [6 O% q4 O' N; A' y
  90. void fm25cl64_write_disable(void)
    9 Q2 R1 ~9 e5 p; Z4 O
  91. {
    ' f+ C6 I0 |! [0 p( t  x. B& t5 c
  92.                 FM25CL64_CS = 0;//片选
    9 o. V, e$ D; u2 |, z, X3 [
  93.                 SPI1_ReadWriteByte(FM25CL64_WRDI);//写入写失能命令
    & S7 x+ p: O% T3 j
  94.                 FM25CL64_CS        = 1;//取消片选% N. r; H) S* }2 J  B6 \9 V
  95. }: l; }; V" w5 s# w7 Z
  96. # [7 R6 a# @! t& v5 {4 U9 R7 [

  97.   J2 H: t/ r# F& D" j
  98. /*********************************************************************************************************3 h* R1 S/ d( X" M
  99. **函数名称:        fm25cl6_read_nbyte  `2 n$ o: H% c4 u1 B( m1 \
  100. **函数功能:连续读取N字节数据. l+ U& F9 v. i+ I0 l+ R
  101. **入口参数:*pbuff,读取数据到指针,,read_addr,读数据首址,,read_byte,读多少字节4 F4 n% n5 {/ l: I& k( @6 g  Z
  102. **返回值:无8 ?0 w0 f1 d+ Q
  103. **注释:
    5 v! P/ t: ]/ X$ \- P
  104. **********************************************************************************************************/; k! @+ B* J, L: ~
  105. void fm25cl6_read_nbyte(uint8_t        *pbuff,        uint16_t read_addr,        uint16_t read_byte)
    ( u1 p/ ?$ R9 J3 o) Z
  106. {% q2 t! e. V0 r
  107.                         uint16_t        i;& C; x; r3 ^4 k) l# Q! A* |
  108.        
    3 u) Z6 j7 }5 p! Z6 r
  109.        
    * Y* p( Q0 [4 _' h2 M% v
  110.                         FM25CL64_CS        =        0;//片选: }# G9 `: @6 \; _
  111.                         SPI1_ReadWriteByte(FM25CL64_READ);//写入读数据命令
    / i! U0 ]. r, l1 j/ E) A
  112.                         SPI1_ReadWriteByte((uint8_t)((read_addr&0xE0)>>8));//写入高8位址,最大地址13位" P4 m: K1 x" R; b
  113.                         SPI1_ReadWriteByte((uint8_t)(read_addr));//写入低8位址,
    6 Z5 F! O  d4 Z2 V% H" k& w2 c# b
  114.                        
    ) U+ O8 T7 [  z5 v+ t- D, {! {
  115.                         for(i=0;i<read_byte;i++)//连续读取数据
    0 ?) X2 u3 I3 l- a- e2 E) U
  116.                         {: }1 m6 @( H$ @# k8 }7 C
  117.                                         pbuff[i] = SPI1_ReadWriteByte(0xFF);
    6 J: t$ J# C- T& U$ \* D8 X2 ?1 ?$ u
  118.                         }: R. c, m9 L9 `6 k/ R$ H
  119.                         FM25CL64_CS        =        1;//取消片选
    " s- H( v8 V; `

  120. 0 k+ ?/ b# D0 C" g# N3 \
  121.                
    + `4 E3 X, N2 `9 L1 t" D: v: F7 ~$ L
  122. }
    * Q) ^  E$ j3 _0 {) z! m) e

  123. 3 V+ \( G( s$ U
  124. & l, w- _9 H3 P
  125. /*********************************************************************************************************# V+ B. A7 s# q' U/ C
  126. **函数名称:        fm25cl6_write_nbyte7 ^: z. v5 n& X, J$ |8 K
  127. **函数功能:连续写入N字节数据, `5 s% P( V5 N% C+ y4 z$ q
  128. **入口参数:*pbuff,写入的数据指针,,write_addr,写入数据首址,,write_byte写多少字节" m; K  a1 H: r' w3 K& m+ @, |
  129. **返回值:无. l2 B  ]* r5 N- u
  130. **注释:3 c! c: T/ T5 Q7 m) D
  131. **********************************************************************************************************/
      b4 x) c6 ~4 S2 @5 Z
  132. void fm25cl6_write_nbyte(uint8_t *pbuff, uint16_t write_addr, uint16_t write_byte)
    0 I7 T4 ?9 D8 ~  y7 {
  133. {
    , ~4 ?& S+ |3 C) r6 @
  134.                         uint16_t        i;
    2 c$ |' E' c# m& K/ B$ W
  135. % Y: o, T* U6 y2 `
  136.        
    " b/ g8 V) U6 ]1 x2 G& c  f
  137.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作
    " Q/ w9 t0 F& P, J
  138.        
    6 |* Q# k5 e( f$ m; _" M% G- ^
  139.                         FM25CL64_CS        =        0;//片选  K1 r+ w' _; O' ^8 a1 L3 N
  140.                        
    : r; E) j) @  U, q5 C
  141.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令
    9 W  i& G# g; K+ h* Y7 K$ o
  142.                         SPI1_ReadWriteByte((uint8_t)((write_addr&0xE0)>>8));//写入高8位址,最大地址13位, u, t4 J" a" S$ D* M" Y* ?
  143.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//写入低8位址,9 T( t3 p$ v8 v' j% A* n6 l
  144.         3 P. v: [# p( _2 @1 X# {
  145.                         for(i=0;i<write_byte;i++)//连续写入数据
    , \0 K6 j3 L! W/ d! x; c6 C* {
  146.                         {0 a0 o; j, L. M6 u2 I+ ?
  147.                                         SPI1_ReadWriteByte(pbuff[i]);# R8 [. q* e/ S" m# z3 h" B1 P9 Q
  148.                         }
    % ]' X5 W) W- s3 Z
  149.                         FM25CL64_CS        =        1;//取消片选
    2 C8 L% P3 d5 [4 E9 i
  150. }. n" A1 r$ b9 h$ |
  151. 9 C: z( W5 d8 M) N& ]0 [
  152. " i! Q% h0 F% ?0 }8 P+ Y* v
  153. ) G/ ?1 R1 b1 l
  154. /*********************************************************************************************************
    ! `  N  d, _* z9 J
  155. **函数名称:        fm25cl6_read_data_1byte, u) k; v9 J. ?: r
  156. **函数功能:读1字节数据$ D. W& B& _+ }% \
  157. **入口参数:read_addr,读取数据地址* [' c, F9 X. x: }: \5 t+ Q5 D
  158. **返回值:返回读取的数据' q8 ]* X9 w( [+ ~" G
  159. **注释:
    0 P. l7 H; \4 R! z4 _% F
  160. **********************************************************************************************************/# b! ?$ t+ B7 X+ h0 V
  161. uint8_t fm25cl6_read_1byte(uint16_t read_addr)
    # ^0 Z+ `1 K3 e! X& W. w
  162. {
    ' {3 d) Q( j, L/ z& E9 a
  163.                         uint8_t        dat;6 q) Q  a0 j# g* D, ?
  164.        
    ( T  c/ h/ _! Z
  165.                         FM25CL64_CS        =        0;//片选
    " }, t5 F5 Y- f8 p& G
  166.        
    ( r7 D, H6 g+ }
  167.                         SPI1_ReadWriteByte(FM25CL64_READ);//写入读数据命令
    / {1 G* h; Y: A+ p
  168.                         SPI1_ReadWriteByte((uint8_t)((read_addr)>>8));//最大地址13位
    3 Y) w2 o4 H9 S  h( U& E( S& j
  169.                         SPI1_ReadWriteByte((uint8_t)(read_addr));//
    1 ^* R6 Z' @: H% Q6 s
  170.        
      u( a6 f. i: I; ], J9 n$ i+ z
  171.                         dat = SPI1_ReadWriteByte(0xFF);//读一字节数据! P- w+ v# M: L/ z

  172. 8 w' C1 [3 i3 y: ]
  173.                         FM25CL64_CS        =        1;//取消片选
    - l- v' u) h. N, ^$ J

  174. ! c/ o4 U5 K+ n$ K+ j+ o5 \
  175.                         return        dat;! v& K  B5 G) ^3 X% O+ T0 k
  176. }" Q! B1 H( v, n, B
  177. . N1 [: m! Q" k  r$ q5 i+ g2 ^& b

  178. 7 ~% |% ]4 s! m. I( b0 @
  179. /*********************************************************************************************************: K* O  p" g5 l% ]  W' h2 I
  180. **函数名称:        fm25cl6_read_data_1byte
    , h' P8 o0 n2 Q( o: t3 f  T
  181. **函数功能:写入1字节数据# D1 [4 M6 P, x$ N: Q! X
  182. **入口参数:write_addr,写入数据地址,,write_data,写入的数据
    + y0 p7 W. g3 Z- I1 D
  183. **返回值:无2 ?! s! w5 {9 }" y* h
  184. **注释:
    1 k8 m4 E& U/ z6 Q* @) c5 w
  185. **********************************************************************************************************/: Z# r8 g% ]' J$ K
  186. void fm25cl6_write_1byte(uint16_t write_addr, uint8_t write_data)
    9 f( i% c* e, m( q: z# x2 [2 ^
  187. {
    4 r) m8 e- x; ]" C& z9 m

  188. * j. H0 c/ ~, d' `
  189.        
    # e7 U/ m; l1 g! O( H! N- E3 K, C
  190.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作2 d! m3 ]  m' d8 g2 H! D- E6 a+ y
  191.         2 K" x( i9 h. Z' K; ^7 C+ k, ^9 P
  192.         ! O! q; O& J8 z4 q8 Z( z4 d; \! r
  193.                         FM25CL64_CS        =        0;//片选# O) m$ I- R% K) S
  194.        
    ) {, L* D5 R. I4 j# w+ Y
  195.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令2 w) u9 F& ?5 s( d0 x0 {% e* g& Z
  196.                         SPI1_ReadWriteByte((uint8_t)((write_addr)>>8));//最大地址13位& A3 l! k: X# s; g' @& H/ S
  197.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//
    / Z2 K" E  M8 u' a( n! D( b
  198.        
    ; e% V* v4 ]7 _/ U" Z. Q: s
  199. 9 ?( H+ e8 A: j! t* q2 _. W
  200.                         SPI1_ReadWriteByte(write_data);//写一字节数据
    ! C4 s* _8 s6 c8 }/ L

  201. $ U  Y) H4 l2 P% x; ]% O
  202.                         FM25CL64_CS        =        1;//取消片选1 W, {" K9 l) V' ^# E
  203. }
      u: E' M% e: |* s) I! t
  204. $ C0 y* n# ~! t" j7 F- @

  205. ( V) y+ {- b: A: L  o$ }
  206. /*********************************************************************************************************
    ; q2 g8 u6 X. m' I1 X$ q
  207. **函数名称:        fm25cl6_clear_data, x6 M( U6 O2 T3 v; ?
  208. **函数功能:清除指定长度数据* n6 t7 T+ V  y
  209. **入口参数:write_addr,清除数据地址,,len,清除的数据长度; `5 c1 d7 L6 K3 V
  210. **返回值:无
    ! b6 Z. @& f( j( O9 k. s
  211. **注释:7 T' e8 s2 g/ A
  212. **********************************************************************************************************/+ Y( Y3 E6 U# F
  213. void fm25cl6_clear_data(uint16_t write_addr, uint8_t len)6 O, A. e0 g9 s) J  u/ |& z
  214. {
    9 W5 ^- z% N1 I1 Y9 ]5 M. j* }- e

  215. 6 ^2 H: {+ O/ k+ l
  216.        
    0 y/ r$ B3 ^) C' Z. I
  217.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作
    2 z7 m. f% }* a: `
  218.        
    . Y- Q, j" ^* _' |2 }. h
  219.         ! E" n& x8 ]7 R6 k0 O+ ?
  220.                         FM25CL64_CS        =        0;//片选7 Q: M% K0 u0 T
  221.         9 P: S0 i3 z/ y" ~
  222.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令) D: X. r0 o% w* t
  223.                         SPI1_ReadWriteByte((uint8_t)((write_addr)>>8));//最大地址13位6 o. U2 o4 }$ V" _/ ^5 J4 V7 p
  224.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//
    0 |) a, g% p6 n3 k
  225.        
    $ k/ [* d% y* E
  226.                         while(len--); c6 J- m8 i; Y' B
  227.                         {
    ; ^6 ?9 R+ y4 H/ b
  228.                                 SPI1_ReadWriteByte(0x00);//% F* E; h6 s: O* M
  229.                         }  `* t  e& |' `* N3 q; s& S7 d: E
  230.                         2 t$ z0 ?* D2 c7 O8 B% L3 J7 n8 L
  231.                         FM25CL64_CS        =        1;//取消片选
    5 V0 B! {1 ?' A* a4 }* V; Q
  232. }+ O  J4 o9 |; \4 _2 |7 q

  233. / {# [  r2 s  w4 U+ P

  234. 5 g4 L" c1 U8 |% |3 t' E: a

  235. , Q  A7 G. C+ T% |

  236. 4 f# q' ]6 Q0 s- x; ]  c

  237. $ n. g: r; |4 R' u
  238. 1 _2 [* B/ [8 q2 o

  239. + k: }3 y5 L: t/ U; r: A/ |/ t
  240. 0 h1 w  A+ G: x
  241. ' A! ]6 H5 s' _# c0 G6 \, ]
  242. 0 l. P) U, F$ v$ f

  243. # }. @+ P' p6 F0 T# U
复制代码
其实如果面向接口编程,模块调用SPI的函数SPI1_ReadWriteByte还可以抽象,以备可以切换为SPIX_ReadWriteByte。* X; c! l; D! B) ^. [

" o' u, O7 c6 M% D- ^! Y测试代码' ~: m8 f+ x2 [8 t
  1. fm25cl64_init();8 }1 G0 M; o6 r8 U& w; ^, W
  2.         fm25cl6_write_1byte(0,0xAB);
    ) T% R9 Q8 z* O. `
  3.         GG=fm25cl6_read_1byte(0);
    & L& ]9 y2 n" f. X
  4. //        fm25cl6_clear_data(0,1);9 P6 Z0 T! `5 a. ]: m1 o& E& X2 {
  5.         fm25cl6_write_1byte(0,0xCD);
    8 `  }$ l- M: Q( M! K* {
  6.         GG=fm25cl6_read_1byte(0);
复制代码
  p5 P2 ~' `8 B$ p

. Q1 p2 x$ _( \" j4 d* }$ J
收藏 3 评论2 发布时间:2018-8-8 16:13

举报

2个回答
x5y4z3 回答时间:2018-8-9 09:50:00
楼主连驱动代码都附上了,真是很给力!! 1 U9 X( N: ~1 x/ I
十多年来一ˊ直在用 24C64 的 FRAM 路过...+ k$ N! }' U3 g+ v' w2 B$ z( Q9 g
yangjiaxu 回答时间:2018-8-10 15:49:43
模拟SPI就行 铁电的应该不难

所属标签

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