: d4 @ i- q1 a( L+ ^- x( Y- HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout); // 根据AT24CM02重新封装读取函数- [& x+ \6 D7 r+ m P- G1 T1 c/ p; W
- HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout); // 根据AT24CM02重新封装写入函数
; L5 S7 `. \, l$ ?/ f" |$ _
复制代码
! v+ H* b+ p* e. V. X( D! Y5 b$ a2 Z+ U6 w- K
上面两个函数声明放在下面两行中间,避免重新配置STM32CubeMX后被覆盖删除。 P4 J: Y7 p# P
/* USER CODE BEGIN PFP */
" N+ ^! D d" W2 }% D/* USER CODE END PFP */
6 v( M; F7 _7 z, N8 c
; O/ k( S3 g$ b5 x' w6 U- HAL_StatusTypeDef HAL_I2C_Mem_Read_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout) // 根据AT24CM02重新封装读取函数# f/ Q0 f. Y9 l! G- v
- {
! K- L0 }& F) N- V - // R {; l$ `% l% J V, b* L
- return HAL_I2C_Mem_Read(hi2c,(((MemAddress18bit/65536)<<1)+0xA0),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);5 d- E. E7 C! \, {, M) i& r+ I }
- }
' @: R! C5 m2 `# i J$ M7 v+ p - 4 O& {& W7 }( K8 u
- HAL_StatusTypeDef HAL_I2C_Mem_Write_AT24CM02(I2C_HandleTypeDef *hi2c, uint32_t MemAddress18bit, uint8_t *pData, uint16_t Size, uint32_t Timeout) // 根据AT24CM02重新封装写入函数4 A4 t# P, U% l" e4 X
- {
% o9 ^/ K" S3 B! U$ \3 [ - //8 ^' z0 m# C3 K# g) e- _: @8 ?
- return HAL_I2C_Mem_Write(hi2c,(((MemAddress18bit/65536)<<1)+0xA1),(MemAddress18bit%65536),I2C_MEMADD_SIZE_16BIT,pData,Size,Timeout);. o4 M$ s+ M+ t# m4 s( {: J
- }
复制代码 ) \# R* r$ M3 s
4 `: B1 _' C2 u6 ~' U( a. y* d2 z3 @
后面两个函数放在“/* USER CODE END 4 */”上面,“/* USER CODE BEGIN 4 */”下面,避免重新配置STM32CubeMX后被覆盖删除。
5 M( g- r. o( F, s
使用前提是: 软件上用 STM32CubeMX 配置工程,选择HAL库。 硬件上芯片的A2引脚不接入IO脚使用,如果需要用到2片AT24CM02的同学当是留家庭作业自己回家做了,这里就不讲了^_^
" o% ~9 b0 T5 E. v; v" A
之前发了个求助贴,得到大佬们的提示,终于明白是怎么回事了。所以做好分享出来,让同行少折腾。 : d/ m8 _# v0 F) e
|
8 F/ [+ a, X7 S/ ` f5 s$ o9 m, K
$ ^# L" ^* O9 D% a! Z: g# r/ u8 {
然后打印输出的结果是:
" C e0 ^ V% u' |
0 Q+ I' ~' F1 c, F8 ~, |
AT24CM02 第262144个字节中的数据是:0xff7 A* R2 f# F3 H4 v6 H% B) K
AT24CM02 第131072个字节中的数据是:0xff1 A" k( G( L0 e/ r/ @: D! [
AT24CM02 第65536个字节中的数据是:0xff* V! B- n' y* V& V) E
AT24CM02 第262144个字节中的数据是:0xab4 l; T/ e0 ^( k0 P/ m; m! A7 \
AT24CM02 第131072个字节中的数据是:0xff
AT24CM02 第65536个字节中的数据是:0xff' S+ E1 L3 U8 ~ k% r
AT24CM02 第262144个字节中的数据是:0xab
AT24CM02 第131072个字节中的数据是:0xcd
AT24CM02 第65536个字节中的数据是:0xff
AT24CM02 第262144个字节中的数据是:0xab
AT24CM02 第131072个字节中的数据是:0xcd, P3 p& d2 p9 E6 P
AT24CM02 第65536个字节中的数据是:0xef
AT24CM02 第262144个字节中的数据是:0xff
AT24CM02 第131072个字节中的数据是:0xff
AT24CM02 第65536个字节中的数据是:0xff
& Q. \2 r3 p) X% I8 O( o3 t# ~
! l+ p+ ]2 v2 k) y: k3 r
补充说明一下,上面我开启了看门狗,所以用了喂狗处理,不用看门狗的话用 __nop(); 也是一样的
1.代码太累赘,重复的太多 封装性太差
2.代码不规范,格式上实在不敢恭维
让我评价打分10分给3分
有请这位大佬展示一下要是你怎么封装?
注意一下 沙发里的代码作用是演示怎样代入使用,并且通过打印证实了并没有只用到低16位地址的存储空间,. N" [* w/ U0 E' r) j$ i7 X. U
主贴上的无论是 读取 还是 写入 函数 都只有 return 一行代码,并且保持HAL官方库的风格。
所以把可以直接替换的改了一下封装函数的入口形参,保持与官方一致,方便已有工程的EEPROM读写代码直接替换函数名# o6 Y2 X' D4 M! a! n
7 _: L6 y6 T% k: W; D5 u9 o: { u