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

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

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
一、AT24C08的通讯方式
; y7 y9 X* ]8 E2 u6 a8 g& y6 TAT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口
" Q9 i2 N6 d8 u) j
; J$ m# x' B$ \5 {: C二、AT24C08的存储方式
; {& M0 Q/ B3 c9 u& U( ]AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,' n) i' A- b" F$ H! }7 o
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间6 q( G4 E: V9 W, ^" D4 s
就分成了4块,每块都有256字节存储空间,每个字节是8位
" A9 J; h( h$ V3 d+ w+ s4 ^
+ b! v7 t- v/ `- W' g器件写地址分别是0xA0,0xA2,0xA4,0xA6
4 a5 e6 S- y; x器件读地址分别是0xA1,0xA3,0xA5,0xA7+ C4 {' [& I* `  b1 ~$ m" B9 C$ I
  1. /*
    2 E+ b1 M: g5 R& ^! X! D9 a3 t
  2. *描述:     在eeprom指定地址写入一个数据+ z+ Q1 ]+ ~7 N4 g  t, Q' w
  3. *参数:  WriteAddr  :写入数据的目的地址, @2 {5 k, u9 r" W4 Y* k
  4. *                 DataToWrite:要写入的数据6 d- c# K% f4 y
  5. *返回值:读到的数据3 o( e( n8 u$ F- m* p1 k$ {
  6. */5 N: i( Q7 I) t/ \7 z, U
  7. void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
    8 P' r1 y$ `) H! b. K
  8. {                                                                                                  
    " T/ m0 M3 W8 i3 D  J. Q: O4 X0 X. R
  9.     IIC_Start();  
    ; w$ N% V: L- r- C( G6 E
  10. ) P2 ^  c+ q5 s$ a4 D
  11.     IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据    9 C0 f, t! C% b" K+ p# j5 @& p
  12.     IIC_Wait_Ack();      
    / ?! M! Y. [  T! `; o/ ^
  13.     IIC_Send_Byte(WriteAddr%256);               //发送低地址& y2 |5 E# l/ M) L$ O
  14.     IIC_Wait_Ack();                                                           
    - o: _+ }& h' E+ G% ^. [
  15.     IIC_Send_Byte(DataToWrite);                 //发送字节                               5 L: V: t7 g( u$ ~9 w$ r8 \2 h
  16.     IIC_Wait_Ack();                     3 B3 J& m% e4 r. z
  17.     IIC_Stop();//产生一个停止条件 $ {' H& N2 y" E+ z
  18.     HAL_Delay(10);     ( K& }/ v4 P' d) c( G" f
  19. }
    + z8 W; O4 f! u8 `# d2 W* }
  20. /*
    9 K# y3 {+ K: W) q9 B7 M
  21. *描述:     在eeprom指定地址读出一个数据% R/ d& }+ r) d7 r# `1 B; c) _7 \
  22. *参数:  ReadAddr:开始读数的地址
    : ]+ k* l. G/ d
  23. *返回值:读到的数据4 a8 ^' P/ @* B" n7 V! y  A
  24. */6 [  z1 l0 t7 M# J+ C1 H+ j" K
  25. u8 Eeprom_ReadOneByte(u16 ReadAddr)
    % s6 R4 Q( m2 S
  26. {                  
    7 d6 B$ p2 ~+ i" f" Z
  27.     u8 temp=0;                                                                                   9 m( `, y, k8 z& i" K8 m$ _
  28.   IIC_Start();  0 U9 X' a, f! l  f" W- u7 X8 A/ o
  29.    
    $ O- t5 Y- w7 ^& ?, O1 ?6 j/ c
  30.     IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据  c# m/ W* O' U8 @. z* E
  31.     IIC_Wait_Ack();
    $ p/ `! C1 i# X) q* E) S5 v8 l4 C  C
  32.   IIC_Send_Byte(ReadAddr%256);               //发送低地址' ?9 ]" J+ _+ t5 u8 F7 r
  33.     IIC_Wait_Ack();        $ u2 A# b4 N% t- y# @
  34.     IIC_Start();    / L1 Z; K5 F0 W  L
  35.   IIC_Send_Byte(0XA1+((ReadAddr/256)<<1));   //进入接收模式    8 L' N$ d$ w% e2 v$ c) H' l
  36.     5 T+ Y; v/ F2 A: K# x. g
  37.     IIC_Wait_Ack();     ( A% p! }1 o; ~' ~
  38.     temp=IIC_Read_Byte(0);) y) o; E2 K3 P/ m. [9 C
  39.       I+ j- H1 s, i/ h( b5 @2 S5 r  ^
  40.     IIC_Stop();//产生一个停止条件     * c0 O3 M1 O6 D, n+ w' [" Y$ a
  41.       K0 q. D  T% |  r
  42.     return temp;
    1 }% m0 i& }" b& ?7 C) O. w
  43. }
    & I) m" i- j6 j, j6 J+ H
  44. 1 V( L$ F$ z: [- `: S
  45. /*$ D' w, A, \1 i( {; k
  46. *描述:     检查EEPROM是否正常
    4 x: R5 k# B# p. h* T
  47. *参数:  无
    - @1 Z' t! P3 s
  48. *返回值:外接EEPROM是否存在  6 K$ x" r6 X0 [$ y
  49. */, a( t6 f$ H& u+ Y
  50. u8 Eeprom_Check(void)$ I4 v) F1 F1 v9 m- r3 V0 q
  51. {; F0 w( ]* p7 ?+ l* q+ T8 t4 e
  52.     u8 temp;6 K; b1 M% E# ?6 \- s$ p
  53.     temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM           ; t/ \! ~5 X; n! m8 ^
  54.     if(temp==0X55)return 0;           
    - o# K' t( M; {' }. M
  55.     else//排除第一次初始化的情况# G. T; o1 ]3 j0 f- q  I8 [
  56.     {" _0 a' G& _) V1 E: y& [2 o" G" A3 K
  57.         Eeprom_WriteOneByte(1023,0X55);( M, I2 V6 C. n2 a
  58.         temp=Eeprom_ReadOneByte(1023);      
    . l2 l2 D6 B" [
  59.         if(temp==0X55)return 0;
    4 z; G$ W  @7 h+ w
  60.     }1 B1 e- }) J7 a8 W0 ^8 \
  61.     return 1;                                              $ Z9 n  _7 y; K; N
  62. }* j5 Q+ H  B3 Y' @$ \. R- r: l

  63. ( W7 \5 x1 N0 o8 o
  64. 3 [" T# a  _8 ~
  65. /*( T% r3 j8 c$ ~3 ~3 N0 E- B
  66. *描述:     在EEPROM里面的指定地址开始读出指定个数的数据
    9 N; m' H( E2 I, i' D! ~
  67. *参数:  ReadAddr:    开始读出的地址
    # z9 W5 A. P: }
  68. *                 pBuffer:    数据数组首地址5 {, U3 K: u  X  z! L
  69. *                 NumToRead:要读出数据的个数; r& V1 G3 ^2 Q# d& y1 v$ E
  70. *返回值:读到的数据
    ' @6 h# U3 h, d7 i& e/ o
  71. */9 n: y& `2 F) D7 U% x
  72. void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead): B: E& q1 m. H" \
  73. {
    , o2 D, s2 h9 `& N  I
  74.     while(NumToRead)- r9 e/ ^1 I* g. e2 ~' ]7 ~* \
  75.     {
    ! c( I2 O( E- \6 E: A
  76.         CLRWDG();
    ; e, J2 N' L# _
  77.         *pBuffer++=Eeprom_ReadOneByte(ReadAddr++);    ; a& `+ Z% p1 C4 _+ |1 o
  78.         NumToRead--;* M1 y; {+ M. F
  79.     }/ I2 P6 {1 ^" \- [: N% k
  80. }  
    ( t% _8 a1 y: h  B- |1 H: N
  81. ( O* J$ o1 _0 Q& Q- W; d( t2 Y
  82. /*
    - L7 l. T# }) |# P: \
  83. *描述:     在EEPROM里面的指定地址开始写入指定个数的数据
    8 u: G. d" _# e7 t) N8 g
  84. *参数:  WriteAddr:        开始写入的地址
    3 D0 H% j# ]" V; G3 Y7 T8 X
  85. *                 pBuffer:        数据数组首地址
    1 t; v) H/ d; O/ x2 ?& p
  86. *                 NumToWrite:    要写入数据的个数+ F" Y  e% ^& l$ A
  87. *返回值:读到的数据. m; u0 d' K, R+ v+ G
  88. */6 a( p, A; h# G+ J% p' C
  89. void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
    * h: T" |& ~( \6 g; P5 J
  90. {
    : W8 G+ s2 u8 S( y! n+ B* k
  91.     while(NumToWrite--)
    : d/ {' K  o( H) ?  E& x
  92.     {7 Z' m+ {" `, o9 b
  93.         CLRWDG();
    " f( S+ S9 @; a5 e. P( w5 [
  94.         Eeprom_WriteOneByte(WriteAddr,*pBuffer);
    : m, @2 M# U' U- ?- l
  95.         WriteAddr++;' j8 E' N8 [3 t+ y5 c
  96.         pBuffer++;
    ( P8 {6 d; C  O. @$ c3 T! ~% \: y5 K
  97.     }
    ' G  _: P9 W3 h0 L
  98. }
    ) B6 N- X* s7 x3 l/ D* R

  99.   n8 w9 f' r( E* w7 R' X
复制代码
; W1 L+ e, Z: S8 k( T" G3 h
' H7 M1 k) _( B3 O( W

) }( ]9 t: X) K1 b& t* W: r, g- @
2 B% ?/ f' ^4 M: j: F( R# A
收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

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