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

重新封装函数读写AT24CM02

[复制链接]
奏奏奏 发布时间:2019-8-2 22:03
/ Q( U3 q5 Q7 [3 r
  1. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout);        //        根据AT24CM02重新封装读取函数
    3 p+ T; c  s0 W7 x0 P
  2. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout);        //        根据AT24CM02重新封装写入函数/ Q  N; d8 y' b: ~) }4 R+ J
复制代码

; c0 D' b% v2 ?; H: ]- I' u% z  U! u# l/ n. Y0 v
上面两个函数声明放在下面两行中间,避免重新配置STM32CubeMX后被覆盖删除。

, ~9 R7 X- d- K
/* USER CODE BEGIN PFP */

" b& `) P  J' S3 j2 V8 r
/* USER CODE END PFP */
" ~% ?; {* l% j! y

6 F' U" K7 ~& Q7 D" m
  1. HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装读取函数. p; `  x2 B3 d5 {
  2. {
      v) G, P' L4 |# x
  3.         //" q% ]2 N  m$ A+ \
  4.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+0xA0),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);
    % A4 O' b6 ?# L
  5. }
    : N1 W$ G6 }& N+ p4 ?
  6.   O* K7 g% i% F9 e, v* `
  7. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装写入函数
    ! F' B4 |" G$ f6 v
  8. {5 N* ~# v7 C0 n
  9.         //
    7 x8 r" c$ J# q! ^  s" ^
  10.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+0xA1),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);! D5 j" {! a" Q* r7 m1 [
  11. }
复制代码
1 |3 s, D9 E$ w( w

' w* {; I: S! U  f) e! W
: A$ Q% N6 Y. t# K6 @1 [9 p
后面两个函数放在/* USER CODE END 4 */”上面,“/* USER CODE BEGIN 4 */”下面,避免重新配置STM32CubeMX后被覆盖删除。
7 T. k) E1 r! B
使用前提是:
软件上用 STM32CubeMX 配置工程,选择HAL库。
硬件上芯片的A2引脚不接入IO脚使用,如果需要用到2片AT24CM02的同学当是留家庭作业自己回家做了,这里就不讲了^_^

: ^8 _7 e3 x) M! B5 Q
之前发了个求助贴,得到大佬们的提示,终于明白是怎么回事了。所以做好分享出来,让同行少折腾。

! @, h; c0 K! Y9 l; j
收藏 1 评论4 发布时间:2019-8-2 22:03

举报

4个回答
奏奏奏 回答时间:2019-8-3 06:16:28
忘记了写一下使用上的示例测试源代码
' A$ h9 E2 N% y( D& u+ {* S% q- H) W
  1. //        测试AT24CM02的最后一个字节的读写: `( p( k: C( O4 ?  E) @: b
  2.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    / n% Z: g) i. ~: N
  3.         {
    * Y5 U" _- c" F+ m5 T9 _6 N
  4.                 HAL_IWDG_Refresh(&hiwdg);+ U. @/ W& H" j% E' g+ E
  5.         }
    0 O, Z; y8 j9 v& j+ _$ F
  6.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);+ a) t$ h8 x" |8 o
  7.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    # Y! M4 w% o( D8 \; u
  8.         {/ f) Z! H' g* \; d0 d# A# T9 V  Q
  9.                 HAL_IWDG_Refresh(&hiwdg);
    4 ^( Q" X+ L3 W* d% o% U' @
  10.         }7 s- O! F& h4 f! ~  U7 y
  11.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    2 z* r: n  r3 M9 Z. @9 ~7 n
  12.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)% l: o; g0 q$ N0 O( j1 J
  13.         {: W# p; u( b+ A" f8 H+ I1 W; U: U
  14.                 HAL_IWDG_Refresh(&hiwdg);
    5 y" x7 n; d2 O% d! v* |
  15.         }
    ! Y- g4 @' u6 W3 F- ?5 `. P
  16.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);, {2 H9 _4 A' k; P: ?3 b
  17.         - N* ~9 U  z5 C) z2 X! X, i8 @% @- i
  18.         WriteBuffer[0]=0xAB;
    ' z8 O6 y4 \9 E" G1 I
  19.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)) h, Z, l1 M4 }) C
  20.         {5 s4 h  o% v7 }7 B
  21.                 HAL_IWDG_Refresh(&hiwdg);
    / ?& J9 d2 @' @8 l6 D3 F/ R
  22.         }
    2 ~( U- }% q1 u/ ~2 K9 i/ o2 H
  23.         9 @: N8 [- W# w) o, [
  24.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)& K* K' z; P' E, B
  25.         {6 S. m' i$ g& n
  26.                 HAL_IWDG_Refresh(&hiwdg);6 N) Q" Z7 G/ U' A& {
  27.         }
    7 A0 _% D5 P4 _- |9 X- Q2 d
  28.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);9 U6 \4 U& X$ [) z: W( |
  29.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)7 t! n+ z, j- M) |
  30.         {' x2 c$ L/ W0 ]& U/ @1 e
  31.                 HAL_IWDG_Refresh(&hiwdg);2 Z2 a' o4 F3 k
  32.         }
    % E* o) V/ v% J' Y4 _1 A
  33.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    ) h3 b$ N# v1 S% z% C
  34.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)2 V! H3 G9 B" z
  35.         {
    , q9 T  G+ `6 ?* b* p
  36.                 HAL_IWDG_Refresh(&hiwdg);$ X$ M# n4 S2 g6 ^- K
  37.         }
    ! g( g: A/ ]2 L% t! V( z) t0 m
  38.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);2 x) N" T) X) y2 O$ K3 V
  39.        
    ) j6 Z# d; e: C+ w: {
  40.         WriteBuffer[0]=0xCD;
    6 t0 w# _$ F; G! x: e
  41.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    ! d) K  L3 C9 F7 z% Q! p. d2 G7 ~
  42.         {
    3 B) B# W5 `* O) R5 e6 R& H. _/ l+ [
  43.                 HAL_IWDG_Refresh(&hiwdg);7 H! K7 C5 h5 r
  44.         }5 o: l/ ?! J4 p% W0 v
  45.        
    6 ~7 q# J# P3 `5 o: Y( n
  46.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    9 U; q+ e% Q6 }
  47.         {
    6 m0 t8 D! P+ D! P- L6 m; w
  48.                 HAL_IWDG_Refresh(&hiwdg);
    6 q1 S! h* N2 O: |2 P
  49.         }  M; o' y9 h2 p: U9 S) |5 L6 E& u
  50.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    3 f4 A) W# O2 d/ h
  51.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    9 M8 F. |5 z) f/ n* ]; R
  52.         {& w( D3 S4 O- |
  53.                 HAL_IWDG_Refresh(&hiwdg);) w* M" \; Z8 P# ?# _! _8 F0 K& Y: T4 c
  54.         }
    7 e7 w! }- k3 v
  55.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);; {7 z. c: [. L  ?+ G
  56.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)- t* C$ ?' U+ f6 ]# s8 H7 m
  57.         {; j/ Z: E1 a% ]1 z$ p4 T
  58.                 HAL_IWDG_Refresh(&hiwdg);/ X& Z" A4 I6 N- S+ F
  59.         }0 q0 N+ I2 M* Q8 h7 }$ E
  60.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);2 v! V/ W- [1 i/ `, t, H
  61.        
    8 A% d  m/ f. P* L( W2 L
  62.         WriteBuffer[0]=0xEF;
    3 O( L  I9 i3 _% q
  63.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)  d. K# Q% U5 Y5 b$ E+ g$ ^* F
  64.         {
    2 }0 o6 @7 c% b; c6 |
  65.                 HAL_IWDG_Refresh(&hiwdg);
    # u+ Y1 o# ^5 c/ G
  66.         }
    ) f) M/ C7 C6 I9 \* I, }# B
  67.         % i5 s0 m. u7 M: p. [
  68.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)7 X- m* J: t' S
  69.         {+ I3 t  ]/ b% t4 c. Y7 \
  70.                 HAL_IWDG_Refresh(&hiwdg);5 G& @$ G& b& J* G( z5 L
  71.         }5 m  }( S6 Y9 n/ ?7 q
  72.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    5 e/ Z4 h, \' d1 B4 L! G" {! l
  73.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK), s7 a4 I& y7 q- b& a/ E) z
  74.         {
    2 O3 h9 q1 Q3 c$ _1 i
  75.                 HAL_IWDG_Refresh(&hiwdg);
    ' N4 C3 R( R6 {. K
  76.         }
    3 |) r1 w% P. R7 {" Q5 \+ {
  77.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);# O" s; m( X6 }. U/ ~" W. w
  78.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)+ e  z4 Y/ x  u! S; a( @5 k
  79.         {, d% F( [3 b& @5 m2 A) R5 \
  80.                 HAL_IWDG_Refresh(&hiwdg);2 O. {! L5 p% ~. x/ t+ K
  81.         }
    ; q# Z: W6 U$ G- K1 {! l
  82.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);0 m# y0 O( P$ y, N* t) a: l0 Q; {+ _
  83.        
    # P) c8 y% X1 R
  84.         WriteBuffer[0]=0xFF;
    6 a+ K- X/ v; y" q2 E0 K9 T5 j# p
  85.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK). b# w0 e8 Y; H# v) U9 w. V% p1 K
  86.         {
    # k1 j: C: a% J. I
  87.                 HAL_IWDG_Refresh(&hiwdg);: J2 V1 i. [! @' s) G
  88.         }
    - T4 @2 Q: i) X- O
  89.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    6 e" F3 d. w8 P' u; v
  90.         {
    * G, V$ h+ C8 d7 \
  91.                 HAL_IWDG_Refresh(&hiwdg);1 L# S6 ?2 a% \
  92.         }* H  L6 K7 b8 C2 L
  93.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)3 \8 z! E  B$ T+ [5 r- m
  94.         {
    ; }" |7 P  P  d4 r, c! G  M) W
  95.                 HAL_IWDG_Refresh(&hiwdg);+ L0 T( w/ N& S$ T
  96.         }" f6 D: X" I/ R# u' d0 j" b$ Q
  97.        
    8 t0 |; ^$ |- h( W
  98.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    : t. L( D( @* G5 K5 o
  99.         {" y+ Q) Y; b% q: U. _/ ~9 s; t4 @
  100.                 HAL_IWDG_Refresh(&hiwdg);* b, v. }6 D9 r
  101.         }
    ' F2 ~1 i8 q1 ?2 Q
  102.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    ! e: z/ t4 z7 \8 D/ m
  103.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    " X( b3 x1 `& h) s- L' {; }
  104.         {
    9 r$ v/ j/ f0 Z& D% }% V/ ]$ x: N5 v
  105.                 HAL_IWDG_Refresh(&hiwdg);
    5 e, H/ K- f3 W( P  y: n
  106.         }
    : p2 U0 T5 c- ?# B; q5 F
  107.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    # _+ i/ t2 Q( H& @
  108.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)" g$ t! E) k  @2 a$ F( ?( V
  109.         {
    / m4 u, C. {0 n* T
  110.                 HAL_IWDG_Refresh(&hiwdg);
    " N5 Y0 _; g  U8 W
  111.         }
    1 P  f6 ~, F, K  ~. Y% U
  112.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
复制代码
( S3 J( w2 W0 |( @

  s4 z: A* ~8 e6 _8 T1 a2 P, ^- Z  J% O$ k" m* m( I
然后打印输出的结果是:: A8 o" }+ v9 l% i! m. p" x
* @; B! _7 A# o5 s0 a  G" K+ i

4 @/ y- c0 n0 }3 x$ u AT24CM02 第262144个字节中的数据是:0xff, }! k3 _% ?- h' A
AT24CM02 第131072个字节中的数据是:0xff
  v* S+ d0 R8 \) A8 A AT24CM02 第65536个字节中的数据是:0xff
8 B2 r- Q( h, }. n AT24CM02 第262144个字节中的数据是:0xab
' N) z% K! \2 T4 W" K" T" \ AT24CM02 第131072个字节中的数据是:0xff! D% {- B, Y; w
AT24CM02 第65536个字节中的数据是:0xff% D2 L' N2 i% `( a# A8 _" ]
AT24CM02 第262144个字节中的数据是:0xab
$ K$ `% N1 `0 f+ Z AT24CM02 第131072个字节中的数据是:0xcd
. J% i, t3 U* m% F; k0 c$ @ AT24CM02 第65536个字节中的数据是:0xff: Q, n" w% U4 \
AT24CM02 第262144个字节中的数据是:0xab
0 u% M3 \2 h9 R6 ] AT24CM02 第131072个字节中的数据是:0xcd3 c. ^/ C' I; _7 F* w$ M+ d
AT24CM02 第65536个字节中的数据是:0xef
$ m$ J, L" `9 j) e AT24CM02 第262144个字节中的数据是:0xff, k+ V% _5 y0 B1 {
AT24CM02 第131072个字节中的数据是:0xff
5 N9 j5 d( F" g7 b AT24CM02 第65536个字节中的数据是:0xff
; h/ Y, i: h/ H
1 z& m0 k7 G4 n$ I2 @$ u( o
+ F/ B4 `: i1 U5 J7 \  S

5 x$ U: p9 E( S5 t0 d补充说明一下,上面我开启了看门狗,所以用了喂狗处理,不用看门狗的话用 __nop(); 也是一样的! m: t, Z! B) }+ [( }, P/ l
ikxlf 回答时间:2019-8-4 14:01:40
评价一下:功能没问题确实不错,但是问题有一下几点:8 {$ h$ ]8 |& z4 F: |* ~/ {) [
1.代码太累赘,重复的太多  封装性太差
; p1 N1 v# }) U0 n/ U3 P( p: ^/ [2.代码不规范,格式上实在不敢恭维0 F7 z2 ]) `3 H: E
3 Z# G6 c( F( G+ P8 C4 I* R
让我评价打分10分给3分
奏奏奏 回答时间:2019-8-4 14:39:52
斯文人 发表于 2019-8-4 14:01
1 m# l4 K) {% q% H$ ~9 B: i. I  J& K评价一下:功能没问题确实不错,但是问题有一下几点:
, q! N; C% a9 N: E1.代码太累赘,重复的太多  封装性太差2 ~0 H7 Q  f& S3 }. V" K
2.代码不规范 ...

; M0 Y% b; W: ]/ y/ ~* T8 t有请这位大佬展示一下要是你怎么封装?
7 D7 b: H& G) U6 \0 e注意一下 沙发里的代码作用是演示怎样代入使用,并且通过打印证实了并没有只用到低16位地址的存储空间,8 _& R5 A8 L: H1 j+ S
主贴上的无论是 读取 还是 写入 函数 都只有 return 一行代码,并且保持HAL官方库的风格。
奏奏奏 回答时间:2019-9-1 09:19:21
今天修改代码时遇到EEPROM升级替换源代码问题,2 i0 \7 C; N) n% T, C' g5 ?; W7 u# [
所以把可以直接替换的改了一下封装函数的入口形参,保持与官方一致,方便已有工程的EEPROM读写代码直接替换函数名0 G5 a+ n' r( w0 b' i3 m

3 j' d2 E0 j% M) n- }% m8 c0 L" s; B8 o, L9 q* L
  1. 1 i7 K4 G4 e/ r& ?$ n( W( G( {
  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重新封装读取函数
    7 {( q# O! P. [6 j. W" Y- p
  3. {
    3 i6 x3 V( ~$ R  i  Z  H
  4.         //
    . V, ?/ g3 Y2 x
  5.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);
    * R9 l& |( A* L/ T( s5 @6 [
  6. }
    7 i! E0 I4 I7 t# ]3 y1 D4 `

  7. . R. {3 ?, u: W. q& _
  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 U& p; N" B/ d- c# R- q
  9. {* J3 y- B+ `5 B* }* F5 a
  10.         //
    ' Y. l! s( Q4 K- U- K7 B2 \
  11.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);
    + C' G" G: Q0 Z! U% f
  12. }+ h! W* O7 y: @7 @
  13. : |6 i7 D# f" J: y, j
复制代码

- X3 ~/ l% B/ X& P+ t
* Q$ t% V* c& Y9 {, u# ^

所属标签

相似分享

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