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

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

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
一、AT24C08的通讯方式6 L0 W; h+ H- Z3 @
AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口- b8 a! o; n4 t1 M

6 o) c0 J9 S9 R7 Q. L. h) q二、AT24C08的存储方式
0 d6 t! m  k- j4 n5 O) H- `AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,: f; E' Y, N0 e
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间- y& u* M2 i2 @( r' U
就分成了4块,每块都有256字节存储空间,每个字节是8位' W, o& f. `) I) e, A  [
, C/ R1 X: e6 x7 [
器件写地址分别是0xA0,0xA2,0xA4,0xA6
" Q5 n: A2 }" y5 A& Y器件读地址分别是0xA1,0xA3,0xA5,0xA72 h: x. p. W% `. c
  1. /*& n" T- Q! p6 m
  2. *描述:     在eeprom指定地址写入一个数据
    " }# A3 `: F; t
  3. *参数:  WriteAddr  :写入数据的目的地址
    8 M0 n: Q7 _+ C# N  ?5 ?) v. o* Y
  4. *                 DataToWrite:要写入的数据
    8 t2 S: K) S- d$ x* W" r4 Y+ U
  5. *返回值:读到的数据5 K# a' R" d" F/ V! y) }
  6. */
    9 X" @5 B  q  v$ b$ m, i, h7 F
  7. void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
    ' m: e% x& D1 r& b+ i! ^
  8. {                                                                                                  - R( R6 P+ l8 d' _
  9.     IIC_Start();  
    ) E( E0 {" v0 {+ V% }: t  P

  10. 4 H: M0 H1 O- D  g
  11.     IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据    ) f% c1 i$ E2 n4 G% ~
  12.     IIC_Wait_Ack();      
    2 A4 T! |2 w' Y( F
  13.     IIC_Send_Byte(WriteAddr%256);               //发送低地址
    2 n" e6 [" j+ m3 B% l6 [
  14.     IIC_Wait_Ack();                                                           
    3 L; P: M, I, X- d, Z
  15.     IIC_Send_Byte(DataToWrite);                 //发送字节                               1 |8 Z7 r) E/ ~: k3 ]
  16.     IIC_Wait_Ack();                     
    5 M1 u& [/ O1 i* [, w9 z0 F& F
  17.     IIC_Stop();//产生一个停止条件
    0 X9 B4 A, c# w8 f4 q
  18.     HAL_Delay(10);     * i3 v' C" |  N
  19. }) b- [! _8 }  ?9 v( K) N6 j% s
  20. /*- @! t; f/ V- Y: e
  21. *描述:     在eeprom指定地址读出一个数据
    ( X% g& E) y; [" X5 p  _
  22. *参数:  ReadAddr:开始读数的地址
    6 Q5 k" W# n2 v: A, ~. t
  23. *返回值:读到的数据
      t- B& h$ ]  T0 q
  24. */  W1 a: L- s% G0 ]
  25. u8 Eeprom_ReadOneByte(u16 ReadAddr)$ V% L3 z+ t9 I4 v
  26. {                  
    ; R! ~4 _8 O9 e- m% ]
  27.     u8 temp=0;                                                                                   ( c. d4 T+ Z* l) q' T. Y6 F: u; c
  28.   IIC_Start();  
    + ]  \' R3 y3 I: A1 D
  29.    
    4 q* ~4 _, w' P! M6 [4 k9 o
  30.     IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据
    9 c6 d! B2 s6 Z  E! G. F
  31.     IIC_Wait_Ack();
    ( b2 y2 U7 p7 R- f7 J# A
  32.   IIC_Send_Byte(ReadAddr%256);               //发送低地址" {, I3 p: V  a: c+ ?
  33.     IIC_Wait_Ack();        
    6 C6 F! H: C2 y- j' n6 s
  34.     IIC_Start();    / K& O8 @4 M4 _# q3 m: z% j5 ?
  35.   IIC_Send_Byte(0XA1+((ReadAddr/256)<<1));   //进入接收模式    / ~3 T0 ^+ o. h; @
  36.    
    7 c( [. G8 S; z6 Z0 |+ {( M
  37.     IIC_Wait_Ack();     
    ! M: I8 e5 t1 b  ~! l
  38.     temp=IIC_Read_Byte(0);' O* D. ^) |9 ~6 F. U5 N$ n
  39.    
    % i1 g+ q# o6 E) p% H
  40.     IIC_Stop();//产生一个停止条件     
    . C9 q4 ?+ A3 _( O' w- l6 {, ~
  41.    
    ( Z' `; |1 c- c: a
  42.     return temp;
    # c+ L2 w0 m0 M( [
  43. }2 |" _: b" L: ]6 S5 l
  44. & g) f" {1 T6 r1 c
  45. /*
    : \; [! G  p" h2 b/ H$ f/ f
  46. *描述:     检查EEPROM是否正常, u# S6 J5 h8 [8 |7 m6 U
  47. *参数:  无; o: K; d# ~$ G. ]2 P  L/ i3 m0 w
  48. *返回值:外接EEPROM是否存在  
    6 G* i0 A8 X; o! c% \
  49. */9 P' `- l* e& {' B/ f3 `. G3 V% H; k3 d
  50. u8 Eeprom_Check(void)
    + j& B$ g6 L  Z8 L  p
  51. {
    ! E0 u* U: {4 U' P- O! ], t& s
  52.     u8 temp;: x" S7 G, O! f: \- l: d- r
  53.     temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM           " y3 F4 _! A1 V( M/ D6 h" d% |
  54.     if(temp==0X55)return 0;           
    + E+ a$ E' ]; U6 A' o1 X
  55.     else//排除第一次初始化的情况
    / B) v; u) {) {
  56.     {- W! D9 t! @2 `1 v/ m
  57.         Eeprom_WriteOneByte(1023,0X55);5 U4 j0 }; q8 N! ^
  58.         temp=Eeprom_ReadOneByte(1023);        C+ `/ h9 r+ n
  59.         if(temp==0X55)return 0;5 s7 I, W3 Z' r7 F, C  Q9 L
  60.     }6 q4 q6 F+ {0 C# t
  61.     return 1;                                              : Q  _1 w% l+ J+ v+ o$ e' p$ s
  62. }
    / u- a1 r2 l4 S" K" c2 A+ d

  63. " J) K" h) O. y- x
  64. & j' j0 C2 F9 J- a9 ?
  65. /*' c) v/ o+ {5 m/ ~& n
  66. *描述:     在EEPROM里面的指定地址开始读出指定个数的数据% t% ^/ C% A* z! r$ k1 P9 \2 O
  67. *参数:  ReadAddr:    开始读出的地址
    8 X( S! ~# Q3 X1 j0 d- ]
  68. *                 pBuffer:    数据数组首地址
    9 `& _2 m0 D8 c/ ^/ Y0 O0 r* e
  69. *                 NumToRead:要读出数据的个数8 W1 x0 n7 q3 l2 e& @- H
  70. *返回值:读到的数据  _8 ~/ t  ?  {% L6 `9 U! h
  71. */0 }# L6 l- ]# p+ ^4 U& x
  72. void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)) y$ K" A2 X1 D' c. ?5 X0 Y
  73. {
    % W8 o/ A* ^% r& i, a
  74.     while(NumToRead)2 C; E/ j. y% n4 ?/ u
  75.     {
    9 w+ r* b6 |6 t' z2 W( V
  76.         CLRWDG();! G' ~  T% B6 W# Z0 k: B
  77.         *pBuffer++=Eeprom_ReadOneByte(ReadAddr++);    8 @+ |  h* }/ y% t5 w* I
  78.         NumToRead--;. ~) i; {1 J3 l8 O) `
  79.     }
    6 h/ _- t2 r1 N2 |
  80. }  ' }, ]  v) D3 q( I) f# X

  81. ' j( p8 Q% Y; n: h+ S
  82. /** x* ?- l4 s% n: i/ V- L# C- x
  83. *描述:     在EEPROM里面的指定地址开始写入指定个数的数据8 f) R8 v8 X" m$ c: e
  84. *参数:  WriteAddr:        开始写入的地址5 _1 A% `4 p/ L3 _/ i( X
  85. *                 pBuffer:        数据数组首地址
    + E6 h- z, `4 J, r  U# Z4 {; p7 e
  86. *                 NumToWrite:    要写入数据的个数* M! [/ K( g  J% z
  87. *返回值:读到的数据
    + K/ S# @- Y) F. [6 F
  88. */
    # Z% E# T5 W6 a: E( e, b1 @, @
  89. void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
    # |$ @% o- J  O$ t1 c: X; V
  90. {
    . q6 \# u# Q( `* w
  91.     while(NumToWrite--)% m, a  B8 P8 m; n
  92.     {/ S$ g" \& [* i! U/ m: \
  93.         CLRWDG();
    ' R9 |) U% M7 Z
  94.         Eeprom_WriteOneByte(WriteAddr,*pBuffer);2 l5 ^) I1 F8 K: c1 F# e. z3 j
  95.         WriteAddr++;
    " r" h1 H1 Y- I' ?2 m) E
  96.         pBuffer++;
    0 g6 E" L9 Y% }) H% s( e. B
  97.     }% h$ q: H7 G; ~2 Z" R* m
  98. }0 t/ E  o, E/ C- ^; B
  99. ; L  F- `* v1 W. |- W
复制代码

$ `) s: [, K& v8 g3 i* P/ s6 I+ N

  Q) H! I# j% T7 f8 u7 J% f; J
. ?0 f$ I3 z, d! _+ U8 f1 z! `/ m4 q( ^
收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版