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

【经验分享】STM32实例-I2C-EEPROM 实验⑦-AT24CXX 数据读写函数

[复制链接]
STMCU小助手 发布时间:2022-6-28 10:00
    编写好 I2C 数据读写函数, 下面就可以编写 AT24CXX 的读写函数, 代码如下:
  1. /****************************************************************
    : {, i: G7 @5 e( a0 r* J
  2. * 函 数 名 : AT24CXX_ReadOneByte" l9 W! \* u( Z; N- i& m0 L
  3. * 函数功能 : 在AT24CXX 指定地址读出一个数据
    0 |: Y& V* T0 H% o! L) B
  4. * 输 入 : ReadAddr:开始读数的地址% H5 B% m! m7 O" ?& s! Y
  5. * 输 出 : 读到的数据
    0 z, e& C1 n- y6 ~4 ^  J% w/ A
  6. *****************************************************************/
    8 t4 e5 p! y$ |4 k& ~* f6 E
  7. u8 AT24CXX_ReadOneByte(u16 ReadAddr)4 ^' @4 b' {" |+ I; K, E' U
  8. {2 U8 f  l# p& N: x  P3 n' k" a
  9. u8 temp=0;
    % g! @6 E  X  a& L6 ^/ e! p
  10. IIC_Start();
    5 ^) l# U% p+ f0 @9 O$ \; e
  11. if(EE_TYPE>AT24C16)
    9 d$ t; T& T: e) e: @( W- f! A) b+ A
  12. {
    7 i. }0 V+ v( Z$ ]& H/ J' Z
  13. IIC_Send_Byte(0XA0); //发送写命令* @& \: A) d/ B/ i) W$ C1 Z
  14. IIC_Wait_Ack();) ]5 Q( T. O$ z) q
  15. IIC_Send_Byte(ReadAddr>>8);//发送高地址
    & y& S- H; I# Z4 Y9 i
  16. }
    3 V3 I$ k3 T3 V# ~5 W: O6 b+ c2 z
  17. else
    ! N4 g& N6 |! W( o( ]4 [
  18. {
    ; L' t6 ^8 I, O8 v8 y8 g
  19. IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据8 g& b: A) q0 X' }" E! j
  20. }
    ! M! s; v+ s/ }4 j% {( m9 z
  21. IIC_Wait_Ack();& Q6 o9 k  k5 ^. m6 N4 o# x; ?
  22. IIC_Send_Byte(ReadAddr%256); //发送低地址+ ?9 i) P, N+ P! o3 G# t
  23. IIC_Wait_Ack();
    # W3 `+ t3 v6 F0 d7 B( G! o7 }
  24. IIC_Start();' f- H6 r& x5 f% @. d! I
  25. IIC_Send_Byte(0XA1); //进入接收模式
    ( c) Q& A7 s( ^6 X6 a1 q7 |
  26. IIC_Wait_Ack();
    ) X0 _5 B7 {+ I7 o; t8 T
  27. temp=IIC_Read_Byte(0);- I1 T3 t) D) X/ o) e7 E; J% W: ]
  28. IIC_Stop();//产生一个停止条件
    , f" ]. j8 U, F% @( V
  29. return temp;0 X! Y) d- J9 |/ h6 N: R
  30. }
复制代码
  1. /****************************************************************9 d# u5 V3 U/ F3 W
  2. * 函 数 名 : AT24CXX_WriteOneByte
    9 u( I1 @( N1 B5 t: G) }$ n% R
  3. * 函数功能 : 在AT24CXX 指定地址写入一个数据
    6 f) {" H& f( v$ I! z( o
  4. * 输 入 : WriteAddr :写入数据的目的地址DataToWrite:要写入的数据
    ' T$ U1 e; q. V; T3 T5 x9 u% B8 N
  5. * 输 出 : 无
    * Y. {  K3 u+ c) I5 ]6 j+ B. {" _; }
  6. *****************************************************************/
    9 y6 I6 P3 q! }& h) \% K! M
  7. void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
    5 P) [  D" l3 O) V# q6 _
  8. {# d; X" s+ X1 u, D' L+ A  W- b* y6 q
  9. IIC_Start();
    4 ]' |: m5 {+ ]! U
  10. if(EE_TYPE>AT24C16)
    5 H! L/ P" V  B1 T5 B5 [+ d
  11. {; N& _( t9 B# o" N
  12. IIC_Send_Byte(0XA0); //发送写命令
    5 m$ M0 s$ G" A7 N% @
  13. IIC_Wait_Ack();
    . c2 K& k: r9 z6 l$ Q, k0 P% P# D
  14. IIC_Send_Byte(WriteAddr>>8);//发送高地址* _3 S4 l. Y. z+ p) R7 Z
  15. }1 t9 @9 E9 g$ @/ ^
  16. else8 i, e6 l3 R- M8 c  }  z. x! N0 [6 v( l
  17. {
    2 f& D8 J+ ]- I9 i  v6 }
  18. IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据; d* N( u; A% L7 f% z3 \' y
  19. }) J" T! ^2 i0 c( `% g6 e6 F
  20. IIC_Wait_Ack();$ ]; N/ ~( W4 x8 O5 @
  21. IIC_Send_Byte(WriteAddr%256); //发送低地址0 g& d* W6 K0 Y$ B* L' W, y# `
  22. IIC_Wait_Ack();
    : n/ I# z# W% I' q8 y' I
  23. IIC_Send_Byte(DataToWrite); //发送字节
    / M, `; S% ~/ j# D% ~4 D
  24. IIC_Wait_Ack();
    / l. S  w+ {0 I# f; C/ c) D
  25. IIC_Stop();//产生一个停止条件9 z8 P% C7 E' y, ^" Y- @
  26. delay_ms(10);% G( L% t  M; L& a0 e  R! [
  27. }
复制代码
  1. /****************************************************************
    $ Y' ^1 c, E' x: t
  2. * 函 数 名 : AT24CXX_WriteLenByte$ V( f0 o" [( v. H, m- \  X6 r- G7 o3 Y
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始写入长度为 Len的数据用于写入 16bit 或者 32bit 的数据+ p" l+ d1 R. C3 k
  4. * 输 入 : WriteAddr :写入数据的目的地址
    5 j* ^) |7 ~; c0 N( ~' E9 c/ z
  5. DataToWrite:要写入的数据
    $ r, k6 V+ ]; V( ~
  6. Len :要写入数据的长度 2,4$ S8 |  Q* t8 o5 ?0 M8 @! G: G
  7. * 输 出 : 无
    ' u, d- _; K/ [" Q3 [6 K* }
  8. *****************************************************************/) f9 ?6 Y( Z2 w( E1 `" l, p, A
  9. void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
    ) F5 o1 o8 O% `$ ^
  10. {
    , K" B! e3 \  j2 A
  11. u8 t;
    & P- B; t7 q8 Z: H
  12. for(t=0;t<Len;t++)* W* b2 e+ E9 I. v( ]
  13. {6 a3 i. m+ s' z# b. Z
  14. AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
    4 K. q+ V0 p/ M/ E+ D4 n
  15. }
    5 w1 c9 l: j' S# P4 _+ }2 T. v
  16. }
复制代码
  1. /****************************************************************$ W# z; e! c" E: C8 D  S9 l
  2. * 函 数 名 : AT24CXX_ReadLenByte
    * P+ v1 i2 N5 q6 J5 R
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始读出长度为 Len的数据用于读出 16bit 或者 32bit 的数据+ K. L- P; Y' H# V
  4. * 输 入 : ReadAddr :开始读出的地址9 k2 d! I# n  Y+ d& t+ W' a2 q* E
  5. Len :要读出数据的长度 2,4
      N/ Q" T) d$ Z2 \0 \( U" W" ^8 a# W  d
  6. * 输 出 : 读取的数据9 k! j* Z$ T, o) G
  7. *****************************************************************/
    0 H+ _# J  F3 l+ `, _
  8. u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)8 _& R7 s& l& G5 q& T
  9. {
    4 o$ x) f( l! _$ z, ^( U1 M
  10. u8 t;' @( R9 v# [: a1 Q& C
  11. u32 temp=0;
    . b1 Y7 [/ E5 D' I1 W( H5 l( G$ `
  12. for(t=0;t<Len;t++)
    7 k% ?" e$ v7 X1 _0 b# ~( |/ X
  13. {
    . J6 i) _; V4 u( T! F& {. {4 ]* Z
  14. temp<<=8;$ }" m  M" y0 I. k& S! t; I
  15. temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);
    - U2 a+ s2 h7 R9 Q+ N0 M
  16. }# A; v# t2 @& Z. X- U
  17. return temp;
    . h, F# Q! ~! p( T- a
  18. }
复制代码
  1. /****************************************************************0 ^7 k; D7 ]. a/ v3 u; S
  2. * 函 数 名 : AT24CXX_Check
    / ]" S* o. O( j6 L- o; _- Z* a
  3. * 函数功能 : 检查 AT24CXX 是否正常3 t2 J: ~' }7 a5 b' |' @9 _
  4. * 输 入 : 无$ f6 |/ K+ x- s  r
  5. * 输 出 : 1:检测失败,0:检测成功$ `) B: p. Z* B
  6. *****************************************************************/2 A( o. ~# n  r: Q) r
  7. u8 AT24CXX_Check(void)
    # M& R' q1 u6 m* A: M6 ]
  8. {
    9 ]$ F2 g/ W0 s$ I
  9. u8 temp;3 v. q+ u% V) A" \9 N- c
  10. temp=AT24CXX_ReadOneByte(255);//避免每次开机都写 AT24CXX
    % o, u9 A5 ]7 K' k  q
  11. if(temp==0x36)return 0;
    2 L3 t6 D+ g7 O9 D5 W0 u
  12. else//排除第一次初始化的情况9 |8 |5 b8 C6 Y4 I, ~
  13. {
      H* N# V7 i, S3 i6 J- ^9 V3 t, M% O! V
  14. AT24CXX_WriteOneByte(255,0X36);
    " d' k6 X% ~6 z9 X
  15. temp=AT24CXX_ReadOneByte(255);
    # L2 J. G0 Q$ ?( v9 d8 g0 |; e! {  C
  16. if(temp==0X36)return 0;
    / j; k- C1 I( K
  17. }( j, D. v) {. Z6 s+ @; W
  18. return 1;3 ~6 U6 H- Q" |6 t7 i5 o( ~
  19. }
复制代码
  1. /****************************************************************  b! W4 @7 t! u9 ?
  2. * 函 数 名 : AT24CXX_Read
    & [7 g( k4 k% P8 R) G2 W
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始读出指定个数的数据# [; k+ m$ ]2 _) E
  4. * 输 入 : ReadAddr :开始读出的地址 对 24c02为0~255
    6 |9 L3 C1 f. k5 H; I+ b
  5. pBuffer :数据数组首地址4 V0 W( [" ]4 F# }# D
  6. NumToRead:要读出数据的个数
    - b# V8 H; R: d: N1 W
  7. * 输 出 : 无, v2 Q3 k( f" p* p3 G# k1 J
  8. *****************************************************************/
    7 O* [2 S! P) b. c0 x3 G
  9. void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)2 @$ l7 e# n( m8 P$ Z/ e
  10. {& Y3 b0 R7 ^' o
  11. while(NumToRead)
    4 W: G, U+ O5 F6 B2 i, b
  12. {
    0 V: Z- {7 ?; k) H0 t' r" {! d% j
  13. *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);, {. ~/ z: c! k# W) c& l  `
  14. NumToRead--;# m5 i' X9 K1 Z- a* }5 Q# g( g
  15. }
    + n  E- ]- q5 ?- h+ h; K4 U4 J
  16. }
复制代码
  1. /****************************************************************0 y3 S7 Q# {) |+ u1 ^& I5 H! Y! L
  2. * 函 数 名 : AT24CXX_Write: M' [) p: Q6 j9 m8 m8 u
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始写入指定个数的数据
      D; }  t/ [6 R& ?, a3 _
  4. * 输 入 : WriteAddr :开始写入的地址 对 24c02为0~255! b" c/ C+ I* t0 t* I, _( G9 v
  5. pBuffer :数据数组首地址- U) r5 c; ~% i5 d
  6. NumToRead:要读出数据的个数5 m3 |* H+ j* p, S' k0 b% M) X, k7 s
  7. * 输 出 : 无
    . S6 Z9 _, F$ d9 J- x+ j8 i
  8. *****************************************************************// B! h9 {4 o; f: u/ e! i# s/ T
  9. void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)9 P* N9 x% J* X: E
  10. {1 U7 d+ l$ Q- r9 {1 A3 h" m
  11. while(NumToWrite--)8 }' x7 [1 @9 n; H3 J
  12. {7 T; [5 C: m& |( g' O
  13. AT24CXX_WriteOneByte(WriteAddr,*pBuffer);' X, j4 P$ Q) s! u4 R8 ]
  14. WriteAddr++;  O4 p7 W4 J( H. V2 W8 C( }
  15. pBuffer++;. S1 e8 a3 [: ~  ]4 B! R0 ?
  16. }& n0 l9 u( m7 O1 ?
  17. }
复制代码
这部分函数在 24cxx.c文件内,这个文件支持 AT24CXX 系列的很多芯片,可通过 24cxx.h 文件内的 EE_TYPE宏来修改,可修改的宏定义如下:
  1. #define AT24C01 127( Q( ]+ d$ J0 w% c. R
  2. #define AT24C02 255- o) w4 k- F( J- c
  3. #define AT24C04 5119 E2 f4 t, _6 b# Z+ [% ]# {5 a5 {
  4. #define AT24C08 1023
    - ~0 R% C; G7 Z% M1 y# a6 f
  5. #define AT24C16 2047
    # K3 D* U' T  x3 |+ f
  6. #define AT24C32 40952 g  y$ T) w# |6 m9 u& R# G- o
  7. #define AT24C64 81915 D1 ?. K, T+ H
  8. #define AT24C128 16383# o% m: C% c2 @1 g/ A% q' T4 q
  9. #define AT24C256 32767
复制代码

& C& @! U3 y; ]+ y
    由于我们开发板上使用的是 AT24C02,所以宏定义默认是:
  1. #define EE_TYPE AT24C02
复制代码
! ~4 U/ i% E4 J0 k5 r
    如果你自己设计的电路板上使用的是其他的 AT24CXX 芯片, 那么可以修改这个宏,实现不同芯片数据的读取和写入操作。
) ]; x1 ^# I* \4 }' P
收藏 评论0 发布时间:2022-6-28 10:00

举报

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