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

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

[复制链接]
STMCU小助手 发布时间:2022-6-28 10:00
    编写好 I2C 数据读写函数, 下面就可以编写 AT24CXX 的读写函数, 代码如下:
  1. /****************************************************************7 h8 n. O/ a: |. _. I9 k/ B; k
  2. * 函 数 名 : AT24CXX_ReadOneByte$ \0 B" _2 J* y6 ^5 T
  3. * 函数功能 : 在AT24CXX 指定地址读出一个数据
    $ n+ P# U. j& L+ ]
  4. * 输 入 : ReadAddr:开始读数的地址2 Q! j, F$ W* {8 x* q" R
  5. * 输 出 : 读到的数据
      K( q3 o/ Z8 p' l
  6. *****************************************************************/
    3 k$ |# G& ?, _/ N: }3 R
  7. u8 AT24CXX_ReadOneByte(u16 ReadAddr)6 r$ [5 v: @2 ~
  8. {
    5 l; z, h# O+ ^9 f( {
  9. u8 temp=0;! G! x# h# j2 h4 w" K' W6 l
  10. IIC_Start();) o# j- K' y. d4 A% |! @3 t
  11. if(EE_TYPE>AT24C16)& @# _' @. N; z1 k
  12. {
    ; x$ H3 C$ k: N) B
  13. IIC_Send_Byte(0XA0); //发送写命令" j$ I' ~; B1 R0 i$ b: M! q
  14. IIC_Wait_Ack();6 j9 }9 Q# E' n1 B4 @) k  `" j
  15. IIC_Send_Byte(ReadAddr>>8);//发送高地址) R# F, I! F8 {( Q. q
  16. }
    7 ]) q8 `. _) r* n* J( v. o
  17. else, \0 @# J3 e/ L7 N9 I: j/ {
  18. {; m; w. D% p9 _: L- _
  19. IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据/ c! U) [, [4 m8 h
  20. }
    9 H, h/ n3 E& q7 \, N
  21. IIC_Wait_Ack();
    2 w, T3 R! Z* C1 G% a% b6 f
  22. IIC_Send_Byte(ReadAddr%256); //发送低地址* y  C) I' L6 {
  23. IIC_Wait_Ack();# }. y9 J' P/ I" d/ c+ b) d
  24. IIC_Start();
    ' Z( Y( s! y, z4 N# P
  25. IIC_Send_Byte(0XA1); //进入接收模式
    * d  X! v4 y2 |0 c5 E
  26. IIC_Wait_Ack();
    6 q! m% _0 C/ K
  27. temp=IIC_Read_Byte(0);
    ; e5 j0 c& ]: I! Z! K/ r
  28. IIC_Stop();//产生一个停止条件
    0 k, \* `0 u1 Y7 ^# P3 ^
  29. return temp;
    5 z6 ?4 r; T- G, o+ d6 K7 u1 l  i- a
  30. }
复制代码
  1. /****************************************************************/ {3 `$ V" ^% d, b" q
  2. * 函 数 名 : AT24CXX_WriteOneByte
    + I  x" Q% M1 y7 O
  3. * 函数功能 : 在AT24CXX 指定地址写入一个数据
    ( _* x7 U1 C- w+ w$ \2 ]6 a
  4. * 输 入 : WriteAddr :写入数据的目的地址DataToWrite:要写入的数据' K) }  i. g3 i3 g$ F7 z) R
  5. * 输 出 : 无; [# W( @. u; l7 I: X
  6. *****************************************************************/
    ( R* P* w7 ?3 A$ P0 G8 N
  7. void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
    # d: Z' }; K0 U" Y6 H9 R) I
  8. {2 J) B; [4 Z( ^7 v2 d
  9. IIC_Start();6 I8 E7 \! m' a; r
  10. if(EE_TYPE>AT24C16)- v- A+ \6 |. S- A( t
  11. {
    6 ?5 U8 k5 s8 ?3 O! ~6 z* Y
  12. IIC_Send_Byte(0XA0); //发送写命令( K0 a) @9 D# G! U
  13. IIC_Wait_Ack();
      N' b, g; l0 f8 F
  14. IIC_Send_Byte(WriteAddr>>8);//发送高地址" f9 E0 U' T# z! I
  15. }
    2 B. S; L3 k5 I
  16. else( |3 u1 _* p  r$ z% A  S
  17. {# d9 T9 V5 x/ }
  18. IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据. z% a0 ~* ^% h6 L. k
  19. }
    9 v' R) v0 `. l: @8 ]3 ^  ?" V4 ~  E
  20. IIC_Wait_Ack();8 H6 w3 |  H; v2 m
  21. IIC_Send_Byte(WriteAddr%256); //发送低地址
    2 I$ J4 a% I% q! x/ K% l3 K
  22. IIC_Wait_Ack();9 P( z; X& V% Y" M* Q. e0 A
  23. IIC_Send_Byte(DataToWrite); //发送字节* D1 N. M7 p8 q9 P  k# }" n
  24. IIC_Wait_Ack();/ t* J  I3 E7 [; N0 y
  25. IIC_Stop();//产生一个停止条件
    0 R8 Q* B4 B2 D
  26. delay_ms(10);
    5 O9 O2 d. M  d
  27. }
复制代码
  1. /****************************************************************
    ! w+ K) H8 F: S5 I4 |/ x) i. Q# Z
  2. * 函 数 名 : AT24CXX_WriteLenByte
    7 }2 w5 R% a: }
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始写入长度为 Len的数据用于写入 16bit 或者 32bit 的数据
    ( K( o. D: @8 [) l
  4. * 输 入 : WriteAddr :写入数据的目的地址' i9 C, o- [5 [5 M. O2 r! S, v6 E
  5. DataToWrite:要写入的数据
    0 H& e0 n. @  f+ t. M1 W) Q7 @' _
  6. Len :要写入数据的长度 2,45 L/ r* i" L1 h5 P- J
  7. * 输 出 : 无; j, d; h$ I0 S& _, c( w
  8. *****************************************************************/
    ' p' \/ X6 @- t& S1 H
  9. void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)5 V0 n3 b# ^$ T. Z
  10. {$ y: O" D1 O: W. K
  11. u8 t;3 o9 ?/ r2 f7 }+ [
  12. for(t=0;t<Len;t++)
    3 L$ l7 R3 w* H) `
  13. {
    9 w) D; v( v! u' i% o  F2 B
  14. AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);5 e$ S7 \6 }. u1 R
  15. }
    ! j6 i: p" K5 }! h
  16. }
复制代码
  1. /****************************************************************
    $ a0 t+ Y8 x. A7 O/ e! z
  2. * 函 数 名 : AT24CXX_ReadLenByte5 Y. B7 m8 O( n0 o& p' ^
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始读出长度为 Len的数据用于读出 16bit 或者 32bit 的数据! R& G; ^1 Z! a1 ~
  4. * 输 入 : ReadAddr :开始读出的地址
    5 e5 o: P$ [8 b) r
  5. Len :要读出数据的长度 2,4
    % h6 M# g  Z( F4 B  N0 O5 o
  6. * 输 出 : 读取的数据) s0 ]1 Z( ^' u& z2 V2 F/ N  S3 v* U
  7. *****************************************************************/
    2 u0 z2 e8 ^& z7 {& m$ \
  8. u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)2 h. J' k3 i4 E% B* l
  9. {
    " s  h+ a+ S; ?
  10. u8 t;
    ( [, V% d' N$ Z. U: j
  11. u32 temp=0;! y3 h; _: M3 u3 @& e+ s" _
  12. for(t=0;t<Len;t++)7 q& w/ g/ T1 U. ~
  13. {/ h5 W3 N+ w4 L
  14. temp<<=8;! \4 Y$ u6 s$ G, T& P& Q& C
  15. temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);% K! k/ A% H9 w$ Q+ a9 ~
  16. }4 z; W% {8 T/ D: W0 {
  17. return temp;
    ' d9 @; y, |% Z0 K! q6 s' l
  18. }
复制代码
  1. /****************************************************************
    + a5 f) N1 @0 Z& i. n: k
  2. * 函 数 名 : AT24CXX_Check* A8 X( b: l) x
  3. * 函数功能 : 检查 AT24CXX 是否正常
    * [3 [0 D5 a$ I, F/ A
  4. * 输 入 : 无& }! g+ [/ ^9 d7 b
  5. * 输 出 : 1:检测失败,0:检测成功
    3 r# f/ M- w4 Y# p; e
  6. *****************************************************************/2 `$ J  o' L4 I& }; w' A" {
  7. u8 AT24CXX_Check(void)$ r* ~0 Z) g' v" Y
  8. {4 q6 p$ u$ Y( M3 D0 l
  9. u8 temp;! F# R9 S$ E- w' Q- m
  10. temp=AT24CXX_ReadOneByte(255);//避免每次开机都写 AT24CXX% ?, x% k2 K8 u, w% D
  11. if(temp==0x36)return 0;3 J- R5 d& D8 Y2 T$ ]
  12. else//排除第一次初始化的情况! O7 R+ F! h: X: G6 Z; X
  13. {
    9 C; G+ J- t# q
  14. AT24CXX_WriteOneByte(255,0X36);
    9 N/ ?6 \4 S* }
  15. temp=AT24CXX_ReadOneByte(255);
    ( a: P% Z" e8 j- V* ^! l
  16. if(temp==0X36)return 0;
    3 M/ A- t: H/ N3 H8 g) U) x  M* S
  17. }* }1 U" q' \3 V* \1 \
  18. return 1;
    " X: G; M2 o* a# H; t+ ]
  19. }
复制代码
  1. /****************************************************************
    5 S2 V  b$ m. L9 U. Z9 I; B
  2. * 函 数 名 : AT24CXX_Read, ?) K% c  N7 C. x- X+ z
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始读出指定个数的数据' C, K, j4 ^) l
  4. * 输 入 : ReadAddr :开始读出的地址 对 24c02为0~255
    $ ]1 S" t2 d0 i+ t' `
  5. pBuffer :数据数组首地址
    ; W% M$ j3 A/ a9 z5 @
  6. NumToRead:要读出数据的个数/ T# }0 Q* G- q* p0 l
  7. * 输 出 : 无. |+ ?; j7 G) r" S
  8. *****************************************************************/9 m$ z+ x/ J6 ~
  9. void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
    * g# ?: z5 X. a) n
  10. {, u' @. F, o4 C5 A' |: T) I2 U# s* {
  11. while(NumToRead)- K- n  t( Z" r& Z6 k" }7 a
  12. {
    , r7 d. l* A' u$ A# C4 v
  13. *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);* V2 n. f  f& d: [8 f/ g( W
  14. NumToRead--;
    ) Z0 k, e6 V4 E- o  \
  15. }
      W9 v( b% Y$ D- N1 S5 q
  16. }
复制代码
  1. /****************************************************************
    - r1 I6 b! |  q4 W% r* Y
  2. * 函 数 名 : AT24CXX_Write
    ( h- [% W, A# _& E: U
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始写入指定个数的数据
    4 Y( A0 {5 u) G  Q$ \% H2 ]6 j
  4. * 输 入 : WriteAddr :开始写入的地址 对 24c02为0~255
    + O6 s: v4 A3 x: b( R2 Y2 N
  5. pBuffer :数据数组首地址
    . J  e4 m& E) C8 w& S: Q
  6. NumToRead:要读出数据的个数
    2 B, J9 c& J5 R
  7. * 输 出 : 无/ x& F1 v3 D0 h4 m7 R- i) I
  8. *****************************************************************/1 I5 Y0 P5 N3 b9 F
  9. void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
    7 q' c2 _0 F; T9 @  v
  10. {
    ' W& o0 B  t. f% ?
  11. while(NumToWrite--)
    " l! a7 |/ \# K$ B' P7 \% v
  12. {
    ; H) Q+ c8 v$ ^; b% l
  13. AT24CXX_WriteOneByte(WriteAddr,*pBuffer);; p3 \( c. R, ?: d" u; U
  14. WriteAddr++;
    ' z" X% `, B+ O" X* b6 ]& F. ~2 p( i! W
  15. pBuffer++;3 R; @7 R/ r" }
  16. }* J+ |1 ^8 O$ I
  17. }
复制代码
这部分函数在 24cxx.c文件内,这个文件支持 AT24CXX 系列的很多芯片,可通过 24cxx.h 文件内的 EE_TYPE宏来修改,可修改的宏定义如下:
  1. #define AT24C01 127! }) d  N' O; ^; ^/ g0 Z0 E8 W
  2. #define AT24C02 2553 l6 Y: ?0 O. w4 Z5 ]; v
  3. #define AT24C04 511
    ! m8 Z* g, \. x7 N
  4. #define AT24C08 1023- g$ b* u8 F( b
  5. #define AT24C16 2047
    4 J: T6 Q" F9 j: }
  6. #define AT24C32 4095
    - {  V* R$ A3 [; U6 l; I. n+ }
  7. #define AT24C64 8191; Y- ?7 ?+ d0 {9 X: m
  8. #define AT24C128 16383
    ' B, ^) I2 B) A2 b
  9. #define AT24C256 32767
复制代码

( {0 \! i" T, \% g' M
    由于我们开发板上使用的是 AT24C02,所以宏定义默认是:
  1. #define EE_TYPE AT24C02
复制代码

3 O6 B6 _/ G& E8 R* ^
    如果你自己设计的电路板上使用的是其他的 AT24CXX 芯片, 那么可以修改这个宏,实现不同芯片数据的读取和写入操作。
* w: ~# ^- r9 v2 M& v6 Y9 o
收藏 评论0 发布时间:2022-6-28 10:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版