请选择 进入手机版 | 继续访问电脑版

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

重新封装函数读写AT24CM02

[复制链接]
奏奏奏 发布时间:2019-8-2 22:03
+ m: E# S6 C3 i' D4 O; B
  1. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout);        //        根据AT24CM02重新封装读取函数5 T- N+ v  M( E# w* A1 K" u
  2. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout);        //        根据AT24CM02重新封装写入函数
    ! e8 O2 C' p& Z$ S$ B
复制代码

. l( F+ j: G7 k% _& y
8 _# z, ~$ D; U3 f- w3 t  g7 q9 U
上面两个函数声明放在下面两行中间,避免重新配置STM32CubeMX后被覆盖删除。
1 d: U! _! O  t# l
/* USER CODE BEGIN PFP */
# S0 p3 R- H" y
/* USER CODE END PFP */

) k4 `& J5 S' V& d4 A- C0 |" Q. g" r% F8 c& t; r3 p
  1. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装读取函数
    ; ?4 o  Y3 a- g3 a0 [- N0 d4 x
  2. {  k& A2 c* \3 r
  3.         //. h( {( _. h" d
  4.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+0xA0),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);
    4 y% r) t7 l4 b! s# {0 d0 U' N
  5. }
    * B1 A8 _* u8 Q$ A

  6. ( i' m# y0 @5 N: R
  7. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装写入函数& H* P/ A. O8 Y+ E7 o! a
  8. {/ @7 C. k" X4 j& {
  9.         //
      M" M9 ~- |! B/ u. |
  10.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+0xA1),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);2 t8 S3 b+ }+ }1 a) R! P9 o
  11. }
复制代码

% x$ I9 C0 v" A2 H) V2 a, u/ I. f1 n/ N5 K( T  u+ f" P; n7 P3 P

) }9 W9 @6 y, Z( \/ a) O, r
后面两个函数放在/* USER CODE END 4 */”上面,“/* USER CODE BEGIN 4 */”下面,避免重新配置STM32CubeMX后被覆盖删除。

; [% x- U/ W7 }6 Y9 Z
使用前提是:
软件上用 STM32CubeMX 配置工程,选择HAL库。
硬件上芯片的A2引脚不接入IO脚使用,如果需要用到2片AT24CM02的同学当是留家庭作业自己回家做了,这里就不讲了^_^

  J& T( k0 @' I
之前发了个求助贴,得到大佬们的提示,终于明白是怎么回事了。所以做好分享出来,让同行少折腾。

  E7 K- M$ Z5 F$ E
收藏 1 评论4 发布时间:2019-8-2 22:03

举报

4个回答
奏奏奏 回答时间:2019-8-3 06:16:28
忘记了写一下使用上的示例测试源代码$ K, ^9 ]! Y, C) _, t
9 s. [) B( ~" C- Z
  1. //        测试AT24CM02的最后一个字节的读写# l6 N6 l  T5 r/ R3 P3 U8 ^
  2.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
      m! _  [8 X) }& l9 h* d. g
  3.         {5 I7 H; ?& R( D  b8 }' B
  4.                 HAL_IWDG_Refresh(&hiwdg);, b6 W) }! B) L2 k, L: N
  5.         }
    . o! t4 f7 S6 H; [% B
  6.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    - A$ {( }' ?% a' ]
  7.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)3 c; J% A" \5 p7 Y  ~
  8.         {
    1 r+ n7 x# S, F0 ~, o
  9.                 HAL_IWDG_Refresh(&hiwdg);
    * {* a/ M. p' w8 _
  10.         }
    # d" I8 |# [9 x  m* m
  11.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    2 `* m( a# M0 p4 M
  12.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)) f% T2 d% o- i7 a- _/ c, E. c& z
  13.         {- M' v) i7 B2 {# A
  14.                 HAL_IWDG_Refresh(&hiwdg);' h* {* }( ~" e* H9 N
  15.         }
    3 L: M, t$ O4 E7 e
  16.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
    & Y3 A  S" `0 Y$ `' O
  17.        
    4 j6 J8 Q! d! s/ t$ b1 j
  18.         WriteBuffer[0]=0xAB;6 e/ }2 i0 y8 w( a" c# g
  19.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    3 S! H6 P- o# e. G
  20.         {7 B3 F0 H5 ^8 v7 h* _
  21.                 HAL_IWDG_Refresh(&hiwdg);
    + D* S: m8 `8 }/ I' y/ G" x
  22.         }4 D4 {" m* c0 ?3 L2 f/ B2 G7 O
  23.         2 b5 A3 c1 w9 {' P
  24.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)5 A, }/ l- ]7 b# C% }" o  ^; y
  25.         {
    * X$ B7 w( J% C3 ?+ K" P
  26.                 HAL_IWDG_Refresh(&hiwdg);
    , @2 R4 k0 a: e0 s7 W7 I( O
  27.         }
    6 j+ i5 m6 g# Q  \9 o
  28.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    / S$ [( B3 |1 c
  29.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    ( Q' n/ t& ~7 t, x6 l% s
  30.         {: E5 m, S- E2 Y1 R' `
  31.                 HAL_IWDG_Refresh(&hiwdg);+ W7 f9 `/ \1 i  D& Y6 |1 A' m
  32.         }# B  g7 G9 Y" G
  33.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);& A) E- H, E" _  g7 x6 z2 w! c
  34.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)% E2 v4 J) c7 ?" r
  35.         {
    , v* X8 a/ S/ v8 \/ d$ [
  36.                 HAL_IWDG_Refresh(&hiwdg);
    & D* a; }/ h) ]/ B8 U
  37.         }
    - f; P- H0 t% T; o7 t
  38.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);  u. o. F) G% F
  39.        
    0 s1 S7 x3 P1 f. S- C0 w
  40.         WriteBuffer[0]=0xCD;
    . s) B" m# r6 i, u) t" ?. ^
  41.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    # }0 d$ y7 k& i# ~# F9 q
  42.         {& f* i9 u: Q9 I( L$ S. m0 q1 R& O
  43.                 HAL_IWDG_Refresh(&hiwdg);
    ; h, G/ }/ J6 O/ A
  44.         }/ n! b( q) K7 r+ p. K# C, E+ {
  45.        
    : ?- j" H7 D; Y1 Y! }, D' l- U2 T4 t
  46.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    : @  c! X# K- G9 J+ I! [
  47.         {: d- C5 {  q  G5 Q
  48.                 HAL_IWDG_Refresh(&hiwdg);0 K: Q+ \* z4 l* S0 c
  49.         }% x! ^+ o* y9 L
  50.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);* c0 ]& q1 _/ x* g: g
  51.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    + q7 i9 V* s6 F4 K# p4 `
  52.         {0 X) m2 j- z+ N, m# h
  53.                 HAL_IWDG_Refresh(&hiwdg);, V/ i0 {8 H% M( ?  r4 ~
  54.         }
    " K4 h5 T7 M7 \8 |6 p
  55.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);- G3 ]4 L9 M' ^
  56.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)9 d0 P; M) V" f+ [& K- V
  57.         {
    , P5 V! y' c( r, j& a( c
  58.                 HAL_IWDG_Refresh(&hiwdg);
    6 O9 D" \' H. |$ C3 n( [  B, |
  59.         }
    0 \: ^9 S+ N7 a. f4 F  U
  60.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
    7 A1 ~/ S. _9 q7 s
  61.        
    0 P; O  E0 L( ?  E: w9 Y3 a
  62.         WriteBuffer[0]=0xEF;
    % _$ r; [+ [: Y; B- I$ Q( o
  63.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)) r7 _; \9 S, N7 p2 Y8 @+ |
  64.         {! K% R* H5 q; r; R' i# g
  65.                 HAL_IWDG_Refresh(&hiwdg);/ p' b' w7 ^% q2 Q3 I' U6 c8 T
  66.         }! d- ^* U& d7 T8 \
  67.         % O2 ?' [) Y" O; ~3 @
  68.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)( j, T3 k5 R+ J8 [# S4 E0 j
  69.         {
    # O5 {0 O; J$ r1 O3 e- j
  70.                 HAL_IWDG_Refresh(&hiwdg);+ e0 s) M8 @# ]0 X
  71.         }0 k* D/ ~5 y. z0 ?$ H9 [# Z- G
  72.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);/ P) D/ ^, t6 m- z/ b' I3 y7 X. G
  73.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)8 G4 c* H& A# F4 q! ]  V7 C
  74.         {( H/ B. o; k) q; L1 B
  75.                 HAL_IWDG_Refresh(&hiwdg);
    1 S8 O3 m5 h$ g0 a. M, a- ^; p0 y. a
  76.         }
    , a( a: j% Q0 C
  77.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);3 K" i" G' j  W, N7 P4 i6 E8 D6 n) G
  78.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    / A. t9 E$ O3 H
  79.         {% @2 b! J/ I3 n" ]  i6 I
  80.                 HAL_IWDG_Refresh(&hiwdg);, k! _! q6 {0 s7 s4 @
  81.         }
    $ w# t- I$ R- E: s1 w6 a  W
  82.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);) d3 B- O- b) k6 I
  83.         , I9 h- O* e. M9 q
  84.         WriteBuffer[0]=0xFF;
    9 k' A, r$ X5 X% g2 t
  85.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    - q0 S* H# o! n
  86.         {
    + x  r7 S* d& d* C6 u" L' U
  87.                 HAL_IWDG_Refresh(&hiwdg);0 Q9 L+ h+ u. L: q6 `) w
  88.         }. m9 d2 z* e4 \2 h3 Y, F
  89.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    0 X7 _( c2 S/ C% Q8 ^9 I# V  l% ]6 ]
  90.         {% M+ k! C8 `# \0 T7 i
  91.                 HAL_IWDG_Refresh(&hiwdg);
    / q9 C% A, Q! I* B) e# F
  92.         }
    5 R9 {) l* h$ W% A, P4 ]- `
  93.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)* x( M+ I- i- p
  94.         {% l. a: K: D. I7 y6 I( v' ?+ s
  95.                 HAL_IWDG_Refresh(&hiwdg);
    ) }' x5 K( Y; b# E1 b/ F; U
  96.         }
    " C: D" W) W6 I+ B
  97.         " {* @2 ~3 [' I7 F/ _
  98.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)' \9 D7 v4 e- d
  99.         {
    ) y" F! T" ^4 N, }
  100.                 HAL_IWDG_Refresh(&hiwdg);3 B8 p. z1 M: P8 B2 C# _
  101.         }6 n: [6 G- v. j  d; H2 i
  102.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);! v5 U! B8 m4 X/ j: {
  103.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    ' Z2 n  z  s3 Z; n" G
  104.         {
    7 |" p: @% v0 q" J0 m$ Z
  105.                 HAL_IWDG_Refresh(&hiwdg);
    2 a% R! z+ e- I' K) N4 x  f
  106.         }
    * V3 y' Q6 Q7 n3 r7 H- N
  107.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    0 E2 u! f( S8 U3 ^0 g% ]1 v( p
  108.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    * t4 e( g% f! q9 H1 E$ F2 Q
  109.         {9 N: @* O( K9 [
  110.                 HAL_IWDG_Refresh(&hiwdg);0 c: {: q7 q$ D/ I
  111.         }$ a  F9 n) u; U
  112.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
复制代码
# E/ D- [6 g5 _9 M

* Q( N$ H9 G9 U' w7 P  Y" ], h
+ }" f* V6 }! h0 J* [/ x然后打印输出的结果是:: w) \2 B2 t+ S8 Z
) S2 D* ?: D- b
3 A- z$ s7 f  X1 M
AT24CM02 第262144个字节中的数据是:0xff
5 d" a( Y; T" a+ j# e( p; j" _* M( o AT24CM02 第131072个字节中的数据是:0xff7 t& N* _7 y+ g0 o" g
AT24CM02 第65536个字节中的数据是:0xff
0 E# A. q' v6 j- A( S/ a AT24CM02 第262144个字节中的数据是:0xab, e4 M' x4 |7 E- H
AT24CM02 第131072个字节中的数据是:0xff
+ e& F! I& W  `. b* [2 k1 c5 e AT24CM02 第65536个字节中的数据是:0xff
/ y: I5 g7 i7 s* V& j. a  d! @$ Y AT24CM02 第262144个字节中的数据是:0xab
. L6 ~  x) b+ ~; O AT24CM02 第131072个字节中的数据是:0xcd: p) U3 n% F, }$ h, G' ]+ v
AT24CM02 第65536个字节中的数据是:0xff! T8 ~- C( i  v5 L3 [3 _
AT24CM02 第262144个字节中的数据是:0xab
$ X0 ]6 D1 w# I5 j AT24CM02 第131072个字节中的数据是:0xcd. P! K% _" }1 E. V. @$ c
AT24CM02 第65536个字节中的数据是:0xef
1 \7 c. K/ q' ]- s7 g  J6 D9 x AT24CM02 第262144个字节中的数据是:0xff
* t: l9 a4 v( Y0 } AT24CM02 第131072个字节中的数据是:0xff6 n# G5 h: D+ F: c- `# a
AT24CM02 第65536个字节中的数据是:0xff6 M1 w( B4 _4 M* h1 p4 e8 l
# f7 Z: m8 G: ?) r. a
2 |0 h2 s9 }9 e9 c! S

) I+ r* ~+ c! A2 d6 H9 Z补充说明一下,上面我开启了看门狗,所以用了喂狗处理,不用看门狗的话用 __nop(); 也是一样的8 N# i/ ], m5 s7 \0 m% S
ikxlf 回答时间:2019-8-4 14:01:40
评价一下:功能没问题确实不错,但是问题有一下几点:
% w1 Q0 k  V& s1 C1.代码太累赘,重复的太多  封装性太差
, E% N5 s& \% R2.代码不规范,格式上实在不敢恭维
  ?+ ]; i3 ~5 N; J9 D+ I% I8 b9 j! x3 m) X
让我评价打分10分给3分
奏奏奏 回答时间:2019-8-4 14:39:52
斯文人 发表于 2019-8-4 14:01
8 S$ S7 t+ P8 ]; t( N" i+ U评价一下:功能没问题确实不错,但是问题有一下几点:+ V& C4 ]4 E5 A' i
1.代码太累赘,重复的太多  封装性太差6 m5 z2 m, E/ C" ~" ^4 r
2.代码不规范 ...
- D. m0 b4 q% ?9 _' c' w- \
有请这位大佬展示一下要是你怎么封装?" Z1 ]2 j5 t: p9 ^5 M
注意一下 沙发里的代码作用是演示怎样代入使用,并且通过打印证实了并没有只用到低16位地址的存储空间,: n  y7 Q/ `, ]
主贴上的无论是 读取 还是 写入 函数 都只有 return 一行代码,并且保持HAL官方库的风格。
奏奏奏 回答时间:2019-9-1 09:19:21
今天修改代码时遇到EEPROM升级替换源代码问题,: I; T- `2 ~8 Z0 Z8 |% Y
所以把可以直接替换的改了一下封装函数的入口形参,保持与官方一致,方便已有工程的EEPROM读写代码直接替换函数名
4 e/ ^! t6 K4 S: L
3 S6 r2 ~, F! f" s4 Q+ W
4 G: }3 G6 i! i5 J# b( d" }4 M

  1. + ~7 \4 a) }% M  F6 r+ j
  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重新封装读取函数( p. I7 C0 a1 o2 E
  3. {
    % g( B; {6 j2 `  m# ?! d4 j" V* \
  4.         //6 W) w- \6 {$ b
  5.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);
      o! h) [: U% r' u2 H/ p' n
  6. }
    1 E5 ~( R; u# Z- z* i$ _9 O8 I

  7. * C( @. E5 c+ s+ F7 X4 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重新封装写入函数+ I! t. O0 W1 `
  9. {, X6 Z7 ?+ G, D* t6 M
  10.         //
    ( ^( s; H# g9 g1 @
  11.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);% h; R4 w+ z* m, W+ I* X+ H
  12. }
    " |) h0 U: o6 k! X" ?
  13. + Y, S0 b  S" M  N* P, B
复制代码

" o" t# P! W7 X- ]0 L0 l- t5 ~. o4 u4 g0 B: ^- [, N2 J

所属标签

相似分享

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