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

【经验分享】STM32G070用HAL库与AT24C08通讯

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
一、AT24C08的通讯方式
# O5 _- C& v" ^3 \$ ]AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口
9 m9 g" W" H2 C5 x2 w( e, C# f9 F% H9 H3 K0 Z4 b& a
二、AT24C08的存储方式
2 |( X! K$ R( ?! j9 v" o7 O, @AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,
$ `7 y9 x+ F& I) \1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间
/ N% Q( L; A/ i' K; _8 R5 W就分成了4块,每块都有256字节存储空间,每个字节是8位
* I9 ^% g8 m6 K( X0 W+ Z: c- o
5 x# f" N" ?5 h1 _4 ^器件写地址分别是0xA0,0xA2,0xA4,0xA6% X  e  A  k1 k% C& y* ]( O
器件读地址分别是0xA1,0xA3,0xA5,0xA7
. j; n# ~/ @9 r1 k. n
  1. /*3 l) g5 U. v$ @
  2. *描述:     在eeprom指定地址写入一个数据
    # {) l& n: }' N$ \2 B8 T
  3. *参数:  WriteAddr  :写入数据的目的地址% X4 I( s  q7 l4 c  w
  4. *                 DataToWrite:要写入的数据8 B& {5 C( g& J6 K( \0 c& d
  5. *返回值:读到的数据# W8 N, @1 V8 a) F' p+ m6 |- m! X
  6. */
    4 X0 A( T& }6 t5 H) e6 C
  7. void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
    0 I  E4 y) M' M7 K/ [6 ]
  8. {                                                                                                  " n# V4 O$ a, U# M- K
  9.     IIC_Start();  ( ~/ a1 s' A; l9 h6 f- E; i3 o

  10. 9 [5 C! j! U: M$ k
  11.     IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据    0 J, }. H& N1 `) C: |! L
  12.     IIC_Wait_Ack();      
    6 V. B$ D9 W  E" ~
  13.     IIC_Send_Byte(WriteAddr%256);               //发送低地址
    / L2 M! d3 s8 \/ X
  14.     IIC_Wait_Ack();                                                           
    7 O* g. n) s7 P+ [" W
  15.     IIC_Send_Byte(DataToWrite);                 //发送字节                               ; p9 {5 {8 A4 N& z+ k4 \
  16.     IIC_Wait_Ack();                     : O0 V! N5 d* e2 y  |
  17.     IIC_Stop();//产生一个停止条件 ) ]# d- M. }- c  S- l
  18.     HAL_Delay(10);     - w  F4 R2 P7 ], M0 q( f8 f4 [6 Q
  19. }* x# W$ B( ^7 u/ r* T3 H, c
  20. /*
    $ [2 d2 i. G) `; p
  21. *描述:     在eeprom指定地址读出一个数据1 [9 q( E2 e2 {# P4 T
  22. *参数:  ReadAddr:开始读数的地址# N* a0 s, w4 Q+ b0 r2 r$ _2 w) {" _
  23. *返回值:读到的数据6 `, i: b2 ^( h" g: ^9 D
  24. */' i* g% \8 B1 _8 A% E/ W
  25. u8 Eeprom_ReadOneByte(u16 ReadAddr)7 ]: ~: B6 p5 T- f5 _6 ~
  26. {                  : Q( R1 Z- B# T% [3 z7 z
  27.     u8 temp=0;                                                                                   
    ' @) z, P5 k& m5 h" V* g& d9 i* x
  28.   IIC_Start();  
    8 v- V1 j, f3 j0 A& R
  29.    
    ) I2 h0 ~& `+ K
  30.     IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据
    : _% h1 ?( t) e) z$ \
  31.     IIC_Wait_Ack();
    . v9 n" ?3 R% Z& m0 f% E0 N
  32.   IIC_Send_Byte(ReadAddr%256);               //发送低地址
      c9 T+ g( z' u0 w
  33.     IIC_Wait_Ack();        
    3 B* `* V) u. }7 y8 M/ k
  34.     IIC_Start();   
    & {" g5 K9 l7 p  X7 {& \& k
  35.   IIC_Send_Byte(0XA1+((ReadAddr/256)<<1));   //进入接收模式    " k& [7 o" E" c* x3 G) t
  36.     ' v, Q6 E7 `: |4 u0 y5 g, v  z" L1 ^
  37.     IIC_Wait_Ack();     
    % E. m8 N, m7 p8 ]( b" y3 i
  38.     temp=IIC_Read_Byte(0);& m& A$ X+ M  k( ^, [( }( Z! F
  39.    
    7 z" D1 A+ S+ e& g
  40.     IIC_Stop();//产生一个停止条件     2 i' ~5 z- }/ U9 H+ n4 k1 e
  41.    
    9 V- h: i9 U' g$ k$ W; K
  42.     return temp;
    9 F& m4 |7 k& m6 g: N
  43. }9 T0 G; R) y: B
  44. ! ?3 T; k5 t/ `" _3 J# c& a6 f
  45. /*6 j4 M& y/ h" |# O8 u
  46. *描述:     检查EEPROM是否正常
    " a, {) L! j! p2 e: b
  47. *参数:  无3 K) ?, l0 ?0 N
  48. *返回值:外接EEPROM是否存在  
    # K- `  i0 Y) s+ P, l
  49. */# f; M5 D7 o( Y' r8 \: n/ l% \" p1 |
  50. u8 Eeprom_Check(void)! F5 }1 V$ `6 [$ F/ @
  51. {0 `0 {& g! M* H( l. I
  52.     u8 temp;
    " \$ i  o( W8 G) b
  53.     temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM           $ d/ H: [8 ]- r# a- G/ j: L0 X
  54.     if(temp==0X55)return 0;           . ^1 W  N" r9 b( Q, w. f* }
  55.     else//排除第一次初始化的情况5 `' P% `0 D: P6 F/ p$ y
  56.     {
    ) [8 c* h/ X* S! Q( ^
  57.         Eeprom_WriteOneByte(1023,0X55);
    : T' O! M! s3 z& _4 }( E
  58.         temp=Eeprom_ReadOneByte(1023);      7 i+ g: c0 o  O9 @, C4 v
  59.         if(temp==0X55)return 0;  z4 R1 o% o7 E) C
  60.     }# M4 b; E# q0 T4 |! B& o
  61.     return 1;                                             
    / M& E& i( s* V
  62. }, n" Z  x- o- i
  63. : P8 Q$ [* T$ x& e+ ?6 b; s

  64. ; x# ?1 _3 }3 c0 C" \0 E" k( |
  65. /*
    3 k7 y% a& E. P: T; w
  66. *描述:     在EEPROM里面的指定地址开始读出指定个数的数据
    ( ^* j, q9 [+ C& W
  67. *参数:  ReadAddr:    开始读出的地址
    0 n! m  r6 e: }7 ^& W
  68. *                 pBuffer:    数据数组首地址8 P* U% j. @6 E1 p
  69. *                 NumToRead:要读出数据的个数
    4 k- B: H- p, Z" W6 I" i4 {- R4 Z" b
  70. *返回值:读到的数据5 I; O* V" {' F7 C
  71. */
    " H& s- [2 i! `1 }) c! d
  72. void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)% H) U+ W" d. m  f. D
  73. {9 r1 m8 R3 d; C' z, `& Z& W
  74.     while(NumToRead)
      [- G/ E9 E1 V% @5 |* E5 D/ B
  75.     {8 y  m6 c( [% ]3 x6 U( R+ G
  76.         CLRWDG();' E0 O- |* H! A0 j: _. E+ Q: }
  77.         *pBuffer++=Eeprom_ReadOneByte(ReadAddr++);    ) z9 N# J5 C' p+ J* B+ q$ t
  78.         NumToRead--;, [3 t6 O+ _# z6 Q: @5 g5 M
  79.     }3 o- h; F8 u6 F* ?2 R! ^( y
  80. }  + I; v6 _/ C4 t. w. E
  81. + u0 H, G3 T% O. V9 m0 H$ H* H9 c
  82. /*
    + q! W( X; A  I& X6 r) B5 V# H0 g
  83. *描述:     在EEPROM里面的指定地址开始写入指定个数的数据: m4 X& ~# |) B5 {$ s- w
  84. *参数:  WriteAddr:        开始写入的地址
    . H0 T( Q5 Q6 r+ Y$ T3 s; |
  85. *                 pBuffer:        数据数组首地址
    & @# E) q3 A) d  E% r- h$ Q
  86. *                 NumToWrite:    要写入数据的个数
    , _2 L) h$ x/ w* e/ {1 i" x2 |5 Y, N
  87. *返回值:读到的数据
    3 S' E' G$ F$ Q2 G% t1 W5 @9 s- t
  88. */( L- [* e0 ^8 z1 A4 D% {
  89. void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)% ?- R8 }# y* V6 ?
  90. {% Y9 D9 Q: R3 k# K* F
  91.     while(NumToWrite--)
    * j+ r" k* ]5 G
  92.     {
      E% r& K3 k& \" ?% p/ z
  93.         CLRWDG();
    , P: j4 B- ~* N5 g$ M, w
  94.         Eeprom_WriteOneByte(WriteAddr,*pBuffer);
    4 x. G* ]$ m6 N. P* {/ `: s. g5 G
  95.         WriteAddr++;1 F/ s( Y$ w" [, ]1 P" V1 z
  96.         pBuffer++;9 j7 J5 J. [# l
  97.     }& p, @/ ?+ K) q% C" H
  98. }  M4 f/ A7 r, s/ P- H
  99. $ ~1 g" ^! _9 r. U5 v
复制代码

, W" z: Z, S7 y
1 z& I2 d* a! S# y' \
. q8 P2 w  u2 T+ D4 u' o7 ?
* k% ?+ O7 A: K' N' v! e8 e* {; i
收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

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