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

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

[复制链接]
STMCU小助手 发布时间:2022-6-28 10:00
    编写好 I2C 数据读写函数, 下面就可以编写 AT24CXX 的读写函数, 代码如下:
  1. /****************************************************************( A. W( x5 m* H1 e* r: m
  2. * 函 数 名 : AT24CXX_ReadOneByte1 {" }( M" ^) J. i. m/ d1 Q
  3. * 函数功能 : 在AT24CXX 指定地址读出一个数据
    8 R2 H/ G2 c( w/ K4 o# H
  4. * 输 入 : ReadAddr:开始读数的地址
    7 v' z4 p8 O3 h: s$ E7 ?- ^0 ~' e
  5. * 输 出 : 读到的数据6 Q0 f0 P9 d- ~$ J/ k4 `
  6. *****************************************************************/! A; i( H  m& c- k' K, Y# B4 O* {
  7. u8 AT24CXX_ReadOneByte(u16 ReadAddr)
    . W: K" n6 c" a
  8. {
    6 Y9 F- X( i5 Y, Z" Y  q
  9. u8 temp=0;* k% d5 t* I- m! B
  10. IIC_Start();$ ~" p7 w5 z# Z  l$ e" u% z
  11. if(EE_TYPE>AT24C16)! w6 a2 `8 C7 \: z% T/ [( a
  12. {$ F5 X* v9 U8 u& i8 V& H' G$ Y
  13. IIC_Send_Byte(0XA0); //发送写命令
    - w+ z/ i7 F, W* b. b# ?6 F+ X; j
  14. IIC_Wait_Ack();
    % ^, I) M' [7 _( V5 X
  15. IIC_Send_Byte(ReadAddr>>8);//发送高地址
    - P# n# I' [6 S6 g7 E+ f& E
  16. }3 W. h2 n) ]" \  D  q
  17. else& W& R8 I' c* A9 J
  18. {
    & z/ c7 @7 K& H# b& n9 L; \" [
  19. IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
    $ |) \. i7 `# @/ V
  20. }
    $ k. f0 [8 {% z! R
  21. IIC_Wait_Ack();
    7 F* Q+ J3 g2 K# [
  22. IIC_Send_Byte(ReadAddr%256); //发送低地址
    / g7 W0 C) `; k% f) J
  23. IIC_Wait_Ack();
    + f& T( S1 u$ j7 A* u6 H+ N
  24. IIC_Start();
    + j# X+ j, d/ D5 a  u% S! Q6 u
  25. IIC_Send_Byte(0XA1); //进入接收模式
    $ _' y7 N1 G/ j) m
  26. IIC_Wait_Ack();
    # N1 B. q+ p+ p5 a% W
  27. temp=IIC_Read_Byte(0);; p4 \4 S& `. {' j' A1 G
  28. IIC_Stop();//产生一个停止条件3 g2 q2 ]6 L* a0 w( U
  29. return temp;) g" o4 P, i1 d4 m& f% X, E
  30. }
复制代码
  1. /****************************************************************
    0 z/ V7 N; g0 {+ o8 p" B; y
  2. * 函 数 名 : AT24CXX_WriteOneByte& D0 U- T" P3 e2 N: ^' X
  3. * 函数功能 : 在AT24CXX 指定地址写入一个数据8 j1 U# h4 r0 u* R$ }
  4. * 输 入 : WriteAddr :写入数据的目的地址DataToWrite:要写入的数据4 E* b. L, V& _7 ^9 h; S
  5. * 输 出 : 无( e+ n$ a) b# G0 J8 R
  6. *****************************************************************/" g8 a& B# Q1 }, Y, e. U. v. c7 H& O8 n
  7. void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)" I) B0 Q  L7 U$ z* K
  8. {
    - O  H5 E* E8 c! s3 P  p
  9. IIC_Start();! c1 Z" ]) b7 S$ G5 M
  10. if(EE_TYPE>AT24C16)
    0 p; i0 L7 E, }) c
  11. {  ~! `' ~' |. O/ l: _
  12. IIC_Send_Byte(0XA0); //发送写命令
    ; o! h6 Y4 S- R7 b% J0 T
  13. IIC_Wait_Ack();
    + e( p5 M7 q5 r6 m6 O* |
  14. IIC_Send_Byte(WriteAddr>>8);//发送高地址
    ( c7 c8 Z6 z* p9 P& V# o7 g8 y9 z
  15. }8 ^1 I( H4 M3 u7 A5 W
  16. else! q( @8 ], z3 s' _" e3 X6 C% o
  17. {+ i. t+ C+ H( r) g4 O$ [
  18. IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据8 {5 W" c, ]" s& m
  19. }7 w* `6 {6 H% C; D# d: T
  20. IIC_Wait_Ack();
    $ K: T( E7 G$ B" O0 A, w5 H1 @
  21. IIC_Send_Byte(WriteAddr%256); //发送低地址8 `6 S2 P: r  \5 n7 |- S
  22. IIC_Wait_Ack();
    5 p* x( a# ^9 ^  {. m
  23. IIC_Send_Byte(DataToWrite); //发送字节1 ]8 V* K5 F9 N4 S: j9 l$ Z
  24. IIC_Wait_Ack();* U0 y- K, Y3 Y6 h  ^. U7 J+ u
  25. IIC_Stop();//产生一个停止条件
    ; h" b3 n+ ?- h- t7 _& J, t7 X  P
  26. delay_ms(10);5 n4 K6 U7 G7 W, d$ X0 U6 w5 Z
  27. }
复制代码
  1. /****************************************************************" u5 H9 _- x7 L0 q
  2. * 函 数 名 : AT24CXX_WriteLenByte/ {; H% R9 F# m( W
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始写入长度为 Len的数据用于写入 16bit 或者 32bit 的数据8 l) O6 a+ [, j& n/ x4 M+ O" R% ?
  4. * 输 入 : WriteAddr :写入数据的目的地址& x2 _) K- Z3 R* A( c
  5. DataToWrite:要写入的数据' H' }+ \7 ^4 C* j
  6. Len :要写入数据的长度 2,4! m6 q9 a6 v, _. y- H5 a
  7. * 输 出 : 无) j4 n) G$ C4 r( S
  8. *****************************************************************/: X$ _& C8 c. ~& F
  9. void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
    ' s/ L" a. H- W5 l' A7 L
  10. {% l) n3 n* `4 F# E% b1 _
  11. u8 t;
      H8 r% `, ?; E% K8 d8 B5 C
  12. for(t=0;t<Len;t++)
    9 H& w$ m  b2 f/ X7 c2 X( l  e4 }
  13. {
    9 t) H( T7 t) c7 D. ]( b) y" f
  14. AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);4 ^+ y1 u! e, R' y0 X$ |3 q- F: m3 o
  15. }) s6 i. d8 E9 B1 a- G+ q: {
  16. }
复制代码
  1. /****************************************************************  l/ {0 R( {  Y2 g7 W  H+ z# [
  2. * 函 数 名 : AT24CXX_ReadLenByte9 V" M9 g% j: ]. B
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始读出长度为 Len的数据用于读出 16bit 或者 32bit 的数据
    # b  h/ [" ?* {$ {9 R2 H( j
  4. * 输 入 : ReadAddr :开始读出的地址
    5 `5 S6 U6 M3 y4 J" b& d
  5. Len :要读出数据的长度 2,4
    3 U$ J5 Z( }. a1 H* k$ h
  6. * 输 出 : 读取的数据
    " N& t% l4 P) S6 L$ Y; H
  7. *****************************************************************/
    4 }2 a. w& q$ h. q
  8. u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)0 ~6 l& j8 n% Q9 z& D, P) z
  9. {
    & O" I# ?6 u% J  M+ @: @  s8 g
  10. u8 t;
    + R; A0 Z  E. ?* E0 y+ a8 _
  11. u32 temp=0;
    $ ]" w# e3 K& d
  12. for(t=0;t<Len;t++)
    1 A; J4 h# q3 |0 W- n# {7 f; U
  13. {. g5 {( [9 a" C& A+ k5 k
  14. temp<<=8;* s6 K7 U& g) \
  15. temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);# T1 j6 ]2 b( g3 N
  16. }4 h& T5 _) p) h! t8 s* E. J* F4 J
  17. return temp;) _% H) ^1 v" b( C% M# @
  18. }
复制代码
  1. /****************************************************************
    ! r; Y* B& U# F1 h
  2. * 函 数 名 : AT24CXX_Check7 m1 M: L( `/ W4 c
  3. * 函数功能 : 检查 AT24CXX 是否正常
    , `5 ~: V1 N2 r- _
  4. * 输 入 : 无
    - |- v. W% l2 l' e
  5. * 输 出 : 1:检测失败,0:检测成功
    % @  L- x! d  @1 B
  6. *****************************************************************/
    ) j6 ?) p/ K0 V
  7. u8 AT24CXX_Check(void)
    4 i2 t8 o4 w& C* [
  8. {4 G1 z# S- w9 z. ?
  9. u8 temp;
    " x8 O2 x, A% J
  10. temp=AT24CXX_ReadOneByte(255);//避免每次开机都写 AT24CXX1 P- j4 R; O; o5 n0 f  p3 r$ U
  11. if(temp==0x36)return 0;
    ( a* \2 a( P2 J8 M* E
  12. else//排除第一次初始化的情况0 H/ D# ^  E* I/ g3 n/ g
  13. {
    6 A2 I' g# @, [6 [9 f
  14. AT24CXX_WriteOneByte(255,0X36);
    0 r' z2 S; Y4 i6 C
  15. temp=AT24CXX_ReadOneByte(255);
    $ B. A$ C: ^& V% E
  16. if(temp==0X36)return 0;
    / j/ a  K# J0 g
  17. }
    % Q: p4 S: I3 o, i$ Z  y2 W8 K
  18. return 1;
    & k& T1 w4 T9 a% b( A4 x
  19. }
复制代码
  1. /****************************************************************5 M) H5 c0 d1 c1 i5 D. t
  2. * 函 数 名 : AT24CXX_Read
    2 {' ~: U; }' K* t; _2 d& p' R# u
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始读出指定个数的数据% D: H0 H+ o1 m- V& z& A% Z9 V- U; M
  4. * 输 入 : ReadAddr :开始读出的地址 对 24c02为0~255
    1 h" t+ c. q: ~. _1 I% W5 [  `! C
  5. pBuffer :数据数组首地址
    % O8 H4 h! w0 H& S1 d: g
  6. NumToRead:要读出数据的个数! i  Q% D+ S) A* |* x
  7. * 输 出 : 无5 Y8 g" B2 N3 j! w' ^% G  Y
  8. *****************************************************************/* k0 N% u/ U( k8 A  A7 ^, c
  9. void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
    2 C: k/ b2 D1 c4 v% Q6 B
  10. {
    ) @# @4 b. t4 P! K7 I
  11. while(NumToRead)
    2 S/ X% `' w* ~+ m
  12. {1 f; R" e) c+ r
  13. *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
    % R& J; y. M1 ?: {: F
  14. NumToRead--;) W. U3 ]" \/ X5 E
  15. }3 q0 W( d/ K0 ~6 W6 \1 a" ^- C* A
  16. }
复制代码
  1. /****************************************************************
    # g! B& {9 D% \
  2. * 函 数 名 : AT24CXX_Write& n5 K! u! e" ^+ L& v
  3. * 函数功能 : 在 AT24CXX 里面的指定地址开始写入指定个数的数据
    2 Z, l& ~, M; L& n( Z7 a
  4. * 输 入 : WriteAddr :开始写入的地址 对 24c02为0~255
    4 h  a! l" x) z1 t" ^6 i+ k
  5. pBuffer :数据数组首地址' X. U3 H9 C( t% v8 X0 B
  6. NumToRead:要读出数据的个数0 I# l# T2 V. @5 j' Y- r$ |3 p
  7. * 输 出 : 无. Q4 o3 ^9 j& L! l+ v( D  M. j* o9 w
  8. *****************************************************************/1 D/ z/ [' O7 z4 h+ {. J% k% K
  9. void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
    - s' E6 K& r& }: W
  10. {- }2 d9 s7 d; ?% X3 [' k3 ~
  11. while(NumToWrite--)
    - M; Y4 z& Q* H, S9 w* x  X" T
  12. {1 s3 j- a! s( p* _
  13. AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
    7 I2 R- `) ?9 f
  14. WriteAddr++;6 v' d7 f" `; q! y
  15. pBuffer++;
    0 F/ w" F7 x5 g
  16. }6 o9 d- Y. g' K% d1 I& I+ G  J$ k
  17. }
复制代码
这部分函数在 24cxx.c文件内,这个文件支持 AT24CXX 系列的很多芯片,可通过 24cxx.h 文件内的 EE_TYPE宏来修改,可修改的宏定义如下:
  1. #define AT24C01 1277 r0 G: I  l, e" w( Y
  2. #define AT24C02 2552 ^8 }; j) {9 h/ v0 S
  3. #define AT24C04 511: j6 b# u! t! _* F
  4. #define AT24C08 1023
    - L( s1 a9 c! i! B( \& q. h
  5. #define AT24C16 2047% `1 @; I9 I% p0 Q8 Y9 [# ]0 K
  6. #define AT24C32 4095
    $ d% j; _  d' i+ h) a( h6 y" E
  7. #define AT24C64 8191
    $ K' U, R, \( M+ ]
  8. #define AT24C128 16383
    4 y$ c8 j8 E$ Q
  9. #define AT24C256 32767
复制代码
+ @4 g, |0 E% C7 S: i
    由于我们开发板上使用的是 AT24C02,所以宏定义默认是:
  1. #define EE_TYPE AT24C02
复制代码
0 E. E  X' N; P# L- m8 ~+ A3 L% L. ^
    如果你自己设计的电路板上使用的是其他的 AT24CXX 芯片, 那么可以修改这个宏,实现不同芯片数据的读取和写入操作。
3 _8 k1 y& U7 m0 V/ V
赞 收藏 评论0 发布时间:2022-6-28 10:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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