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

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

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
一、AT24C08的通讯方式
/ I1 [5 N; L2 R  j  W5 H* ?, l% ?AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口+ a/ |7 @, Q& _5 d2 [1 Z

$ x( V- G& N# U. h* V4 |二、AT24C08的存储方式
/ H+ ?8 @* s- I0 f! T- c  o0 F+ `AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,1 r5 I3 r8 Q  x% r  l
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间, v4 Z% e% @& o9 S% b7 i
就分成了4块,每块都有256字节存储空间,每个字节是8位
0 r- t& f5 v9 C. W8 x& I! @4 Z
' M1 |6 c9 I$ b2 J2 J- s器件写地址分别是0xA0,0xA2,0xA4,0xA6
& a8 b5 j) N  ?  @. X9 ~器件读地址分别是0xA1,0xA3,0xA5,0xA7( \$ p, ~/ \2 \6 g4 \% [* J  Y! R
  1. /*
    7 [  O6 p' |! K$ K. b
  2. *描述:     在eeprom指定地址写入一个数据1 \9 v- I& a! p
  3. *参数:  WriteAddr  :写入数据的目的地址& ~9 g5 e' Y- d
  4. *                 DataToWrite:要写入的数据6 Z3 L# e- E0 Q2 L
  5. *返回值:读到的数据
    3 o2 Z1 [6 |& T  U/ `
  6. */. U0 e0 s( H, V. z. O% M4 x
  7. void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
    7 k6 a* q+ ?& {9 Y. u6 z2 I% w
  8. {                                                                                                  3 N, ]1 d5 Q3 r
  9.     IIC_Start();  ) t9 x# u8 h9 a: I, X2 G

  10.   c7 K& h& h/ e) K5 K) I
  11.     IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据   
    ) D; N% d% @% v6 _) t4 v: V
  12.     IIC_Wait_Ack();       + ?1 V) h& ~1 g. e3 f2 @7 o
  13.     IIC_Send_Byte(WriteAddr%256);               //发送低地址
    * U0 o! z4 l5 {" U4 K
  14.     IIC_Wait_Ack();                                                           
    ' I% }" K7 {9 S9 _& w
  15.     IIC_Send_Byte(DataToWrite);                 //发送字节                               7 Y" i1 V* t& ?' B* l# P
  16.     IIC_Wait_Ack();                     
    7 R; m6 @1 r  i9 o& \
  17.     IIC_Stop();//产生一个停止条件
    3 W% ?- c( t: P( `
  18.     HAL_Delay(10);     : t! @' L# X8 Z: I3 [
  19. }
    6 \3 Z- L7 L- j" \
  20. /*
    3 g+ q' O& P7 \6 c* {# f
  21. *描述:     在eeprom指定地址读出一个数据
    - w# _- u, i4 X, ^$ `, }
  22. *参数:  ReadAddr:开始读数的地址* g) W8 ]6 D- p" }0 V( ]
  23. *返回值:读到的数据
    5 M1 c+ d5 n' O2 m5 F
  24. */% }9 }  ?" S6 E! P' ^
  25. u8 Eeprom_ReadOneByte(u16 ReadAddr)
    $ ~9 E1 U% _, F0 J( `
  26. {                  
    8 P" e& x' p  |3 v) P& f; M7 d
  27.     u8 temp=0;                                                                                   % B+ B- R9 f5 A3 K& r( U
  28.   IIC_Start();  4 U0 d& y/ F! U1 Q, e4 D1 x
  29.     $ W5 t/ v% r1 Y3 w& ]' o5 W( f6 k
  30.     IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据: S, e4 k1 G* |' b3 P
  31.     IIC_Wait_Ack();
    7 h! F- R; {# a' G2 j1 e* I
  32.   IIC_Send_Byte(ReadAddr%256);               //发送低地址) {9 W  d( u  _; T  _8 }$ G- B
  33.     IIC_Wait_Ack();        5 A' b4 m; a" F5 }2 K5 m7 I
  34.     IIC_Start();   
    ! M, h% k" A/ C. P7 i
  35.   IIC_Send_Byte(0XA1+((ReadAddr/256)<<1));   //进入接收模式   
    1 p+ `2 X% D; V, L
  36.     " b& e5 D$ A8 N
  37.     IIC_Wait_Ack();       r# R! J, w, c4 m# E' Q; T
  38.     temp=IIC_Read_Byte(0);$ j9 _0 `3 J4 [2 x/ y
  39.     0 ?' k3 k) o' B. f4 E( _
  40.     IIC_Stop();//产生一个停止条件     ) c* w' e; k* V
  41.    
    2 p* {: V1 `6 _4 G7 @
  42.     return temp;
    6 D& J; ~1 q# ]
  43. }
    - m) N) @$ K% C; L
  44. % u6 s5 l) N$ L. `/ m' q  `
  45. /*
    & G: P. C5 Z1 _; M% t# M
  46. *描述:     检查EEPROM是否正常+ ?& `5 G1 ~. [* i% x; J
  47. *参数:  无
    : s6 ^* r- n: c
  48. *返回值:外接EEPROM是否存在  
    # V9 ^+ }6 \* p0 H. n& I6 b
  49. */7 `' y5 T5 z( ?- v7 H2 @) a8 d
  50. u8 Eeprom_Check(void)
    ( ]* f; F4 G4 m+ G& F2 o
  51. {
    % a& d6 Z" ^' `* i, f; V" h# w9 T
  52.     u8 temp;
    % ^' z  v. r# @! y; Z
  53.     temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM           4 O( p- _. l2 m5 G2 d" o
  54.     if(temp==0X55)return 0;           9 x, j' [) @% z) n/ d8 h+ K0 M- u, L8 Y
  55.     else//排除第一次初始化的情况1 ~  o9 [) f4 l* H% M: `* L
  56.     {6 W! B4 k  a! p9 `" g
  57.         Eeprom_WriteOneByte(1023,0X55);
    # r/ p% s3 x2 f4 m+ g' p
  58.         temp=Eeprom_ReadOneByte(1023);      0 V7 i/ ]9 ~, G, Z+ M% v! j, F5 ~
  59.         if(temp==0X55)return 0;
    * C1 }" d( c1 p+ y4 H, [( `! b
  60.     }5 |5 g; l1 w# j1 `
  61.     return 1;                                             
    $ y( l; D8 c2 d1 Q. s) m
  62. }
    # l5 P& X# i/ \/ u
  63. 1 N. H+ Z+ Y; a- @$ W/ @- f& o$ ]
  64. 7 B8 I) A+ }+ V% ]. W+ m. b
  65. /*
    1 \: A0 g+ K: q" G, r4 d& Y, ?
  66. *描述:     在EEPROM里面的指定地址开始读出指定个数的数据# S. a+ L) f0 D3 @+ C
  67. *参数:  ReadAddr:    开始读出的地址# M9 W5 V0 o# G* J8 H4 B4 \
  68. *                 pBuffer:    数据数组首地址" n+ X% ]7 i' ?+ F2 ?& j" j
  69. *                 NumToRead:要读出数据的个数
    , Q  k7 a3 N! Y' u  [9 f
  70. *返回值:读到的数据
    ; ?% K3 q/ Q+ n
  71. */
    " M* v5 D* ~6 J4 ^! w( J; I5 J1 h
  72. void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)2 n  ~  |* w( q# A& f& ~
  73. {# M7 l9 ^$ A' l/ d
  74.     while(NumToRead)
    ( F; A: r' M( K" ?# K' m7 Z. R, x
  75.     {
    5 q; c) o4 S! |3 z0 q
  76.         CLRWDG();7 d. G( D1 R, J7 d# _
  77.         *pBuffer++=Eeprom_ReadOneByte(ReadAddr++);    2 T* @5 w* V8 ^- |
  78.         NumToRead--;4 f$ u, o7 [5 h7 z+ i: i" u2 X
  79.     }
    ( X- r" r& P' @( Y8 R, H
  80. }  ( C; L% y, M: E

  81. ' [# w  l! o/ Y) _
  82. /*
    ' H4 j/ M2 Z3 P: M: ~+ e* H
  83. *描述:     在EEPROM里面的指定地址开始写入指定个数的数据
    5 x- d; n! {" l  E( u% D$ Q! i; P
  84. *参数:  WriteAddr:        开始写入的地址1 h, ^* P& _$ p6 D0 V4 u
  85. *                 pBuffer:        数据数组首地址  W. P1 _: m" |. h( L
  86. *                 NumToWrite:    要写入数据的个数6 H7 _7 ?, ^7 _- t) z
  87. *返回值:读到的数据
    $ i% M( V5 M& W) O9 A" Y
  88. */8 k) X4 ]8 C5 S( r1 I1 R& g
  89. void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)+ w* T' e0 i9 V* g+ X: a/ U0 U' O
  90. {
    0 {  v& G( x, l9 |3 J* A
  91.     while(NumToWrite--)$ p, `3 L: V( L' Q- ]6 V
  92.     {
    4 p' z0 s- H  h3 P  o4 M
  93.         CLRWDG();
    9 c  G& q, v* ^* P. F
  94.         Eeprom_WriteOneByte(WriteAddr,*pBuffer);; g7 M: X+ N1 M7 W9 g( H
  95.         WriteAddr++;7 C; _7 g4 ~1 O# {* Y9 [
  96.         pBuffer++;- X1 C/ _6 k  v
  97.     }" @0 M( }9 a. X: Y& Y( j7 q7 m
  98. }
    * e, q) w7 }  O) V2 m

  99. + w; u+ e# ^) w% P  h: Y
复制代码
8 f: b$ @# u' }# W. a
; x& C- n% m, Y

- i0 M+ I- ~% g; ^% |# S0 e4 V2 G$ I5 I9 A$ W
赞 收藏 评论0 发布时间:2021-11-14 23:04

举报

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