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

重新封装函数读写AT24CM02

[复制链接]
奏奏奏 发布时间:2019-8-2 22:03

: d4 @  i- q1 a( L+ ^- x( Y
  1. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout);        //        根据AT24CM02重新封装读取函数- [& x+ \6 D7 r+ m  P- G1 T1 c/ p; W
  2. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout);        //        根据AT24CM02重新封装写入函数
    ; L5 S7 `. \, l$ ?/ f" |$ _
复制代码

! v+ H* b+ p* e. V. X( D! Y5 b$ a2 Z+ U6 w- K
上面两个函数声明放在下面两行中间,避免重新配置STM32CubeMX后被覆盖删除。
  P4 J: Y7 p# P
/* USER CODE BEGIN PFP */

" N+ ^! D  d" W2 }% D
/* USER CODE END PFP */

6 v( M; F7 _7 z, N8 c
; O/ k( S3 g$ b5 x' w6 U
  1. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装读取函数# f/ Q0 f. Y9 l! G- v
  2. {
    ! K- L0 }& F) N- V
  3.         //  R  {; l$ `% l% J  V, b* L
  4.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+0xA0),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);5 d- E. E7 C! \, {, M) i& r+ I  }
  5. }
    ' @: R! C5 m2 `# i  J$ M7 v+ p
  6. 4 O& {& W7 }( K8 u
  7. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装写入函数4 A4 t# P, U% l" e4 X
  8. {
    % o9 ^/ K" S3 B! U$ \3 [
  9.         //8 ^' z0 m# C3 K# g) e- _: @8 ?
  10.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+0xA1),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);. o4 M$ s+ M+ t# m4 s( {: J
  11. }
复制代码
) \# R* r$ M3 s

4 `: B1 _' C2 u6 ~' U( a. y* d2 z3 @
后面两个函数放在/* USER CODE END 4 */”上面,“/* USER CODE BEGIN 4 */”下面,避免重新配置STM32CubeMX后被覆盖删除。

5 M( g- r. o( F, s
使用前提是:
软件上用 STM32CubeMX 配置工程,选择HAL库。
硬件上芯片的A2引脚不接入IO脚使用,如果需要用到2片AT24CM02的同学当是留家庭作业自己回家做了,这里就不讲了^_^

" o% ~9 b0 T5 E. v; v" A
之前发了个求助贴,得到大佬们的提示,终于明白是怎么回事了。所以做好分享出来,让同行少折腾。
: d/ m8 _# v0 F) e
收藏 1 评论4 发布时间:2019-8-2 22:03

举报

4个回答
奏奏奏 回答时间:2019-8-3 06:16:28
忘记了写一下使用上的示例测试源代码
/ i) k8 F/ d: L( |9 }8 F/ [+ a, X7 S/ `  f5 s$ o9 m, K
  1. //        测试AT24CM02的最后一个字节的读写
    * |, G' B1 O. L7 t0 w% g% c0 ~7 E
  2.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)) M2 }# T: b+ k1 @0 m7 N
  3.         {
    , T2 s4 a2 e9 u  r1 q# R
  4.                 HAL_IWDG_Refresh(&hiwdg);/ @. C6 r9 ]2 }3 P5 J  v1 H
  5.         }
    - |0 w: H7 z8 ^' O3 o: e; n
  6.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    1 x% \/ m( F0 f
  7.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    6 q# @. d  v% n; C' e
  8.         {, a6 v5 }( U( e# L) R. {1 z
  9.                 HAL_IWDG_Refresh(&hiwdg);
    % i4 h$ n) N+ X2 q* a
  10.         }
    . _# V0 h; J/ N) |% S8 B+ F
  11.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    9 ~% s, ]! Z# i7 l) B7 V
  12.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)$ V$ V# b. v8 e  v) r" n
  13.         {0 |& U0 I' p. m2 J$ t
  14.                 HAL_IWDG_Refresh(&hiwdg);
    ! Y6 ~7 f# f( w. P
  15.         }
    7 b0 |0 [: P3 K3 L
  16.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);: o  }  e( r) g5 t, N
  17.         , h# Q( C  Y& k3 f* A
  18.         WriteBuffer[0]=0xAB;
    $ ~" V+ j5 H% N$ M8 ~# j
  19.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)2 {2 f7 [5 E: D2 Y; @, C+ D4 H
  20.         {( ]3 [1 K; E9 g# p
  21.                 HAL_IWDG_Refresh(&hiwdg);
    : K, N' |3 b+ V
  22.         }
    # `+ e" h4 S  [4 _6 \
  23.        
    ( @+ Y, ?; h' ]0 r
  24.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)" w, @4 |/ ~( n. l2 ^, J1 C
  25.         {1 G7 Y! o5 U3 Y5 _5 H3 _" X
  26.                 HAL_IWDG_Refresh(&hiwdg);0 b: A5 F$ P. g" M2 j
  27.         }
    + ^& z. R2 \, k8 w
  28.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);6 w$ z2 z# p) e4 V
  29.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    8 W: `5 C- ?3 N8 S" O* ~7 S$ R
  30.         {: b0 {# a; T! t, F' x
  31.                 HAL_IWDG_Refresh(&hiwdg);  y/ I$ E( G+ S% W
  32.         }7 V* c5 `* ?$ n" x- `/ h8 I- R* [5 G
  33.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    7 n8 K, a# a' ~0 u
  34.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    - }( o+ c1 |+ L$ \
  35.         {
    0 t* N) v+ N$ I' [% U7 q$ V
  36.                 HAL_IWDG_Refresh(&hiwdg);
    ( n- x2 ~5 r! ^  S) Y
  37.         }+ ]6 Y# S4 c( z1 P: f1 a# w$ x
  38.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
    # t% ^* v  P7 c2 Z$ e' f. c: e
  39.         4 O* d4 U5 R; f+ c, {
  40.         WriteBuffer[0]=0xCD;
    4 v) Z+ y# E6 ]* p8 m5 @  C
  41.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)0 V% W* o1 V5 ^! a; S5 F
  42.         {
      f, v( g5 u! t; _2 \
  43.                 HAL_IWDG_Refresh(&hiwdg);
    & f7 M7 }; q$ z2 `! h# ^
  44.         }( D* g2 ^, ~0 @
  45.         1 {/ M+ `7 z/ k' N. @* G
  46.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    * n* F; K) c1 k8 F+ R' t
  47.         {
    + O) c' s; D, Y+ ]9 P" Z* M
  48.                 HAL_IWDG_Refresh(&hiwdg);
    % B: a2 G0 ~2 Z: D$ @  t8 U6 X
  49.         }
    ( t' ]% w* X' N9 d% h8 `
  50.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    ( m- Z& C! E6 N) J
  51.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)5 t: G; ~; F8 N+ Q: @6 n
  52.         {
    5 w  ~3 ~8 W/ a! C$ C
  53.                 HAL_IWDG_Refresh(&hiwdg);  _* e) J5 [7 i0 X) K7 A
  54.         }
    : G! B4 d$ n4 E$ g) F6 B; K/ ]5 L
  55.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);. E' B; i* g3 U# ~) r0 @/ O' t
  56.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    # @3 r1 X+ L+ A. c+ K( P
  57.         {
    & G+ T: P4 ~& W
  58.                 HAL_IWDG_Refresh(&hiwdg);+ P. I9 S' G; o( x/ i8 J
  59.         }
    * ~0 H7 p, r- I0 [3 x' r& x
  60.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);, [* f, u& p2 n* q5 B
  61.         ) P8 H/ V( X. c4 J, x1 e- H
  62.         WriteBuffer[0]=0xEF;8 \$ Q1 |/ @, ]8 S& @( Q
  63.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)! g2 ]  e+ ]) W2 s
  64.         {
    ! s3 L+ _+ H0 f4 R( ~
  65.                 HAL_IWDG_Refresh(&hiwdg);% N5 N- M, \1 x7 _
  66.         }
    7 }7 n5 @: M  W( k0 @5 E' x& X$ |
  67.        
    2 y3 _; M6 U$ d  x( l" e! c
  68.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    8 h. j7 A# ^  q  y+ b
  69.         {. H( {3 ?4 ]* F, b/ E" V7 c. m, `
  70.                 HAL_IWDG_Refresh(&hiwdg);
    % B8 Q  A( \% }# Y$ Y6 g. `* j
  71.         }
    - w$ G2 [! ]8 O" E% ^. m
  72.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);, S! y3 W. U7 m2 S1 d! @
  73.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    - g: [1 o0 a7 p4 r
  74.         {4 J/ S( _6 w% J. e
  75.                 HAL_IWDG_Refresh(&hiwdg);- ^& l4 h% v$ |7 G2 z/ }* N7 u
  76.         }% ]5 P8 I! a: N6 C8 u' N' M) M
  77.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    . ~" }6 u) A( }2 K" R( B
  78.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    + K3 E  t3 e5 A
  79.         {
    ! J$ i4 c. u7 M, ^+ \3 b7 H$ L
  80.                 HAL_IWDG_Refresh(&hiwdg);
    . w: t8 E- [1 a1 ^+ l1 H) u' G
  81.         }) E6 @# A* E& @$ `5 l4 ^# |' ~
  82.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);$ u# I/ t2 M! `' A* U
  83.         6 j7 d( l$ L6 V
  84.         WriteBuffer[0]=0xFF;1 I& J% x$ s8 \
  85.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    ! j( C/ i$ i# ^0 `6 v% Z
  86.         {! J) b6 g( W$ s+ ^
  87.                 HAL_IWDG_Refresh(&hiwdg);7 x) E3 ^" l5 N+ M
  88.         }7 C/ H0 J' B* o/ n# H3 v* o! A2 a
  89.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    7 z7 B! o1 [& Y! l
  90.         {" v" f" D2 w% q# r' k* x
  91.                 HAL_IWDG_Refresh(&hiwdg);* U9 {7 A. F# H3 P2 C
  92.         }1 }& m  G( g1 A# t/ t" K
  93.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK), ]% L  @; z, K) a
  94.         {
    9 v9 H& e. P) y- y
  95.                 HAL_IWDG_Refresh(&hiwdg);: J- t) G( }, d' ?3 n( m. |) D
  96.         }
    1 \+ T! x) [) X
  97.        
    $ r. k' J3 B; C. p3 z
  98.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    ' Q6 G7 F7 I1 _
  99.         {. a) \, L+ P8 i
  100.                 HAL_IWDG_Refresh(&hiwdg);/ d( P8 I- j: P# M, o  y
  101.         }
    " Y5 U: g  B1 e$ k- C. g; k
  102.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    + \* ~+ V& J; z/ ]$ P6 O
  103.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)! ?. q2 s0 ^8 Q/ L4 z
  104.         {0 B5 O$ T7 U/ i
  105.                 HAL_IWDG_Refresh(&hiwdg);
    * l0 u6 k2 S5 [2 R; U7 w
  106.         }* X* \, c8 \* Q
  107.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);& r: E* A. @  `9 n
  108.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    - p4 K* ~0 Q7 P: `6 X+ N
  109.         {+ m3 x4 w/ @" E. J8 |. ?# g
  110.                 HAL_IWDG_Refresh(&hiwdg);  ]* o# l% I7 A/ ]; X
  111.         }
    4 T: w9 J; n+ D# D
  112.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
复制代码

0 M$ H4 K! w1 h/ u' s$ ^# L" ^* O9 D% a! Z: g# r/ u8 {

) E4 n7 w; m4 U* q) f然后打印输出的结果是:
) W2 b. d1 \! ]8 D: ]" C  e0 ^  V% u' |
0 Q+ I' ~' F1 c, F8 ~, |
AT24CM02 第262144个字节中的数据是:0xff7 A* R2 f# F3 H4 v6 H% B) K
AT24CM02 第131072个字节中的数据是:0xff1 A" k( G( L0 e/ r/ @: D! [
AT24CM02 第65536个字节中的数据是:0xff* V! B- n' y* V& V) E
AT24CM02 第262144个字节中的数据是:0xab4 l; T/ e0 ^( k0 P/ m; m! A7 \
AT24CM02 第131072个字节中的数据是:0xff
# R5 ~: d" s' O0 o) k$ [' n AT24CM02 第65536个字节中的数据是:0xff' S+ E1 L3 U8 ~  k% r
AT24CM02 第262144个字节中的数据是:0xab
0 d5 N5 p+ X( f# U. |0 F AT24CM02 第131072个字节中的数据是:0xcd
2 r7 [9 h$ E/ G4 e& k3 G AT24CM02 第65536个字节中的数据是:0xff
% T& F& h4 g) ~& t8 O7 S AT24CM02 第262144个字节中的数据是:0xab
& U, y7 ]% }3 h% B' p2 b AT24CM02 第131072个字节中的数据是:0xcd, P3 p& d2 p9 E6 P
AT24CM02 第65536个字节中的数据是:0xef
- |$ M. r' ^* s2 p& I AT24CM02 第262144个字节中的数据是:0xff
5 x3 C! {# [3 J0 M: y1 j AT24CM02 第131072个字节中的数据是:0xff
, E" L3 ^- g& `) Y. ~ AT24CM02 第65536个字节中的数据是:0xff
2 b- |3 v4 H5 `+ h$ f& Q. \2 r3 p) X% I8 O( o3 t# ~
! l+ p+ ]2 v2 k) y: k3 r

: a9 [7 `. g9 Z/ Z  G. a补充说明一下,上面我开启了看门狗,所以用了喂狗处理,不用看门狗的话用 __nop(); 也是一样的
& i! q$ u2 ~5 u1 S: [0 L
ikxlf 回答时间:2019-8-4 14:01:40
评价一下:功能没问题确实不错,但是问题有一下几点:7 G+ g8 y3 s# I$ H7 o
1.代码太累赘,重复的太多  封装性太差
5 B: ?1 |  B" t' g2.代码不规范,格式上实在不敢恭维
. S4 l6 f5 c2 k
+ @$ X# ^3 P$ _让我评价打分10分给3分
奏奏奏 回答时间:2019-8-4 14:39:52
斯文人 发表于 2019-8-4 14:01% }9 q4 M0 @) k9 E5 a0 c4 D
评价一下:功能没问题确实不错,但是问题有一下几点:
' S+ k8 f6 o* \! m9 G5 F1.代码太累赘,重复的太多  封装性太差
7 s3 W' \! Y' J! ]0 ]2.代码不规范 ...
# W7 ?4 w8 C9 y/ w9 m
有请这位大佬展示一下要是你怎么封装?
+ a  C6 K6 e" C' q注意一下 沙发里的代码作用是演示怎样代入使用,并且通过打印证实了并没有只用到低16位地址的存储空间,. N" [* w/ U0 E' r) j$ i7 X. U
主贴上的无论是 读取 还是 写入 函数 都只有 return 一行代码,并且保持HAL官方库的风格。
奏奏奏 回答时间:2019-9-1 09:19:21
今天修改代码时遇到EEPROM升级替换源代码问题,% z7 {5 t# a- ~" d$ K0 l
所以把可以直接替换的改了一下封装函数的入口形参,保持与官方一致,方便已有工程的EEPROM读写代码直接替换函数名# o6 Y2 X' D4 M! a! n
7 _: L6 y6 T% k: W; D5 u9 o: {  u

6 {3 c5 ^' t5 k7 h

  1. + M8 w) J, m9 a& g. d! a( K( U& i
  2. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t MemAddress18bit, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装读取函数# W- u: G# i0 h! E  i+ H
  3. {
    5 J" V$ ?) t: M7 t
  4.         //
    + J* F2 M1 S( G+ |
  5.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);
    ' o' z. p* M  V( A5 q( z
  6. }
    7 W3 ^- [7 F* l% q7 R
  7. : X! w0 [8 [; `5 @& `( \7 m
  8. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,  uint32_t MemAddress18bit,uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装写入函数4 O$ a" v: X1 m& `4 E
  9. {* W* _0 U3 f% c5 R& i, |) d9 t
  10.         //
    ' o) E! _* |* O4 `/ z+ _
  11.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);" x- M7 E( ]7 b1 ^4 r
  12. }
    + r- ?3 S. L2 x# g4 f1 q/ r6 L

  13. ; P* [) L) Q* E1 J5 z
复制代码
9 `' G% n4 G5 l% K6 j

. a) f% v9 e& W1 [" G

所属标签

相似分享

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