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

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

[复制链接]
STMCU小助手 发布时间:2021-11-14 23:04
一、AT24C08的通讯方式5 `9 y! ]! i% t# J  v# N
AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口: a: t, G( U- B; o

; w# x( B; \6 w二、AT24C08的存储方式
/ I4 ~) X9 Q& W5 `* y/ w1 D/ yAT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,
3 v  ?5 h! C9 O. u' r5 _0 p* U5 a* k! S1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间
) R8 q4 D; A7 ~7 W" E# f, N就分成了4块,每块都有256字节存储空间,每个字节是8位! B  s) Z) T$ C
; m+ e( T. s7 P. d# s. l7 ]
器件写地址分别是0xA0,0xA2,0xA4,0xA6% p& m, g+ A- V. S& s! K- Y8 p
器件读地址分别是0xA1,0xA3,0xA5,0xA7
4 o0 M; R+ _7 A; g  \- I
  1. /*) C6 f: X* r) i0 j
  2. *描述:     在eeprom指定地址写入一个数据
    : W: T' m6 w2 R
  3. *参数:  WriteAddr  :写入数据的目的地址
    : x/ T! A  c6 F5 Q+ A- R0 N
  4. *                 DataToWrite:要写入的数据, o* `! H1 M: f9 L0 O. Y
  5. *返回值:读到的数据/ p! Y# h( z! R# R" ^
  6. */
    6 S9 ]5 m' X" b0 t) O: v; Q
  7. void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)2 Y  J- P( r2 `: ~
  8. {                                                                                                  " b* T' k: X5 G8 X
  9.     IIC_Start();  5 R1 @4 d+ G) M

  10. ; \9 Q9 q: E2 V
  11.     IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据    0 P9 b' l: v9 O& c8 C1 y
  12.     IIC_Wait_Ack();       , {  e$ e5 k1 }/ t! A5 t7 ?7 _
  13.     IIC_Send_Byte(WriteAddr%256);               //发送低地址* v) ]- N, x& S' g' B
  14.     IIC_Wait_Ack();                                                           % Y4 K7 y9 T0 R) A% o
  15.     IIC_Send_Byte(DataToWrite);                 //发送字节                               9 Y# m% D/ i  n( [% q$ k
  16.     IIC_Wait_Ack();                     
    / v- K. G1 _% g
  17.     IIC_Stop();//产生一个停止条件
    1 V7 ~) F+ ?# f1 V) l
  18.     HAL_Delay(10);     
    % K- u/ p, N: j+ t0 {2 h
  19. }
    2 F4 V/ g7 J, ^; n
  20. /*
    9 }0 c  J& v! L% i; C0 u
  21. *描述:     在eeprom指定地址读出一个数据8 l" `8 A7 Z" g5 e  P7 c
  22. *参数:  ReadAddr:开始读数的地址1 ^& F6 O+ p! A' a# D$ `
  23. *返回值:读到的数据
    ) n0 F; y1 N- k7 O1 ?0 a& A
  24. */
    % n. Z4 `& R: I" W" @
  25. u8 Eeprom_ReadOneByte(u16 ReadAddr)
    4 e; t" f9 k# G, x  P; [+ T
  26. {                  
    - U# |! O$ ]9 O' P8 Q
  27.     u8 temp=0;                                                                                   ; |: G! r) u4 i9 M, n) ^, h2 B
  28.   IIC_Start();  9 ]: d- \! `& E3 Z: V  q. m
  29.     6 \5 m* V3 r# s  g0 v
  30.     IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据; t( g; {& w$ @; e
  31.     IIC_Wait_Ack(); 4 ?- D) Z6 ~$ [1 C7 F
  32.   IIC_Send_Byte(ReadAddr%256);               //发送低地址
    % w. V. M1 Q  }, S+ t  X
  33.     IIC_Wait_Ack();        
    3 U8 n% Z& \. T; f; F
  34.     IIC_Start();    " Q' U2 B4 X. S  D7 d& [% I
  35.   IIC_Send_Byte(0XA1+((ReadAddr/256)<<1));   //进入接收模式    $ f% w8 _" {+ \" b. I# a
  36.    
    : W  q0 w+ R& V! @% Q
  37.     IIC_Wait_Ack();     
    ! H2 E6 s: j: l! u$ x( e
  38.     temp=IIC_Read_Byte(0);
    ' w# `; e4 t5 W) c1 O+ n* u2 l8 T
  39.    
    7 o7 ?) p/ {/ x$ F& b. ~
  40.     IIC_Stop();//产生一个停止条件     7 G( b5 Z" q" [% @5 L
  41.    
    ) n3 D9 r/ e& s  K) O1 c0 n, S
  42.     return temp;' l4 u& l! S) ~
  43. }6 H1 i5 W# |) J. ^

  44. ' W7 C2 l* l: o1 v
  45. /*
    , M. ?" f( c% ~% `/ K
  46. *描述:     检查EEPROM是否正常1 ^: o$ G" h% g) O% e  K$ I
  47. *参数:  无
    9 D) j* n9 E+ v7 {0 w
  48. *返回值:外接EEPROM是否存在  7 y1 G8 i5 B! I0 A
  49. */2 g7 E6 s  y# c% T
  50. u8 Eeprom_Check(void)) A$ M8 G- t' _& V% e
  51. {- C% q( y  S! o4 d
  52.     u8 temp;2 O5 Y/ M7 u4 W8 |
  53.     temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM           % [3 t) C6 c% u8 A
  54.     if(temp==0X55)return 0;           / Z1 c0 u9 ?" }( m: c
  55.     else//排除第一次初始化的情况; U+ a, o1 @) T: j
  56.     {
    8 h2 e7 f# R5 I& w; v8 t. h" C1 o
  57.         Eeprom_WriteOneByte(1023,0X55);
    5 p9 L1 {% _5 [) R, D  d/ ~
  58.         temp=Eeprom_ReadOneByte(1023);      
    8 w* C+ S4 p  X3 d1 I- I" _
  59.         if(temp==0X55)return 0;4 j9 Y2 O9 }  w: Z, Z
  60.     }7 Y0 W& ?2 f+ k: I8 P3 q
  61.     return 1;                                             
    5 S4 w3 D1 H3 F1 Q. Z: \/ V9 C7 _
  62. }
    2 D: F! _' {( }4 `- R: a

  63. 8 x( N) v4 e; a* A5 g* S

  64. ) K- C+ u/ p" U
  65. /*/ d/ J% X. p5 d; W8 I1 l9 N
  66. *描述:     在EEPROM里面的指定地址开始读出指定个数的数据
    ; k- h9 d: B4 ]& G7 m4 k
  67. *参数:  ReadAddr:    开始读出的地址
    0 k1 P+ n& _' o" M
  68. *                 pBuffer:    数据数组首地址* c1 i7 ?) M0 K# Q" n  e. n0 k. U
  69. *                 NumToRead:要读出数据的个数+ ?0 U4 T- ~# S+ Y
  70. *返回值:读到的数据
    , X" ~- C# U! n9 {
  71. */0 i% w8 h- J! ]6 C/ ~+ c3 U- W
  72. void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)# a9 A/ k/ V! K
  73. {9 [  z( G6 g$ k% V
  74.     while(NumToRead)
    + B. r$ s2 |+ A2 H! J
  75.     {7 O, H# T4 U! ?5 w
  76.         CLRWDG();6 l0 i- S8 n: u, S
  77.         *pBuffer++=Eeprom_ReadOneByte(ReadAddr++);    ' w2 R; U3 X) p) ^
  78.         NumToRead--;; A/ Q- ?: i: J8 }, t  J
  79.     }
    9 ], h: c4 V# q, V
  80. }  4 t: T  V2 n$ a
  81. , R: G5 ^. L1 y6 j1 V8 _+ B
  82. /*
    % U/ `9 f3 G0 N( g# S& g. ~. N/ A& K8 `0 r
  83. *描述:     在EEPROM里面的指定地址开始写入指定个数的数据, k8 K* q3 E2 e7 H8 k
  84. *参数:  WriteAddr:        开始写入的地址
    5 N# l& L. Y; w9 {
  85. *                 pBuffer:        数据数组首地址# K! z/ |- o  x1 L0 {
  86. *                 NumToWrite:    要写入数据的个数1 {! R7 x' z( E
  87. *返回值:读到的数据* K+ C7 M7 B3 z  G! H. y. Q  J8 h5 @
  88. */# W/ X5 y. _3 o2 _, s% h6 [
  89. void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)8 l: u; @5 T/ z. B: M' w
  90. {" Z; ]' W0 g3 b: Y( K
  91.     while(NumToWrite--)
    3 m% {& w" b6 U6 g: Q1 Z
  92.     {4 e2 V5 ?" z* Y3 s5 s- r
  93.         CLRWDG();0 n4 D0 {* u9 w
  94.         Eeprom_WriteOneByte(WriteAddr,*pBuffer);: F& k0 Y6 i7 s$ \+ u  k9 I
  95.         WriteAddr++;  |1 ~% t0 L% P3 K5 }4 E* @/ `
  96.         pBuffer++;
    5 Z3 J3 k) _4 h8 z" B( r% u
  97.     }7 _8 q( g# c6 ?' S9 t' u. j% _; y
  98. }# o0 c% F) m& M$ K$ J7 ~- v! |
  99. * T( R5 ^5 ^) P- o; {1 s/ \& \
复制代码
; ]  Z6 T; J' U( j4 l: f9 `

1 @/ B" r0 j/ e. l+ [* I8 E8 C; z1 _

9 f/ O6 Z3 y% @3 g% X1 z1 N9 |
收藏 评论0 发布时间:2021-11-14 23:04

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版