* Z3 }3 C Q2 h' u0 n
- 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/ `
- 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
- 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
- { p) `, L& b" t) t9 J1 r! r& g
- //3 @ V: ^2 |2 @$ M
- 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
- } y3 U3 T2 |* g% G
' T! d/ F6 |. k. n- 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
- {& I* {/ @4 R, M7 O8 ]; m
- //
) u4 ~, u3 G9 I$ K - 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 - }
复制代码 * 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' `, {
|
' y" W) ~; ]( N& W* e3 ?; n
然后打印输出的结果是:% R* Z. e ^+ I2 d# M
6 N) y- Z0 A( L/ u7 L+ H
AT24CM02 第262144个字节中的数据是:0xff( x% h* J; U' u7 L7 Z& j
AT24CM02 第131072个字节中的数据是:0xff
AT24CM02 第65536个字节中的数据是:0xff
AT24CM02 第262144个字节中的数据是:0xab
AT24CM02 第131072个字节中的数据是:0xff: R6 [# A, m( @' A, T! z! Z
AT24CM02 第65536个字节中的数据是:0xff
AT24CM02 第262144个字节中的数据是:0xab6 |1 Z& |, H( V4 C6 z. v
AT24CM02 第131072个字节中的数据是:0xcd
AT24CM02 第65536个字节中的数据是:0xff! R5 A2 q. _, M
AT24CM02 第262144个字节中的数据是:0xab
AT24CM02 第131072个字节中的数据是:0xcd& j1 G/ f; @# N
AT24CM02 第65536个字节中的数据是:0xef
AT24CM02 第262144个字节中的数据是:0xff. ]- h" N, v6 C( K/ r
AT24CM02 第131072个字节中的数据是:0xff
AT24CM02 第65536个字节中的数据是:0xff, U, A' E; x& \) ^2 f
0 m6 p4 g- C' t$ {7 g8 T9 I
补充说明一下,上面我开启了看门狗,所以用了喂狗处理,不用看门狗的话用 __nop(); 也是一样的
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分
有请这位大佬展示一下要是你怎么封装?
注意一下 沙发里的代码作用是演示怎样代入使用,并且通过打印证实了并没有只用到低16位地址的存储空间,: `, }3 q" R5 e' q8 u y
主贴上的无论是 读取 还是 写入 函数 都只有 return 一行代码,并且保持HAL官方库的风格。
所以把可以直接替换的改了一下封装函数的入口形参,保持与官方一致,方便已有工程的EEPROM读写代码直接替换函数名
! n! h9 p# i S