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

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

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
一、AT24C08的通讯方式
% @3 j5 O' s! K5 m# T3 C2 IAT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口7 q* V( S- i9 N2 f. r
) R& t- _  ]  O
二、AT24C08的存储方式
% \; `" B5 t: c; x' s) o8 aAT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,; T' X8 W: v4 H9 @4 w/ Q
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间; Q+ U4 ]! s% G3 v& f
就分成了4块,每块都有256字节存储空间,每个字节是8位* J9 W+ G. b) s: b+ v
; Z+ A; c$ L; o. ?. d
器件写地址分别是0xA0,0xA2,0xA4,0xA6/ x; t$ t" y# I: w7 e
器件读地址分别是0xA1,0xA3,0xA5,0xA70 v' m: h  h  H1 ?
  1. /*/ i0 o9 l7 e/ B+ r* x
  2. *描述:     在eeprom指定地址写入一个数据
    ) P% `1 F; m9 ?+ w6 S
  3. *参数:  WriteAddr  :写入数据的目的地址9 w, o0 J# q# K. M5 h$ G/ c
  4. *                 DataToWrite:要写入的数据
    5 F  @2 E- }( q4 z; C$ z! I
  5. *返回值:读到的数据
    & E) V3 Z% i9 e) |
  6. */
    1 ^' n. ]- ]( L2 l3 h7 w7 v! x; X
  7. void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)% z  _+ y. i" R" U0 T
  8. {                                                                                                  ( @4 t* y1 {- D7 G, s6 B
  9.     IIC_Start();  
    % a. u- K' J8 D* |' @5 H
  10. - D" q3 c2 G- P1 }2 \, j  u; \: o
  11.     IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据    ( h, I' ?4 W6 q# x- R
  12.     IIC_Wait_Ack();      
    $ y/ t  s1 ?1 h
  13.     IIC_Send_Byte(WriteAddr%256);               //发送低地址- P  I1 }# E6 n4 P7 h
  14.     IIC_Wait_Ack();                                                           
    , Q9 S: Y/ p) X; d$ o+ [7 j
  15.     IIC_Send_Byte(DataToWrite);                 //发送字节                               * B* s9 J& A8 o7 a7 @/ r6 F
  16.     IIC_Wait_Ack();                     
    1 u) H" ?+ W+ ~9 O
  17.     IIC_Stop();//产生一个停止条件 " ]* i- b' j5 O( e2 [
  18.     HAL_Delay(10);     $ ^) ^4 G. U/ {0 K3 c4 ~
  19. }' y4 F+ I; T' m9 Y8 w8 {* P4 d
  20. /*
    ( ?/ W6 ~+ G2 Q4 a/ c2 ~$ o
  21. *描述:     在eeprom指定地址读出一个数据% I( a& e" r  G; O6 S9 r
  22. *参数:  ReadAddr:开始读数的地址
    1 w: F2 e* L9 O9 T  y5 F8 V5 A
  23. *返回值:读到的数据
    9 b" `6 p, j$ S9 A0 }
  24. */
    - i% S* k1 s, [) p6 Y  O- n
  25. u8 Eeprom_ReadOneByte(u16 ReadAddr)
    7 j, @# P' C9 @3 x
  26. {                  
    : @% D6 X) y( \6 Z6 C" j
  27.     u8 temp=0;                                                                                   
    3 [7 U7 u( Y* Q
  28.   IIC_Start();  / p5 J7 m1 n7 r( J8 a2 C. l
  29.     0 g( V* N* O0 L9 P/ c+ M
  30.     IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据
    ( P( c' F4 e# z" {
  31.     IIC_Wait_Ack();
    ! s! Z6 {# L% b; G0 p- f! ^( B+ y- Y
  32.   IIC_Send_Byte(ReadAddr%256);               //发送低地址1 @" d2 u( M0 D  D
  33.     IIC_Wait_Ack();        
    - T, k$ u+ m9 C# G
  34.     IIC_Start();   
    ( X0 W* x% Z+ ]4 _1 w
  35.   IIC_Send_Byte(0XA1+((ReadAddr/256)<<1));   //进入接收模式   
    " X8 W, @- G% F0 v; M4 ~/ K3 [
  36.     , X" J4 E* W1 {, Y7 D/ C
  37.     IIC_Wait_Ack();     $ D! ~8 A# H4 i" v/ h
  38.     temp=IIC_Read_Byte(0);
    % E4 _1 \! @, y7 n3 K4 ~; [# ]2 b9 u
  39.     6 ^' f2 w2 i0 B/ \
  40.     IIC_Stop();//产生一个停止条件     
    8 N1 w; w- D  r* E7 ~& @
  41.    
    3 ~6 \) @; n7 X, K8 ?0 a& j6 a5 o7 Q
  42.     return temp;; y. _, {5 u: P# i
  43. }2 q8 a' I; n" b( Z* x8 C

  44. 7 h7 ?" J# L1 ]5 j7 Z$ Q
  45. /*
    ! K# q. ]$ O# u4 m
  46. *描述:     检查EEPROM是否正常
    ; p7 z0 ]5 @, z6 O
  47. *参数:  无
    0 L* j5 K6 A  W; _
  48. *返回值:外接EEPROM是否存在  
    0 u6 [5 r4 e% h$ V# h! H0 Q
  49. */
    3 o4 b/ N9 k+ i7 z6 K; x
  50. u8 Eeprom_Check(void)
    ! N$ j; x9 F3 v" t% a3 }
  51. {
    6 e8 [: M" u! Y$ j8 y
  52.     u8 temp;4 g  w: o' k" ^& p
  53.     temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM           
    / _2 P/ E/ V4 D6 b* M
  54.     if(temp==0X55)return 0;           
    . i% _# t- c* F9 I/ a# @! d
  55.     else//排除第一次初始化的情况
    8 V4 b. Z  ~8 M+ g/ x! u( P
  56.     {' K. }( s- `- W# _. ~. a
  57.         Eeprom_WriteOneByte(1023,0X55);
    & g' L7 n! j+ G! g% S
  58.         temp=Eeprom_ReadOneByte(1023);      : v  |0 o" _1 Q$ y: u% f
  59.         if(temp==0X55)return 0;: V7 H$ m9 e! H6 ~  ]9 z9 g
  60.     }
    9 n" F+ h, K1 C' O4 ^) @
  61.     return 1;                                             
    8 Q. t* ~- O$ {0 ?7 P
  62. }$ x8 |: {$ _$ G5 N
  63. 2 v  K4 ]/ i( Y% B5 y4 c
  64. $ ]6 r% o9 l) M
  65. /*
    * c. M4 U* F: y( p
  66. *描述:     在EEPROM里面的指定地址开始读出指定个数的数据
    & c0 A  I( o0 J6 u, y; v# C
  67. *参数:  ReadAddr:    开始读出的地址( w0 n- t- a1 S
  68. *                 pBuffer:    数据数组首地址# p( Q! ]# y# c0 o3 X
  69. *                 NumToRead:要读出数据的个数
    3 c4 q2 p& ?$ L& T# z. ~3 _
  70. *返回值:读到的数据/ y, ?3 L9 |1 O) \; a# }6 J6 V/ S
  71. */, P$ A( V( Z3 Y6 u$ g
  72. void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)$ w5 T1 K" Q3 o6 ?8 |3 `/ q
  73. {" h- }: Q* `9 F: i$ M6 [3 K, f# l/ _/ d4 D
  74.     while(NumToRead)2 V2 v, x5 @! O3 g9 n5 N0 y
  75.     {' K3 b/ X" _( M7 }
  76.         CLRWDG();
    8 @4 p7 \1 R# r6 c2 X, d
  77.         *pBuffer++=Eeprom_ReadOneByte(ReadAddr++);    " s9 Y9 ?; Y; k- V( E; ~# [
  78.         NumToRead--;) @. [: h* B" U( d
  79.     }
    / E- n4 d# a5 b
  80. }  
    9 j4 g& a% N; l) F. h( E

  81. 3 |. b4 W) r; d* t( B' g& u, y
  82. /*
    : G0 R, ]. f- J# I) Q
  83. *描述:     在EEPROM里面的指定地址开始写入指定个数的数据
    ! \8 i$ I, P" B3 p. i4 p
  84. *参数:  WriteAddr:        开始写入的地址
    : q7 j# d6 R. G0 `4 S; d: M
  85. *                 pBuffer:        数据数组首地址( h, z+ z& S) Y! A
  86. *                 NumToWrite:    要写入数据的个数
    ; ]: C& O4 S/ R3 F% V- r
  87. *返回值:读到的数据
    8 }* c& _* ?* B5 @$ T
  88. */9 D# I: f% o/ @  f: p/ k6 I: p- @3 n
  89. void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)) z: o+ b/ }( ]1 W" K  g8 e
  90. {
    7 V1 G+ B6 \, P8 O% C$ J
  91.     while(NumToWrite--)
    9 x' j3 R, @; W0 @& E
  92.     {
    0 G# t1 V$ ~% l, i/ l/ I, d/ Y
  93.         CLRWDG();
    6 Z4 s3 s& M- f8 X/ k
  94.         Eeprom_WriteOneByte(WriteAddr,*pBuffer);
    ( P) s- |) c/ N; G) q7 z3 E
  95.         WriteAddr++;/ o" r4 Y# T+ |7 }( I: H
  96.         pBuffer++;( H  s# w$ u* D2 ~/ y4 x, T- P* l4 U
  97.     }6 _' J- {+ q- X! ]' k" |
  98. }
    . f- E0 q' R# f! s3 p

  99. ( e' f, {, r% H- N8 M* F
复制代码
" c) ~! b" w$ a) d

( H4 R  c& G$ w7 N* M9 d7 {
) u3 H6 A, w* A2 [5 K
9 {8 o- t) B$ v: h9 {
赞 收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

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