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

铁电模块FM25CL64

[复制链接]
GKoSon 发布时间:2018-8-8 16:13
分享一个代码模块,网上找的一个STM32的SPI2通讯的FM25CL64历程,我自己结合自己的板子改成SPI1很快成功了。1FM25CL64确实简单,通讯和使用都比W25Q64容易
+ H1 C! {( P8 C- r) e8 P% _( \2写之前没有必要擦除 类似EEPROM
- A+ R. i; Y6 W) i: H, q7 a) M先看我板子原理图
0 F* R: q# ?7 T/ U  v- Z QQ截图20180808160614.jpg   d" A6 n% r  Q# C
两个存储设备挂在SPI1上,CS脚铁电就是PA4
# r7 n# |% i+ P$ N% E上代码:2 H9 {* A; k) W) t9 ?6 `8 ^/ u
  1. #ifndef __FM25CL64_H_1 j/ L0 k1 I* Y% }
  2. #define __FM25CL64_H_                            . O0 p  t' }' W/ H
  3. #include "sys.h"
    2 t/ a. [1 w  l* }3 |$ n7 H8 z

  4. % M8 d0 z8 k$ N5 X
  5. ) x6 s9 h: T, h
  6. #define        FM25CL64_CS                 PAout(4)                  //FM25CL64片选' B" `2 H8 ^2 K5 g- _
  7. , q$ S2 p9 n+ p. e: u# R
  8. ////FM25CL64指令定义
    7 u" J2 T, Z5 b* z3 B; X" @
  9. #define        FM25CL64_WREN                0x06                //使能% J4 Y" w3 n) }
  10. #define        FM25CL64_WRDI                0x04                //失能
    1 J8 F2 o: r1 F, ?
  11. #define        FM25CL64_RDSR                0x05                //读状态" G1 m; X" R# e4 a# j
  12. #define        FM25CL64_WRSR                0x01                //写状态
    4 j& e; P2 a  Y" e- n
  13. #define        FM25CL64_READ                0x03                //读数据: I1 [1 v" I* X9 V7 Y& t
  14. #define        FM25CL64_WRITE        0x02                //写数据
    % T. a- _; m; h6 M- r

  15. 8 S! d+ _3 w9 q8 W% D! X
  16. void        fm25cl64_init(void);//初始化
    * F( H6 b7 O" `! }& e1 T
  17. uint8_t        fm25cl64_read_sr(void);//读状态9 R+ L0 r  J9 b  l" \
  18. void fm25cl4_write_sr(uint8_t        sr);//写状态
    8 |1 ^( r9 i; V% Z! j0 m1 P
  19. void fm25cl64_write_enable(void);//使能
    ! r* i: P$ q& I3 @, X
  20. void fm25cl64_write_disable(void);//失能8 f- w5 a1 B1 `7 h
  21. void fm25cl6_read_nbyte(uint8_t        *pbuff,        uint16_t read_addr,        uint16_t read_byte);//连续读取N个字节
    , k; |, h# y1 R
  22. void fm25cl6_write_nbyte(uint8_t *pbuff, uint16_t write_addr, uint16_t write_byte);//连续写入N个字节
      j1 ]3 j. r8 e6 u0 n0 h9 X
  23. uint8_t fm25cl6_read_1byte(uint16_t read_addr);//读取一个字节+ ^% E' R; p" F" l/ Y0 P
  24. void fm25cl6_write_1byte(uint16_t write_addr, uint8_t write_data);//写入一个字节' _9 m, x9 U* {+ L
  25. void fm25cl6_clear_data(uint16_t write_addr, uint8_t len);//清除LEN长度数据, q4 ?* w6 q0 h; w' W. y2 S
  26. #endif" C" w. B6 `$ F& q) l% m9 n

  27. 7 h7 ^/ k3 d, c6 l+ W1 |
  28. 8 h2 ~2 p& G$ k- N: Y" d% \
  29. : o* c. H, D6 q
  30. 8 x3 Y# ]# X0 v5 `6 d
  31. 2 d9 a6 @% q6 M- R( @

  32. , b0 ]9 S! {; {9 w& Y
  33. + O! `4 p& S( F0 t* E

  34. ) X+ ^1 _+ Z& P1 f+ i

  35. * g4 x% [: p( `, D: Q
复制代码

5 h2 ?/ {, K% o7 C
+ _# n" s+ u" e! U/ Z& t
  1. #include "fm25cl64.h" + k9 Y3 ?6 A3 ~% |
  2. #include "spi.h". h  Y$ \+ _6 T1 X
  3. 1 F/ h, E. ?/ ]" p# v3 K* U% ^: H

  4. " }3 H6 W& ~/ G$ `  m5 f: P

  5. % ?, t2 Z( h. x5 B5 @) a1 H
  6. & T' z  O& b2 I
  7. ! v* ~5 {; J7 |; p- @6 h4 f" }
  8. /*********************************************************************************************************
    9 X! ~! l1 E9 ]# q8 w6 y) O
  9. **函数名称:        void        fm25cl64_init(void)( L5 P/ v9 B* z) r3 D; f* e
  10. **函数功能:fm25cl64初始化
    , }- h+ I, H/ q9 Y' ^% m
  11. **入口参数:无
    : F7 |2 ]4 d% H" ^- w5 _1 {
  12. **返回值:无2 X4 i2 k- `. C4 n
  13. **注释:/ S1 _/ L5 W' ?7 U+ _8 K
  14. **********************************************************************************************************/
    " ~! h! q6 ~4 r7 N0 F
  15. void        fm25cl64_init(void)7 q: m- m' K: J2 j
  16. {
    / i. F' b, N9 ?" L5 G
  17.         GPIO_InitTypeDef GPIO_InitStructure;
    - L7 f  P& G  W
  18. " r! w7 ^' |5 `$ W) o
  19.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );" u. [$ y) K7 }  r* s. ^- y! @( s- ?
  20. % D5 @- w9 x: k" w! S
  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  4 q) e1 v# r7 ^0 [
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    , u! z  c8 w0 D! C
  23.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    : M/ \$ u- Z' l2 g
  24.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    2 F# z% B3 A' s2 p: C* F
  25.         GPIO_SetBits(GPIOA, GPIO_Pin_4);                        ' g( C; Q) C1 \2 y& `% w

  26. $ P( y/ B. t0 ~% y% o6 m
  27.         FM25CL64_CS=1;                                //SPI FLASH不选中, _/ i. k. ~5 h4 q, M
  28.   SPI1_Init();                           //初始化SPI+ l, b* D1 Q" k# ?- \
  29.         SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//设置为18M时钟,高速模式
    ; _+ y1 E4 B, x* b" j
  30. }% x+ N7 f6 h6 @: D  }# t  n  u
  31. 4 y) |' i6 U# ~1 y6 {
  32. /*********************************************************************************************************
    % y+ q; ^* g+ }) x4 V2 ?
  33. **函数名称:        fm25cl64_read_sr
    ( K7 Q0 J/ ~& x" u0 W0 B
  34. **函数功能:读取fm25cl64状态7 l$ }# q9 @1 D+ E; U
  35. **入口参数:无
    ( j" M7 q7 \% @# I2 F
  36. **返回值:读取到的字节
    $ N( @& U! l# t7 j3 V8 }
  37. **注释:
    ' z6 z& e: i- @, h! q
  38. **********************************************************************************************************/% D4 ?, R/ R& E% X$ T
  39. uint8_t        fm25cl64_read_sr(void)4 k3 H& }& V) I/ z
  40. {1 c6 [$ {) T0 ~1 X
  41.                 uint8_t        byte = 0;- @: W9 p8 N* p# `$ s8 R! B
  42.        
    - g! \4 M8 C1 l0 N7 T6 G; \
  43.                 FM25CL64_CS        = 0;                                                                                                //片选' L. G8 E9 |7 C) {: ?* ~
  44.                 SPI1_ReadWriteByte(FM25CL64_RDSR);                //写入读状态命令
    ; o$ U! r, {8 v
  45.                 byte = SPI1_ReadWriteByte(0xFF);                        //写一个空字节再读数据" s$ x5 Z$ k. R$ V) U5 V4 S9 P! \
  46.                 FM25CL64_CS        = 1;                                                                                                //取消片选; B! q9 ?! n2 w6 b7 j% W9 Z# ?
  47.        
    ' `7 d$ C' q$ \) T( r- ]0 B7 \
  48.                 return        byte;                //返回数据
    3 ]+ R: q# ?' p+ I# j5 c4 M3 z* i
  49. }
    # M+ Y: X, ]$ R+ R/ b

  50. & @; F6 r5 w. J- v) Z1 Y
  51. 8 r/ |+ I, y! h; \6 H: f
  52. /*********************************************************************************************************" B* p0 r  E- J  B/ ]% }: t
  53. **函数名称:        fm25cl64_write_sr# P1 f+ X. Y3 W) `( s
  54. **函数功能:写fm25cl64状态7 O1 k9 c2 _) `' `4 k: W
  55. **入口参数:状态数据! `+ x6 j% ]( [/ x0 t% g/ T2 B
  56. **返回值:无
    ; G- }( F" `2 f) Y0 n7 b
  57. **注释:
    , P% ~. Y' \  W) N4 U: m
  58. **********************************************************************************************************/9 X; W& r! E  l7 U5 m9 j
  59. void fm25cl4_write_sr(uint8_t        sr)
    ( t& m7 t8 J5 Z- o1 c0 W
  60. {+ d4 g, [* s( S) t. g/ e
  61.                 FM25CL64_CS        = 0;                //片选
    , b; N/ e8 Q5 }# R8 k  `
  62.                 SPI1_ReadWriteByte(FM25CL64_WRSR);//写入写状态命令
    3 A& i$ {; x) u. z1 f& |9 D  _
  63.                 SPI1_ReadWriteByte(sr);        //写入状态数据3 e3 B) h( ~( Q% A: {6 M
  64.                 FM25CL64_CS        = 1;                //取消片选
    9 U* e0 U$ p* A' s6 S0 Y* w& C
  65. }
    ) @  L# J6 e: ^9 M; h2 n/ [% b1 C
  66. 4 N+ }2 H  Z2 Z8 l" K
  67. ) ~! ]6 @5 K' H9 n) n& Y, z
  68. /*********************************************************************************************************0 \  D5 G) V4 |. {0 [( p7 O
  69. **函数名称:        fm25cl64_write_enable' ~; K# W& ]( m! J5 z! o
  70. **函数功能:使能FM25CL64
    1 |* i5 g. e% t7 d/ g; A
  71. **入口参数:无6 I) r* m; `' o5 ]. I1 }1 M
  72. **返回值:无
    8 `1 l( c) o% s. B& o% A3 v
  73. **注释:
    $ ^, p- a- E  U) \
  74. **********************************************************************************************************/' V5 h4 _: ]2 L  j2 T+ K/ A" _
  75. void fm25cl64_write_enable(void)# i2 S- G% O  j/ l$ A2 c' i9 L3 h
  76. {4 ]7 o+ J: M$ }) Q3 ]8 E
  77.                 FM25CL64_CS        = 0;//片选0 Q" d0 X* f5 A5 b, r6 L( H
  78.                 SPI1_ReadWriteByte(FM25CL64_WREN);//写入写使能命令4 u& |7 u( s7 O8 x+ f: D: o
  79.                 FM25CL64_CS        =        1;//取消片选9 d* g3 j0 A# d; Z2 k
  80. }6 V- c+ l. {! x+ z  k% l0 g2 n
  81. 9 \- Y' x, J& e$ f9 R- s6 l  I

  82. 1 F' A8 Z, d: N' c0 c$ B
  83. /*********************************************************************************************************
    " G1 i0 d* x' [) r
  84. **函数名称:        fm25cl64_write_disable
    : A  o3 N$ f0 x; j) h1 \" z
  85. **函数功能:失能FM25CL646 n5 e; X+ U0 a7 ^
  86. **入口参数:无1 C9 _$ c8 s; e' E; t( y
  87. **返回值:无; k  Z4 K1 x9 G$ e: r3 W, {# I
  88. **注释:: j6 H+ C: r. |, J% ]
  89. **********************************************************************************************************/  H# p, T9 j2 C" Z! E
  90. void fm25cl64_write_disable(void)
    7 v1 u# p# O6 g2 Q9 n$ P9 n5 i
  91. {
    7 [' j4 H' p. I; e% f
  92.                 FM25CL64_CS = 0;//片选4 ~1 t6 F" [3 n
  93.                 SPI1_ReadWriteByte(FM25CL64_WRDI);//写入写失能命令
    + G" @) m7 i' Q: U& H! ]
  94.                 FM25CL64_CS        = 1;//取消片选
    2 p3 F! b* i; a" }1 \: N; x
  95. }
    1 n8 S% Y+ N/ h0 f& k# y% q

  96. , k' E- ?0 G8 r5 H$ r$ ?

  97. , |4 P9 J3 ^! I; p+ [% F
  98. /*********************************************************************************************************/ N+ n: }8 V: N; g
  99. **函数名称:        fm25cl6_read_nbyte
    4 X9 K' T1 ?& d
  100. **函数功能:连续读取N字节数据, y! a3 L/ C+ C5 `
  101. **入口参数:*pbuff,读取数据到指针,,read_addr,读数据首址,,read_byte,读多少字节. Y2 q  W& s0 q  h
  102. **返回值:无) q( |: e# J* u; G
  103. **注释:
    : @) |3 b8 m$ q! a. k
  104. **********************************************************************************************************/( f  L, a9 h/ l2 q0 M
  105. void fm25cl6_read_nbyte(uint8_t        *pbuff,        uint16_t read_addr,        uint16_t read_byte)% ?5 P3 o/ f9 r$ _) R2 E3 p* W
  106. {
    1 V- c$ }0 w$ S7 C+ D2 Y  _! f
  107.                         uint16_t        i;
    0 D) `- N/ I9 ^7 ~( S+ B& v+ u
  108.         # Z% ^9 c, J* o* e' ^. ^7 ~2 C
  109.        
    ; L" r( n( L) j. ^* ^
  110.                         FM25CL64_CS        =        0;//片选( K' g: L% q' ^% n/ q& K
  111.                         SPI1_ReadWriteByte(FM25CL64_READ);//写入读数据命令
    3 a" P; d$ I, y
  112.                         SPI1_ReadWriteByte((uint8_t)((read_addr&0xE0)>>8));//写入高8位址,最大地址13位
    % U- ]- R) u- V
  113.                         SPI1_ReadWriteByte((uint8_t)(read_addr));//写入低8位址,# B) ~9 i' M. z7 {" [
  114.                        
    . ^' b9 \: `- E
  115.                         for(i=0;i<read_byte;i++)//连续读取数据
    0 _5 b; |. p9 `9 g' B
  116.                         {: ]  q9 W$ n7 D! b( [/ }
  117.                                         pbuff[i] = SPI1_ReadWriteByte(0xFF);0 X; p9 V4 N7 G7 s+ P
  118.                         }
    4 F; ~: W! S0 E" s
  119.                         FM25CL64_CS        =        1;//取消片选7 e* o" |, j$ ]* ?$ Y* @
  120.   |( M2 p; A& u' a# [
  121.                 9 o$ P: _2 x9 k: i* y- K0 Q& e
  122. }3 G, ]9 i1 p# y0 ?3 h" P, I- W. e

  123. 2 \9 R/ t; c! y  ~3 F* z; G
  124. 0 L( K( b5 j2 w! k0 {" M$ ]
  125. /*********************************************************************************************************% b* y0 `0 o  U3 Z2 m
  126. **函数名称:        fm25cl6_write_nbyte* V9 _$ `* G3 R7 a' m( _
  127. **函数功能:连续写入N字节数据$ B) A  H5 I  F+ U
  128. **入口参数:*pbuff,写入的数据指针,,write_addr,写入数据首址,,write_byte写多少字节$ C  E5 s+ |5 y$ k
  129. **返回值:无
    5 _' T; Z5 H# D7 P
  130. **注释:: J( t' D; ]2 l  |( E! ]
  131. **********************************************************************************************************/
    6 n1 a( E, a; [0 Q1 p
  132. void fm25cl6_write_nbyte(uint8_t *pbuff, uint16_t write_addr, uint16_t write_byte)$ U9 u$ x- @: r$ g) y$ d( H% X: O' g+ `! S
  133. {
    # f  O- h0 S0 E! Z. k
  134.                         uint16_t        i;
    , G1 C( h9 M: K- b

  135. * P3 W2 P8 m3 x
  136.         ! T8 T# c' \- I/ N- T. h
  137.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作
    5 k$ E& b& s' Q# N  p" D
  138.        
    & L7 `: w  \; w2 P& s8 `
  139.                         FM25CL64_CS        =        0;//片选. l9 a2 L# Y9 d+ k
  140.                         0 S' Z4 S9 Q  j9 ?( Y. p+ x
  141.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令
      V7 I6 C, m4 A+ T  Z; a; ^; a7 V
  142.                         SPI1_ReadWriteByte((uint8_t)((write_addr&0xE0)>>8));//写入高8位址,最大地址13位( E" s5 b; E* b. C3 ?8 \
  143.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//写入低8位址,* b9 `/ E, L) W, s5 b6 @5 Y
  144.        
    3 W) z1 w$ K$ W, e" }/ c; }
  145.                         for(i=0;i<write_byte;i++)//连续写入数据
    7 O  @7 c- r5 u: b  d8 u
  146.                         {
    , f% k. z5 Y( }5 u
  147.                                         SPI1_ReadWriteByte(pbuff[i]);5 T! R. r* D+ G0 N/ y
  148.                         }. l2 V2 j4 b1 m4 ^% I  a
  149.                         FM25CL64_CS        =        1;//取消片选
    ) L) ^& u, p4 o( @6 g, Y
  150. }
    " p  L4 y  D/ R5 S
  151. ) @. B( h/ R" \

  152. / x$ C5 ^9 e* `- y7 f4 D

  153. 1 M+ i( y$ B/ |! x6 _
  154. /*********************************************************************************************************
    0 }3 ]# S% W. F# G0 W, n+ U2 O
  155. **函数名称:        fm25cl6_read_data_1byte
    % ^! @* a- u" F. O& m. ]2 r  G* r
  156. **函数功能:读1字节数据' l. {! H# |+ e' [
  157. **入口参数:read_addr,读取数据地址0 y2 K- [7 X% i8 X7 t# n' @7 Y2 _
  158. **返回值:返回读取的数据( g+ F: U: w# J1 b2 ?* j
  159. **注释:
    ) }: A- c6 t* G6 H$ x* y
  160. **********************************************************************************************************/
    # j3 B; G' O1 o' i" r+ x
  161. uint8_t fm25cl6_read_1byte(uint16_t read_addr)
    ; `* g9 Q$ e9 V: O+ G1 U1 w
  162. {% u  V6 X+ ^2 E: R2 o9 Z& F( o0 c
  163.                         uint8_t        dat;; x' M/ s7 {+ E( P6 o
  164.        
    ; Z. v0 R3 ]  }2 I; @
  165.                         FM25CL64_CS        =        0;//片选' q# q  A' a3 B- i8 I
  166.        
    ( N# m; Y" E3 m, T" w
  167.                         SPI1_ReadWriteByte(FM25CL64_READ);//写入读数据命令
      N! B  n6 f  C: _' Q4 ~( W5 G
  168.                         SPI1_ReadWriteByte((uint8_t)((read_addr)>>8));//最大地址13位
    . v  n9 |# Q1 Z0 W
  169.                         SPI1_ReadWriteByte((uint8_t)(read_addr));//
    4 K. E& y! V. d+ P3 K
  170.         2 o, p: D% l0 T& ^+ Z
  171.                         dat = SPI1_ReadWriteByte(0xFF);//读一字节数据" \! O) W; E! P5 g, G# P

  172. 1 V) O. `& u; s# A# i
  173.                         FM25CL64_CS        =        1;//取消片选% z& L5 R# Q) D4 L  |8 G( x

  174. / r7 q; R/ s4 ~" {2 A7 [
  175.                         return        dat;
    8 e& {. w  F: J0 n& T# o0 e
  176. }
    $ G2 w# y$ j8 A( r
  177. 3 w8 M% Q. U* V# A- e0 q* Q; n

  178.   N0 @! [7 G$ u3 I3 ?
  179. /*********************************************************************************************************, w2 T( {- a9 v1 M$ r. u1 B
  180. **函数名称:        fm25cl6_read_data_1byte
    . E: n5 o2 V, b- y
  181. **函数功能:写入1字节数据2 |. p. p" s1 a) B/ x" p
  182. **入口参数:write_addr,写入数据地址,,write_data,写入的数据0 K0 z3 U& n& N7 k1 A, |
  183. **返回值:无) N5 K8 ?8 ~3 Y) s* W- n, Y! O
  184. **注释:
    1 d4 `& J* m) w0 _$ E
  185. **********************************************************************************************************/
    5 [4 ~& H( N& D  e3 p& u. B
  186. void fm25cl6_write_1byte(uint16_t write_addr, uint8_t write_data)+ b7 }2 E' V5 `, d9 u& j
  187. {2 A- z6 R4 e) j$ M; M

  188. 6 i# ]# v3 A0 i7 ]
  189.         , E6 O0 L  a; Q  K
  190.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作
    0 D4 _$ l$ m' h6 s
  191.        
    & D& q) H% b! X
  192.         # b# V1 D1 L- S. f9 p: a3 G
  193.                         FM25CL64_CS        =        0;//片选
    3 Q7 [' w  H' A% B2 L
  194.        
    1 \- J& z1 `$ c, \* c( a
  195.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令4 O. Z) T! `) s. ~" q
  196.                         SPI1_ReadWriteByte((uint8_t)((write_addr)>>8));//最大地址13位+ l+ ?; B+ F8 M( i% Q
  197.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//
    ) \* Y3 E) w0 l( ^& u: U" b& G
  198.        
    . d" u  f# g8 u; h. p
  199. % ~4 o& @6 p8 B0 {
  200.                         SPI1_ReadWriteByte(write_data);//写一字节数据: v& i, W# U) k& p0 `1 m

  201. - i# g9 r0 ~1 M9 X6 }/ k4 t
  202.                         FM25CL64_CS        =        1;//取消片选
    - B- |9 W. C% ]
  203. }
    + C( W3 U0 W. K. T
  204. / Q7 w) g: J5 x  {! G4 i# g

  205. 3 ~' R8 l* \6 P
  206. /*********************************************************************************************************
    1 k- f/ S" r3 k6 @. l. [) \
  207. **函数名称:        fm25cl6_clear_data
    4 f8 A. Q$ ~) m4 ]* Z' n4 }3 o
  208. **函数功能:清除指定长度数据/ G$ S+ f! l7 G" x( @
  209. **入口参数:write_addr,清除数据地址,,len,清除的数据长度: W$ U  E8 v) T) v/ Z7 F$ c2 u+ r
  210. **返回值:无
    4 K' P; g) P: \" v) M4 k
  211. **注释:& V% x, E; a  z4 R/ `4 w' @; ^
  212. **********************************************************************************************************/
    4 o1 h* J- w4 m0 ^
  213. void fm25cl6_clear_data(uint16_t write_addr, uint8_t len)
    9 v: k+ ~! E1 M! Z* u
  214. {
    2 y% F+ L* ^  v

  215. , W6 Y" |6 Z, T8 V
  216.         8 T- c" w9 ?! Z( y9 Q" D
  217.                         fm25cl64_write_enable();//使能写操作,一定要先使能,取消片选后再写作下面操作7 v: A. Y$ r$ i: L! [' [0 R3 Z
  218.        
    # c! D! j( x+ n
  219.        
    $ e+ m- \; ?) Q4 }
  220.                         FM25CL64_CS        =        0;//片选
    " M6 {, j8 N3 c0 l/ i
  221.         ! f; x; r$ C# r& C2 b$ G! W
  222.                         SPI1_ReadWriteByte(FM25CL64_WRITE);//写数据命令5 e( T* E" ]$ j# q: ], P
  223.                         SPI1_ReadWriteByte((uint8_t)((write_addr)>>8));//最大地址13位
    + G2 T& A5 V0 D& ?% S% a& y6 O
  224.                         SPI1_ReadWriteByte((uint8_t)(write_addr));//
    # C# Z/ `* ?0 Y1 E8 Z/ C
  225.        
    ) j! z9 `( m* R4 i+ D$ [# f+ Y
  226.                         while(len--)( [% c3 k0 I1 ~# _1 d6 O# k) V
  227.                         {" l! X* g0 k( P: h, \
  228.                                 SPI1_ReadWriteByte(0x00);//
    3 J8 h# |2 b- y' V2 [
  229.                         }4 r; k% u; T1 ~0 b0 S5 e
  230.                        
    ) S. P  Y3 H8 s5 q
  231.                         FM25CL64_CS        =        1;//取消片选
    ; i0 R9 F/ ^3 Z$ s
  232. }
    : j* J$ Z6 ^4 O
  233. 8 `! p( T  |/ E& f& Y% b

  234. ! A( s+ _8 c6 x+ N$ L. S
  235. 9 q  r0 h9 e: s1 y0 K

  236.   A5 [. J5 g3 X6 B7 `7 s

  237. ( D1 Q4 w8 B  b* X* o1 a

  238. ( g) e* U+ ^, {( [) i

  239. ' |# O, ~" @7 X+ w( Y" q9 K

  240. 7 B6 o6 t. R/ M1 C5 G8 a' [$ q
  241. / _0 O" t1 |* I) M9 y3 E
  242. 4 j7 L$ F( Q4 f5 k# J/ i$ [7 M
  243. " h. t6 y$ e! s& i. o3 U
复制代码
其实如果面向接口编程,模块调用SPI的函数SPI1_ReadWriteByte还可以抽象,以备可以切换为SPIX_ReadWriteByte。
; S& o  a8 d. D
. m7 n, ?1 ^: z( q' W测试代码
& R  D: x7 O8 i+ p: F9 X
  1. fm25cl64_init();" ?9 W$ H  L+ a1 B0 D# c- {
  2.         fm25cl6_write_1byte(0,0xAB);
    9 V4 r0 Q5 s2 c: M
  3.         GG=fm25cl6_read_1byte(0);
    : p' w( K+ q- Q
  4. //        fm25cl6_clear_data(0,1);7 ]& V1 P6 M. o4 F  [
  5.         fm25cl6_write_1byte(0,0xCD);2 F" y$ r# e0 L! G  g
  6.         GG=fm25cl6_read_1byte(0);
复制代码

! V: H! T$ B# n# n
$ k- F# e" t" f# Y- O- W* {
收藏 3 评论2 发布时间:2018-8-8 16:13

举报

2个回答
x5y4z3 回答时间:2018-8-9 09:50:00
楼主连驱动代码都附上了,真是很给力!! ) f. P8 q; P5 m- a
十多年来一ˊ直在用 24C64 的 FRAM 路过...
/ y! ?5 b; K1 z# g2 u' g
yangjiaxu 回答时间:2018-8-10 15:49:43
模拟SPI就行 铁电的应该不难

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版