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

重新封装函数读写AT24CM02

[复制链接]
奏奏奏 发布时间:2019-8-2 22:03
* Z3 }3 C  Q2 h' u0 n
  1. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout);        //        根据AT24CM02重新封装读取函数( ]& Q) Z' c. W: m! _/ 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重新封装写入函数. I+ ^. J9 O& U
复制代码

0 }* o' |: D0 |" ^# ^( O. E8 E6 U; J
上面两个函数声明放在下面两行中间,避免重新配置STM32CubeMX后被覆盖删除。
4 m4 z  x, Q6 Z4 \5 Y7 i
/* USER CODE BEGIN PFP */

! z9 T3 Y* _' k* D
/* USER CODE END PFP */
7 F" @$ Z+ X4 l- ^3 _
- h1 A) b( [9 E5 X0 ?: i& P! A
  1. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装读取函数. |% I' I4 v9 W
  2. {  p) `, L& b" t) t9 J1 r! r& g
  3.         //3 @  V: ^2 |2 @$ M
  4.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+0xA0),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);8 N$ I) ~5 g: |4 `3 R: N
  5. }  y3 U3 T2 |* g% G

  6. ' T! d/ F6 |. k. n
  7. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装写入函数2 B/ j% Z! ?! O# c
  8. {& I* {/ @4 R, M7 O8 ]; m
  9.         //
    ) u4 ~, u3 G9 I$ K
  10.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+0xA1),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);
    ' j5 v' u: c! Q2 Z% K8 a
  11. }
复制代码
* l; K3 Q7 `  P

4 H% ]( B0 T7 n; c. x/ ?
3 A- g6 j6 G/ A+ {7 o
后面两个函数放在“/* USER CODE END 4 */”上面,“/* USER CODE BEGIN 4 */”下面,避免重新配置STM32CubeMX后被覆盖删除。

% h& }  m5 n! V+ _6 u
使用前提是:
软件上用 STM32CubeMX 配置工程,选择HAL库。
硬件上芯片的A2引脚不接入IO脚使用,如果需要用到2片AT24CM02的同学当是留家庭作业自己回家做了,这里就不讲了^_^

3 f: c( a8 r8 L
之前发了个求助贴,得到大佬们的提示,终于明白是怎么回事了。所以做好分享出来,让同行少折腾。
& `- h2 L( b+ p( v' `, {
赞 收藏 1 评论4 发布时间:2019-8-2 22:03

举报

4个回答
奏奏奏 回答时间:2019-8-3 06:16:28
忘记了写一下使用上的示例测试源代码
2 D# _" H4 j& G
+ m7 ~- k4 D. @) t) _7 x# P
  1. //        测试AT24CM02的最后一个字节的读写
    - F# P5 [& W- T% p
  2.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    $ j+ V2 k7 I6 {6 v% [
  3.         {; A" o$ U/ U/ B7 o( t
  4.                 HAL_IWDG_Refresh(&hiwdg);
    " L4 ?9 E$ `9 X6 U6 Z
  5.         }
    6 n7 C" t  n% I
  6.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);+ M# G. q$ D9 Z* o
  7.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)5 V$ V1 ^, X6 {' R! u( \, {# `1 u
  8.         {
    + \- y# C$ _9 U* I
  9.                 HAL_IWDG_Refresh(&hiwdg);8 t5 M! k$ F$ u% \0 t
  10.         }
      E& ^+ u( f; v/ E' h
  11.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);0 G3 Y( J# I. u, E9 J. s
  12.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    # H; j; D& ?* t3 r2 L- Q" k
  13.         {$ U4 V3 h5 X$ d3 p& C/ {% j7 I
  14.                 HAL_IWDG_Refresh(&hiwdg);) M8 E7 f! |' a" O( {3 s  U
  15.         }& T3 h$ v$ |6 @0 A+ @
  16.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);+ T* ~- R9 U) U6 M8 l
  17.        
    : o: ]0 f3 G( \/ u7 O, W
  18.         WriteBuffer[0]=0xAB;
    1 {. h' F- h3 C0 p
  19.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    3 `) w2 f# Q- U3 U1 Y+ N8 S
  20.         {! \$ t" B8 i+ H
  21.                 HAL_IWDG_Refresh(&hiwdg);
    * U, ?8 T. |3 e5 R/ D3 {8 E) g" l
  22.         }
    : x- w$ ~+ r7 J. L0 l$ e% U& F
  23.         * e! j# q$ h1 E. j8 G
  24.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK); K+ v5 U+ Z& t
  25.         {2 \" u' _2 [) x9 A
  26.                 HAL_IWDG_Refresh(&hiwdg);* J9 g  }! L6 D" C
  27.         }* V" ~, ?5 ^- A% y9 c5 ~
  28.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);7 s7 U. |! w/ [5 D+ w+ H
  29.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)0 w- U  g9 c$ K& G0 j
  30.         {
    " x+ D+ U+ x- T
  31.                 HAL_IWDG_Refresh(&hiwdg);
      z( f  p' n; c; ?
  32.         }/ d8 n5 M' {8 }- _
  33.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    " n' n, q9 E! t, ?# z
  34.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)& Q2 q8 v3 Q5 i2 }# w+ S
  35.         {
    6 t6 X6 z/ a# S
  36.                 HAL_IWDG_Refresh(&hiwdg);
    . y) |3 D3 U2 G/ H) l
  37.         }" c' r- c1 ]; `/ D9 X
  38.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);% P# J* I4 c/ [
  39.         + Z- [6 m/ a3 q
  40.         WriteBuffer[0]=0xCD;) S8 [7 ~/ @5 |& j# C; ]) I% h
  41.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)6 O% c3 N6 b+ H( W, V! @/ y* q
  42.         {/ O, V" ]) c" ~3 w# {
  43.                 HAL_IWDG_Refresh(&hiwdg);
    6 q- a7 F- A2 h! D" a/ G
  44.         }3 @0 [' l1 H. t1 D
  45.        
    . E+ `6 \8 \8 G& P- ]$ Z
  46.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    + O$ G2 k. A4 _- b
  47.         {3 H7 {: Y2 n' D# m; f' Z( ~/ v
  48.                 HAL_IWDG_Refresh(&hiwdg);- F$ \5 H: l$ k1 X7 i
  49.         }  T; s2 }/ z+ _. }
  50.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    / K. q2 J4 e9 x% E. n; q
  51.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)( E* G! H! f* s# @( f- \+ l1 v8 q
  52.         {1 [, d7 _  L8 O/ C
  53.                 HAL_IWDG_Refresh(&hiwdg);( Q& Y" N3 D' r3 t
  54.         }! ?/ p! r# V! {& `8 |0 Q2 o
  55.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);! q3 z+ x" n: M4 }: i
  56.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    0 Z- g2 @4 Y( P1 R$ V( e% V
  57.         {7 P9 o$ O" _- t$ A$ Y
  58.                 HAL_IWDG_Refresh(&hiwdg);
    + H; n' @4 K; O7 r+ R' H
  59.         }3 R8 s  O2 J6 @' T3 B2 d# H9 v1 X
  60.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);, H* V5 I. R. V4 H& G
  61.        
    7 Q, R7 T% A# w* P) E* Y
  62.         WriteBuffer[0]=0xEF;
    " ^% ?9 i% P$ k& b
  63.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    # j* r# b5 O$ r7 l+ Y9 D4 q
  64.         {
      x+ W: Z  }" w# a8 \
  65.                 HAL_IWDG_Refresh(&hiwdg);# Y, z% m! M' I1 P
  66.         }
    + y2 n4 r( l' a1 h" y
  67.        
    , n* }3 o; d3 `5 }
  68.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)5 N: v( l9 @1 H! v/ H# d6 E5 a
  69.         {
    ; Z. k, ]0 m8 F# d1 K
  70.                 HAL_IWDG_Refresh(&hiwdg);" }9 C! T- w4 O8 e! K
  71.         }
    ; s3 ~% K! A$ s9 ^6 m( q
  72.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    : I" a' J8 i5 }3 |
  73.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)" ]  k+ H3 u  c+ Q' ~% R9 Z! M' O
  74.         {- p  l, p: `! k  V- j
  75.                 HAL_IWDG_Refresh(&hiwdg);4 V# ^2 \  W3 T- ?' Z0 b
  76.         }
    ) m7 m. U/ R3 j1 I2 T- h
  77.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);" L, v- `7 p5 E$ |
  78.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)- \3 Q4 I* `! q
  79.         {' x, Y3 `$ }* i2 S' a; D0 N
  80.                 HAL_IWDG_Refresh(&hiwdg);9 r0 Z6 m) W- t+ t9 r
  81.         }# h; G$ d* j( f, _- b) @
  82.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
    7 ~1 ]! y6 v. V6 i, L' K$ k4 @. ^
  83.        
    8 {" j- A4 C( c1 M# v& Y
  84.         WriteBuffer[0]=0xFF;
    + O# V, r3 b# m7 r, p5 G/ T
  85.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)1 Z! l9 p* t8 i) j" {( ^
  86.         {0 P- j! L2 k, o, U! n
  87.                 HAL_IWDG_Refresh(&hiwdg);) Z5 n- \* o" A# H4 l
  88.         }
    - `* w+ v. ^! `
  89.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)2 V- _* t$ ]* Q! q
  90.         {0 j5 @0 E4 T6 U0 G6 W1 R3 p* `7 `8 `
  91.                 HAL_IWDG_Refresh(&hiwdg);
    ' l0 ~+ D. }1 v1 t( [
  92.         }
    ! A( N/ P* O7 \( C1 q4 Z
  93.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)( r9 l. u3 T( Y9 ?/ l
  94.         {0 B1 Z; N  ]; D) d- y
  95.                 HAL_IWDG_Refresh(&hiwdg);
    / t$ u$ n$ E8 M8 h* R
  96.         }
    9 R* b# D) O; Z: S8 ?
  97.         " l; M2 Z- t6 z" D
  98.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK): K9 m) x% U4 ?' `
  99.         {
      ], E. R! L! g% K
  100.                 HAL_IWDG_Refresh(&hiwdg);5 T; w$ ^. ~& a- r, \
  101.         }
    , t- Z( {7 M! ~8 }$ Z' e( G
  102.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    3 u5 J. Q- _# y* q" o
  103.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    9 ?+ B& C& M4 ^, K) ?/ r5 M. ^2 L
  104.         {
    ' \) [( g( N+ b& e
  105.                 HAL_IWDG_Refresh(&hiwdg);
    $ [7 H( C) `. r7 u& m  H
  106.         }
    4 Y4 Y" u2 X! [& S* i5 E
  107.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);  R5 b; w& v+ d" t% ^/ p
  108.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK); [1 p' t- K1 f# |6 j
  109.         {4 ]$ r/ E' }$ j. ?  ^
  110.                 HAL_IWDG_Refresh(&hiwdg);! A$ U: T: T* E3 G1 X9 b
  111.         }# h, X1 V* C; m. k, Y- |# l) T; n
  112.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
复制代码
7 @* Y; w' I; `* P3 v4 }; v
' y" W) ~; ]( N& W* e3 ?; n

, Y! K. L! }8 G; [% }然后打印输出的结果是:% R* Z. e  ^+ I2 d# M
6 N) y- Z0 A( L/ u7 L+ H

: q) o5 e/ c% A6 U AT24CM02 第262144个字节中的数据是:0xff( x% h* J; U' u7 L7 Z& j
AT24CM02 第131072个字节中的数据是:0xff
) [1 N8 A# \1 z+ V AT24CM02 第65536个字节中的数据是:0xff
* X) X; _9 Z1 J! i# z AT24CM02 第262144个字节中的数据是:0xab
7 h0 A$ ~1 A* g" C. K7 V1 O AT24CM02 第131072个字节中的数据是:0xff: R6 [# A, m( @' A, T! z! Z
AT24CM02 第65536个字节中的数据是:0xff
4 i& y5 _8 w0 `/ m- i0 _ AT24CM02 第262144个字节中的数据是:0xab6 |1 Z& |, H( V4 C6 z. v
AT24CM02 第131072个字节中的数据是:0xcd
  K& z( F3 g7 D/ R AT24CM02 第65536个字节中的数据是:0xff! R5 A2 q. _, M
AT24CM02 第262144个字节中的数据是:0xab
/ O* J$ j, F1 i. |4 D' D AT24CM02 第131072个字节中的数据是:0xcd& j1 G/ f; @# N
AT24CM02 第65536个字节中的数据是:0xef
) S$ [; x) O" y AT24CM02 第262144个字节中的数据是:0xff. ]- h" N, v6 C( K/ r
AT24CM02 第131072个字节中的数据是:0xff
( B: e/ l! l. T* {, Y+ h0 ` AT24CM02 第65536个字节中的数据是:0xff, U, A' E; x& \) ^2 f

/ ~& {/ ]! t$ z7 y, u7 z2 g0 m6 p4 g- C' t$ {7 g8 T9 I

& w5 c2 g4 a+ S9 B$ y. ^补充说明一下,上面我开启了看门狗,所以用了喂狗处理,不用看门狗的话用 __nop(); 也是一样的
/ r3 Z, N" p9 @+ ?( w
ikxlf 回答时间:2019-8-4 14:01:40
评价一下:功能没问题确实不错,但是问题有一下几点:3 ~  R7 k- O$ [# h
1.代码太累赘,重复的太多  封装性太差3 J3 s; ]0 r  i( q8 p
2.代码不规范,格式上实在不敢恭维: Y" s2 u3 Z  q7 J/ X8 K
2 r& W$ T9 }  Y* ?
让我评价打分10分给3分
奏奏奏 回答时间:2019-8-4 14:39:52
斯文人 发表于 2019-8-4 14:01! ^, T5 A: y, f$ Y+ {! Y% \
评价一下:功能没问题确实不错,但是问题有一下几点:
  H$ \; I( q6 R( u* b* I! l1.代码太累赘,重复的太多  封装性太差
- r( Y) w* E6 I$ _8 }2.代码不规范 ...
1 K" I  L, h( q9 }- b
有请这位大佬展示一下要是你怎么封装?
  K' p1 h7 V# f6 m; `: t注意一下 沙发里的代码作用是演示怎样代入使用,并且通过打印证实了并没有只用到低16位地址的存储空间,: `, }3 q" R5 e' q8 u  y
主贴上的无论是 读取 还是 写入 函数 都只有 return 一行代码,并且保持HAL官方库的风格。
奏奏奏 回答时间:2019-9-1 09:19:21
今天修改代码时遇到EEPROM升级替换源代码问题,* T" E2 D0 @/ K4 L4 U
所以把可以直接替换的改了一下封装函数的入口形参,保持与官方一致,方便已有工程的EEPROM读写代码直接替换函数名
: d: c) j) L% S: C  H0 q8 ?; p
4 D9 W9 f0 Q* w7 l
9 V4 f; E# A' H' r& t0 B$ E
  1. ' I  ~. A/ V) w; U7 j7 Q' V% `" d
  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重新封装读取函数  L0 H% M: y6 Q1 G' H( m# ?
  3. {5 L5 B$ W2 D9 B5 \8 ?
  4.         //; f6 x, v8 m/ @# j  {5 b, R! F* J
  5.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);
    5 L% i$ _' J; j& l+ y
  6. }
    6 }' i5 o  K  D6 |, E1 }

  7. 8 q5 o) U$ T+ E8 h0 l2 F9 o
  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重新封装写入函数
    0 ~/ r3 B4 i2 W
  9. {
    / T- ]: o4 ?- Z5 J; `: x$ z( \" }
  10.         //& M2 P" \. w4 @$ f
  11.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);. ~+ M# p7 a) X9 z, A
  12. }: I' Z9 g+ M4 @: I6 X
  13.   E% `) Y3 N4 b& v$ d  W
复制代码

5 V& O" @0 S3 R7 B3 w" I! Q* `! n! h9 p# i  S
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版