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

重新封装函数读写AT24CM02

[复制链接]
奏奏奏 发布时间:2019-8-2 22:03
: w& C# n5 |7 I4 w  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重新封装读取函数
    6 [; Z5 I& C- {$ ]
  2. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout);        //        根据AT24CM02重新封装写入函数
    , s' ^1 A% K1 l
复制代码
. p) Y- K% Y+ ~

0 o, i, ]8 z2 b+ |0 k+ q  c0 f
上面两个函数声明放在下面两行中间,避免重新配置STM32CubeMX后被覆盖删除。

5 u6 _! A7 M( c! }. G5 t4 z
/* USER CODE BEGIN PFP */

. u6 [+ v8 }  p. V+ G8 ^6 s
/* USER CODE END PFP */

+ w) }: z# W- ~; H( b# @8 L8 i, O# {) a6 c* i- ?  s1 C) J& @9 i3 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重新封装读取函数& [& k! @7 d# ~5 m
  2. {
    3 J8 L$ h8 S/ J( D: D3 N
  3.         //
    4 ^  U/ y7 I, [0 O
  4.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+0xA0),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);
    & D2 _) T5 q' F
  5. }
    / H/ Y) x: a% }- @

  6. - N% D$ _1 U1 O  ?9 r' I
  7. HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout)        //        根据AT24CM02重新封装写入函数& U6 M/ M+ L/ P* V' c$ V$ k
  8. {
    * g. t4 O( I% u( a9 y7 I' Y+ A
  9.         //
    ' C- n9 R2 v8 K+ y
  10.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+0xA1),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);) n2 X7 j* D" N" J8 c" R0 I, G( _
  11. }
复制代码

& b( @8 b% z; N1 `: K3 J
* K# y! Y# D( x% j3 u( v: ?+ _+ l) q& r9 G- N
后面两个函数放在/* USER CODE END 4 */”上面,“/* USER CODE BEGIN 4 */”下面,避免重新配置STM32CubeMX后被覆盖删除。

$ h1 ?3 [: `6 N
使用前提是:
软件上用 STM32CubeMX 配置工程,选择HAL库。
硬件上芯片的A2引脚不接入IO脚使用,如果需要用到2片AT24CM02的同学当是留家庭作业自己回家做了,这里就不讲了^_^

9 C' t6 X) _9 X; }1 O! J* j2 `
之前发了个求助贴,得到大佬们的提示,终于明白是怎么回事了。所以做好分享出来,让同行少折腾。

9 I; i, O, S, J' G) N
收藏 1 评论4 发布时间:2019-8-2 22:03

举报

4个回答
奏奏奏 回答时间:2019-8-3 06:16:28
忘记了写一下使用上的示例测试源代码9 g8 s3 r$ i6 n  a& a+ d7 {& t# b
/ ~1 t. f8 J& S4 e+ t. u7 b
  1. //        测试AT24CM02的最后一个字节的读写, @# W$ p4 G; i) N1 ^- j+ r
  2.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    ' @9 j+ D3 M) C4 T
  3.         {+ z; W' |0 ^8 |
  4.                 HAL_IWDG_Refresh(&hiwdg);
    5 r7 ~& t. F0 Z7 L7 V
  5.         }
    , |$ W" P% b0 X  K! s
  6.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);" c5 ]/ X9 d3 x: c' v
  7.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)( I. y, O7 T8 {
  8.         {
    / \4 T  q* f' Y! u4 Q
  9.                 HAL_IWDG_Refresh(&hiwdg);0 U0 B% }; U2 x8 o5 V4 m- N
  10.         }$ f5 s) q% h8 d5 y. n5 I4 Z# X
  11.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);# k7 Z+ x6 v3 A+ }# e3 g+ s
  12.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)) y$ A) a: B$ J
  13.         {8 l. j' Z9 z" X
  14.                 HAL_IWDG_Refresh(&hiwdg);
    , ~; Y* z! f0 C  f! C
  15.         }
    6 F/ C" O' j( \3 ~: p) _7 n' W; E3 f
  16.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);9 Y( p3 p% X# Y/ k
  17.        
    " z  e. r3 p" s" c' ^( {& g" N% \
  18.         WriteBuffer[0]=0xAB;5 }% P3 J! x& k* |/ }0 [. l  y
  19.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)8 W: e- E4 j( b+ K" p1 m2 q3 e
  20.         {/ g5 D( ~7 y9 L
  21.                 HAL_IWDG_Refresh(&hiwdg);* P% ^3 ^" Z# e5 Y1 ]4 r
  22.         }% d6 V& T% Z) |2 F2 S$ c( Z! c
  23.        
    1 ^0 N! u6 M  O. W5 l
  24.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)  ~* {( i, F# W
  25.         {
    & |. v' Q# ?+ K" Z- I3 h% }" |
  26.                 HAL_IWDG_Refresh(&hiwdg);
    / {  Z8 {2 @( X
  27.         }8 N- ?7 G0 O" |
  28.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);- g2 W2 m8 z: f0 j7 A: M  s
  29.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    % i* [, {; ^. V5 B% S
  30.         {
    ( f/ [5 ]: Z3 R" \& P: D
  31.                 HAL_IWDG_Refresh(&hiwdg);
    , I) d/ G$ y1 ~
  32.         }- Y$ j1 U6 ~7 z0 j
  33.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    ) g1 ?8 m$ E4 m% [4 v
  34.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)) u: h7 ~8 d# `# E1 ~1 R
  35.         {4 W/ [( U$ P+ Z- e$ D( l
  36.                 HAL_IWDG_Refresh(&hiwdg);  S; y* S7 ?# u' R+ H
  37.         }8 d1 U( f& T6 W, F
  38.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);2 `% h: E4 y0 F" Z! S
  39.         4 K* W- S1 u0 l5 M% j
  40.         WriteBuffer[0]=0xCD;- w) W- `9 B. l. s
  41.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    # h8 L) E0 s$ B; \, Z
  42.         {8 l3 [1 _7 h7 ?9 U  `; i
  43.                 HAL_IWDG_Refresh(&hiwdg);
    : D  t& e; z9 ~3 p2 I
  44.         }
    8 x- H$ [3 u- C; b7 v
  45.         2 f1 O7 d7 U, c: }, p; p7 _) J) N. h
  46.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    * |& u' a6 L  `8 q* ^6 W& O
  47.         {
    * p7 p+ Q! @- u- y! U$ P- T
  48.                 HAL_IWDG_Refresh(&hiwdg);' d+ @' Y1 q9 G6 Y
  49.         }  E. r9 ?0 A% }8 J" T) k# N" l6 o
  50.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);+ I1 Q1 k, l, r" Q
  51.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    ! R# |" ~! ~( Q% x
  52.         {
    0 l' y% {, r) G- u7 O! V
  53.                 HAL_IWDG_Refresh(&hiwdg);7 z7 M' r9 b+ P! J: n
  54.         }
    # C& l1 y+ S. N1 J, l
  55.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);  O% v, ~$ A0 p
  56.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    $ t8 `2 b+ I6 y& e* b( y* q  c( V
  57.         {
    $ g) M' ?4 Y; q+ q' X( J9 i7 b/ F& _; F/ v
  58.                 HAL_IWDG_Refresh(&hiwdg);" E$ H- c- E) v& O
  59.         }
    & I: O9 k6 v, H& |
  60.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
    7 Y* d$ q" A( ]+ S
  61.        
    3 i$ [* ]# o* t- }- x, O1 V
  62.         WriteBuffer[0]=0xEF;
    7 o# Y& [' H2 Z" X0 ?7 j
  63.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)$ \/ I+ u$ r8 E8 N- F) @( i$ o9 ^
  64.         {. @, ~. R  a7 ]6 w+ Q' l4 r( C
  65.                 HAL_IWDG_Refresh(&hiwdg);
    ) W5 y) X* n& o- W
  66.         }  k' j# T( F; F
  67.        
    ! r- M7 K' |3 F4 Q. P1 E& V
  68.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)6 W+ Z6 e6 K9 ]# B4 {1 x% I: [4 m
  69.         {5 J0 S3 Y# t2 }9 w- _" R, c, t
  70.                 HAL_IWDG_Refresh(&hiwdg);
    % `9 q/ T8 d0 _+ x5 R
  71.         }: N  \* s4 q- {9 C' T& t) V
  72.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    * G: l' m2 K4 X  Q/ Q! f; ~& ]1 B
  73.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK); o7 I4 ]7 S( ^; m8 J
  74.         {* C# F5 p& ?" h# A4 l, b3 ^
  75.                 HAL_IWDG_Refresh(&hiwdg);
    3 ~# ], N% P/ G) c7 T7 Q6 X
  76.         }  s* k0 s( k. g8 }
  77.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    0 a! l. s1 W& k. X6 a; f0 X
  78.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)0 Y4 T; t  G* w% c7 V
  79.         {
    2 C: X: a; _. J1 @
  80.                 HAL_IWDG_Refresh(&hiwdg);; u5 K- S7 z7 d# L8 U9 u5 o
  81.         }( U& w' d( Q- R6 H% \" F0 t
  82.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
    * `( v' f* l7 a  ]
  83.        
    % h, g1 c8 r# }. O
  84.         WriteBuffer[0]=0xFF;
    % Y6 o+ `4 ]# H: r" i0 n0 Y
  85.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 65535,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)
    & ^1 X- d3 X6 p3 R4 b
  86.         {
    0 G: D! ]  ^* w* u5 }( ]9 e1 f
  87.                 HAL_IWDG_Refresh(&hiwdg);0 H2 N- \% d% i6 E
  88.         }
    ( M/ F# B& C* z7 x. P) [! k" W: g
  89.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 131071,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK)! K* K2 w+ N2 A/ i) K) K
  90.         {
    & ]8 K7 i0 Q) a9 f% L- L
  91.                 HAL_IWDG_Refresh(&hiwdg);2 [' {  @# D' f- w  @7 E
  92.         }0 W/ l% o* ~; T' w1 ?
  93.         while(HAL_I2C_Mem_Write_AT24CM02(&hi2c1, 262143,WriteBuffer,1, 0xFFFFFFFF)!=HAL_OK). {; u& x6 S. X" r4 Y, Y
  94.         {- r& C. f  b: M) q+ p
  95.                 HAL_IWDG_Refresh(&hiwdg);
    " {+ i0 [# O9 }: ^5 i* N  B/ {
  96.         }; G8 b, w: u* Y  Z% k/ u7 u
  97.         * _+ S! g, g# c; r/ e( b( l, M
  98.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 262143,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)' t3 V# {/ t, v( p5 D2 |/ t( D/ \
  99.         {
    % c% p1 {' t7 t- H
  100.                 HAL_IWDG_Refresh(&hiwdg);. K$ Y, v# M/ ?
  101.         }
    1 ]: h8 Q) m, D: Y2 a& r
  102.         printf("\n\r AT24CM02 第262144个字节中的数据是:0x%x",ReadBuffer[0]);
    3 A; U- a) Z2 y9 k) Y  \
  103.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 131071,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)7 e7 a  @& r8 P. C2 E
  104.         {
    + _$ j9 M& p; C# J0 d
  105.                 HAL_IWDG_Refresh(&hiwdg);$ S, b$ a" y8 U3 J8 n" j
  106.         }
    6 E( G; p0 z5 r" {+ N& l
  107.         printf("\n\r AT24CM02 第131072个字节中的数据是:0x%x",ReadBuffer[0]);
    6 w* B9 C2 a" P4 Q+ s( N
  108.         while(HAL_I2C_Mem_Read_AT24CM02(&hi2c1, 65535,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK). n! X/ g8 P7 x1 h# a( x
  109.         {1 g0 |! g2 [' s/ g9 D6 `& Y6 _1 m; a
  110.                 HAL_IWDG_Refresh(&hiwdg);( Y. @5 l& l0 `
  111.         }
    " T! g* A% S9 o1 U& r2 `7 n
  112.         printf("\n\r AT24CM02 第65536个字节中的数据是:0x%x",ReadBuffer[0]);
复制代码

7 ]1 |: \) b4 F6 A& S- {5 D( `, x, P8 v0 }  h- q+ D- S9 w
* L- d- M. E/ r. |$ d8 Q5 i: S/ m+ q
然后打印输出的结果是:$ X) m, J7 b7 U* I0 \- r( t8 r

7 r% {0 f  j. O' U* n
1 Q* j/ i& J0 g% L% h5 [ AT24CM02 第262144个字节中的数据是:0xff2 [2 U& w' l" l8 g
AT24CM02 第131072个字节中的数据是:0xff
% G- h9 |' [# b4 y3 H: g# Y) \$ @ AT24CM02 第65536个字节中的数据是:0xff* M; B, G* l! U, }4 ?0 z
AT24CM02 第262144个字节中的数据是:0xab+ F% F+ E; A5 H4 u
AT24CM02 第131072个字节中的数据是:0xff2 J5 ?4 b# g4 [1 `
AT24CM02 第65536个字节中的数据是:0xff
2 G7 N6 B- j; d( T2 W! [ AT24CM02 第262144个字节中的数据是:0xab
! |7 R& M& a; }# y1 s) a( _: q AT24CM02 第131072个字节中的数据是:0xcd
8 K. i  y" ?6 F7 v  P8 j AT24CM02 第65536个字节中的数据是:0xff
" N  R7 E% H: ^5 u- A% o$ L+ m AT24CM02 第262144个字节中的数据是:0xab
- E9 X; f; P3 P1 L0 h7 X9 i AT24CM02 第131072个字节中的数据是:0xcd6 h. m$ s9 A2 b8 c0 k6 b4 X$ a/ v
AT24CM02 第65536个字节中的数据是:0xef0 G* y- B4 S' j" B- w. T% ^
AT24CM02 第262144个字节中的数据是:0xff( Q- y  j; V2 c; q& ^8 Q: w
AT24CM02 第131072个字节中的数据是:0xff
$ M% _- n& d' L( [ AT24CM02 第65536个字节中的数据是:0xff6 q3 V7 A, ^/ l6 z* u0 R, }
5 @% @' j* \' w* w
1 U- @$ C! r* `3 p9 @0 e

3 ~+ B5 L6 ]; R补充说明一下,上面我开启了看门狗,所以用了喂狗处理,不用看门狗的话用 __nop(); 也是一样的1 S$ N0 w/ D' m4 O9 S
ikxlf 回答时间:2019-8-4 14:01:40
评价一下:功能没问题确实不错,但是问题有一下几点:
5 K$ T( e1 U) [8 Z1.代码太累赘,重复的太多  封装性太差' E8 @" |0 S, _2 G( A
2.代码不规范,格式上实在不敢恭维
  E0 R! ^# h: t+ ~+ ]4 U) c  z$ y+ i' P4 p4 [6 r0 f/ S) T
让我评价打分10分给3分
奏奏奏 回答时间:2019-8-4 14:39:52
斯文人 发表于 2019-8-4 14:01
8 D1 n& q5 q/ G' ?( a评价一下:功能没问题确实不错,但是问题有一下几点:/ _) j8 G/ o' u) [
1.代码太累赘,重复的太多  封装性太差5 ~( s* [+ I3 z& M; ~& i7 X% q
2.代码不规范 ...
# o. S+ j3 D/ G4 J* X
有请这位大佬展示一下要是你怎么封装?8 G* U5 e' n9 O# A0 R" X- C
注意一下 沙发里的代码作用是演示怎样代入使用,并且通过打印证实了并没有只用到低16位地址的存储空间,9 ]- m0 Z: t, \  k5 `! @. K" Q% ?
主贴上的无论是 读取 还是 写入 函数 都只有 return 一行代码,并且保持HAL官方库的风格。
奏奏奏 回答时间:2019-9-1 09:19:21
今天修改代码时遇到EEPROM升级替换源代码问题,
+ o  @- e1 P! T1 V& s所以把可以直接替换的改了一下封装函数的入口形参,保持与官方一致,方便已有工程的EEPROM读写代码直接替换函数名+ s2 S& v0 i4 a+ w  C1 e1 l

+ e. D: T3 ^: a+ ?2 M4 R% o
, Z1 `( I( C' x( P* N+ ?9 j' e9 n
  1. 1 E3 c9 m1 ^4 \% o/ c
  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重新封装读取函数  m; ~% v) `7 t. M4 i: ~
  3. {: H( [8 _( `4 f- n
  4.         //
    : g! o+ ?% r% t! i7 V
  5.         return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);
    2 V3 O- K% C1 y* R
  6. }/ C: ?2 B) c' i% Y7 R5 @! W+ i
  7. 6 ^6 n1 E. p/ J3 |, a
  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重新封装写入函数/ w3 C# m6 n, x: g3 f4 Y' x/ l
  9. {
    ! S7 g( n# G1 U& O- |) g( `
  10.         //
    % C0 \: N# R) M8 z
  11.         return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+DevAddress),(MemAddress18bit%65536),MemAddSize,pData,Size,Timeout);- D. J: i' F" v$ j! Z% P& z1 ]
  12. }
    ; ~2 ]+ C" `* ^1 [
  13. * S7 n4 S0 k. o' T4 f6 D
复制代码

+ q! }* X5 F& K! z& O& X% t: m: N

所属标签

相似分享

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