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

【STM32G4 NUCLEO G431RB】+ AT24C32驱动成功

[复制链接]
老牛洋车 发布时间:2019-9-17 12:50
    我购买的日历模块上除了DS1307外,还有一块AT24C32EEPROM,在DS1307成功驱动后,继续驱动AT24C32就顺理成章了。; x) v: b6 r+ |: s4 ^
    因为软件I2C在驱动DS1307时已经调试好了,所以AT24C32的驱动就异常顺利,加上我之前就有驱动AT24C02的代码,而AT24C32仅仅是地址比AT24C02多一个字节,复制过来后,只要稍作修改,并写单字节地址改为写双字节地址,整个驱动就算完成了。
. T7 g. C+ L$ [    下面是AT24C32的驱动代码,其实就是四个函数,分别是读写单个字节,读写连续的多个字节(此处没有考虑跨页处理)。
9 }9 c7 d) ?+ T
  1. 5 f4 Y& S3 i* A
  2. #include "i2c.h"
    ! {7 v; D$ L- N: @- d
  3. #include "at24c32.h"
    9 X1 }8 g9 N* c' e) g' l; I/ _

  4. ; {  p" E& l" d  k! j
  5. /*************************************************************" @- p1 r3 L. B% E2 e
  6. * 函数名:  at24cxx_Wite_Data(uint8_t addr,uint8_t data)
    , \6 O1 P( L, y8 q% R- J- M2 p
  7. * 输入参数:addr = 要写入的地址' A& t, Z0 T3 _+ e+ p
  8. *           data = 要写入的数据, D" `/ u  O3 x+ }( g
  9. * 输出参数:无+ B& ~. L" |; f4 o
  10. *************************************************************/8 r1 G3 R) q- C8 ]- c/ g
  11. void at24cxx_Write_Data(uint16_t addr,uint8_t data) // 将数据data写入指定地址Addr
    ! ~+ {% `. W( i% C8 e7 q& B! C
  12. {
    4 C5 r0 A: i0 i0 G* S7 w1 i
  13. ; J: t" b4 @, t+ I2 P+ k
  14.     SI2C_Start();                //开始I2C通讯
    ' i9 @2 |& U& p
  15.     SI2C_Send(0xA0);             //发送EEPROM器件写入地址( B' }, T% L# \0 c) m5 N) \
  16.     SI2CIsAck();                 //等待应答
    $ v; e2 x( `; P& [: ?. w* i+ r
  17.     SI2C_Send(addr>>8);          //发送高8位地址, L9 n+ U) ]1 q7 E3 N5 R9 K, t
  18.     SI2CIsAck();                 //等待应答" e, J- ?, B" P! v2 N
  19.     SI2C_Send(addr%256);         //发送低8位地址
    : c) z* X& q, [: B! ^% C/ _
  20.     SI2CIsAck();                 //等待应答: R$ U9 Y8 E, z0 P
  21.     SI2C_Send(data);             //发送数据6 G2 x5 f) s& c5 }
  22.     SI2CIsAck();                 //等待应答
    " V5 k6 w" U8 q
  23.     SI2C_Stop();                 //结束I2C通讯2 T4 ]% o2 @5 ~
  24.     delay_us(4);
    ! k- P1 Z& Q& a; F2 [1 X
  25. }' [7 B, h2 ~  q; s8 X4 |+ K

  26. ) |' m; e1 i6 O- q
  27. /*************************************************************7 X' w0 L  g  j2 t9 t. ~' R
  28. * 函数名:  at24cxx_Read_Data(uint8_t addr)
    9 {* K, |$ K0 Z- q: s3 q
  29. * 输入参数:addr = 要读取的地址
      M! V9 ^7 b9 P
  30. * 输出参数:data = 读出的数据
    5 F0 d; Q/ |9 \5 Q
  31. *************************************************************/) D# f8 P& K5 ~' ?7 k
  32. uint8_t at24cxx_Read_Data(uint16_t addr)            // 读指定地址Addr里的数据Data! W# Y) y  F" E/ V- r  @* `9 e
  33. {
    # ~& Q( c) M0 d( z; ]4 L  r: K0 d
  34.     uint8_t data=0x00;: J0 W0 E' K4 l; @
  35.     " p2 ]8 F0 [) C6 i0 z/ E# s
  36.     SI2C_Start();                //开始I2C通讯4 `, ~7 h. f$ E2 x( E2 S" P$ Q0 C
  37.     SI2C_Send(0xA0);             //发送EEPROM器件地址: e4 \) A  P: b8 e3 F9 Y
  38.     SI2CIsAck();                 //等待应答
    0 x/ W4 y, R) G# H/ l/ a* i
  39.     SI2C_Send(addr>>8);          //发送高8位地址
    1 y" ^, U# r& B4 N7 ^1 m: X
  40.     SI2CIsAck();                 //等待应答( n& c6 q  Q: M- ~, F
  41.     SI2C_Send(addr%256);         //发送低8位地址7 x# K. n$ O4 ?: r7 G) q/ f
  42.     SI2CIsAck();                 //等待应答+ q- `+ K1 R& P: R& P+ b, u4 d- Z
  43. " z; t% Y' F# u. q! q5 Z
  44.     SI2C_Start();
    . f. b4 K8 x3 q% |
  45.     SI2C_Send(0xA1);             //发送EEPROM器件读取地址% I" C8 j! C- ~* i
  46.     SI2CIsAck();
    9 M; B  L# f% C0 I) |6 N
  47.     4 ^& @$ u) _2 Y
  48.     data = SI2C_Receive();       //读一字节数据) Q& e9 O+ E" s' X* e9 o& `
  49.     SI2CDoAck();
    9 \) J0 Q4 p# i
  50.     SI2C_Stop();
    / r, m: w8 p: P9 W# k/ p  d
  51.     delay_us(4);9 W  H$ k2 }0 K# \) q
  52.     return data;
    : @6 R+ S) @* b
  53. }; Q$ t5 h7 ]2 Y7 Q" K4 w! a2 O
  54. 3 R4 i) S0 z4 p5 r# N7 B
  55. /*************************************************************8 a4 Z0 D2 R4 G2 s% s& N  N
  56. * 函数名:  at24cxx_Page_Write(uint8_t addr,uint8_t *buff,uint8_t size)
    ) ^& M# f5 A! v" p0 I! i
  57. * 输入参数:addr = 要写入的起始地址
    8 p( N: j0 }( X! F
  58. *           *buff= 要写入的数组指针( P! a1 Z0 ?8 `. ]+ l! |. ^- s4 i
  59. *           size = 数组的长度- J9 n: _- o, U' B0 a8 c( g' C  a
  60. * 输出参数:无
    $ f$ g. d$ m' M
  61. *************************************************************/
    3 i( U, x8 b- K/ u
  62. void at24cxx_Page_Write(uint16_t addr,uint8_t *buff,uint8_t size) // 将数据buff数组写入指定起的始地址Addr
    0 O  P8 [" y4 ?0 G1 g1 x3 ~7 I
  63. {
    ) n3 |+ Z4 _0 e6 V/ \
  64.     uint8_t i;4 k4 r+ \+ G; e) A- g5 B
  65.         0 T% R: B# g0 n3 q3 f3 m& ~
  66.     SI2C_Start();                //开始I2C通讯
    " m# k; x0 N5 S' P* Z- j/ m" X0 z
  67.     SI2C_Send(0xA0);             //发送EEPROM器件写入地址4 W! l; f  f  ]
  68.     SI2CIsAck();                 //等待应答8 B$ k& h3 V/ y- @1 @/ ^! p3 ^
  69.     SI2C_Send(addr>>8);          //发送高8位地址
    % t5 k) \9 A; r' t7 K
  70.     SI2CIsAck();                 //等待应答& m- K/ B8 t$ `/ p
  71.     SI2C_Send(addr%256);         //发送低8位地址
    $ g0 ?: k8 Z  @" @( c
  72.     SI2CIsAck();                 //等待应答       
    % n& v7 f. x; t7 i2 Z
  73.         for(i=0; i<size; i++){/ s/ ]4 i' v3 p4 @
  74.         SI2C_Send(buff[i]);      //发送数据* A& }2 ~+ [! ~) O: g2 E+ Y6 Q
  75.         SI2CIsAck();             //等待应答3 _% o8 ]  S" {, ]! _7 Z
  76.     }# W6 ]+ Z9 `$ q9 c  }8 Y: n4 S9 w' a
  77.         SI2C_Stop();                 //结束I2C通讯& F. K  m7 A+ @% w7 L& c: y
  78.     delay_us(4);
    & }  N; p: L1 K
  79. }
    # h, d7 F# M: f1 u$ b" M* m6 m4 R

  80. ; q, v5 K" @5 b2 C+ l/ y/ p# d
  81. /*************************************************************
    2 A, B) U9 a1 ~( _1 C! n
  82. * 函数名:  at24cxx_Page_Read(uint8_t addr)
    7 R9 w4 }* M& j+ V9 M: u7 Q
  83. * 输入参数:addr = 要读取的地址
    * j6 d" n% j" |2 |2 ^
  84. * 输出参数:data = 读出的数据
    + t+ [2 u9 n" a, H5 I) w
  85. *************************************************************/
    2 ]" B0 U+ G& n- i+ f) w9 Z
  86. uint8_t at24cxx_Page_Rea(uint16_t addr,uint8_t size)// 读指定起始地址Addr里的数据到buff
    ! [) f9 ~3 `6 S+ [/ o( o
  87. {
    # `& V: G' J* }* R' w
  88.     uint8_t i,buff[size];4 Y4 ~0 p! _7 Q: ?3 Z5 ~
  89.     * H, V' _' S9 ?
  90.     SI2C_Start();                //开始I2C通讯
    * w& x  t( d2 I( w: z% n
  91.     SI2C_Send(0xA0);             //发送EEPROM器件地址
    - w1 S' G5 p5 \9 \# U9 e
  92.     SI2CIsAck();                 //等待应答
    6 X) K1 e; K+ t8 Q# V4 ?
  93.     SI2C_Send(addr>>8);          //发送高8位地址
    % Z) R. Q3 c. D! U' I5 }
  94.     SI2CIsAck();                 //等待应答+ m0 N/ `0 I" \3 S7 t
  95.     SI2C_Send(addr%256);         //发送低8位地址# P( C# z, L* _$ t
  96.     SI2CIsAck();                 //等待应答
    ) L6 t$ S' R; D# l

  97. . x# `. }& f1 I
  98.     SI2C_Start();
    ; u% x& m7 t# P1 s
  99.     SI2C_Send(0xA1);             //发送EEPROM器件读取地址
    / R! l# J. A  F7 v: f" J
  100.     SI2CIsAck();- E2 }! Y: S3 i4 u
  101.     for(i=0; i<size; i++){
    % e7 b9 X' ?$ I" r) b8 q" \
  102.         buff[i] = SI2C_Receive();//读一字节数据
      W3 ?8 h  A: K# G% `: @
  103.         SI2CDoAck();
    ) _3 M% ?9 b6 W- y" ]
  104.     }. J9 Z6 Y. I( g- Y
  105.         SI2C_Stop();: Z+ h( p: }) Q; R5 L. V7 @
  106.     delay_us(4);( k- H/ V: x& Y' `4 Q
  107.     return *buff;3 p' n/ @& A, [) w+ R
  108. }
    $ m8 O7 s) G* L" _( ?( n5 n

  109. 4 C% \) K. R8 D- j5 ^
复制代码

- _+ |" G4 O; F* ~6 S) G$ y6 l/ k$ o8 [- R8 V( D) b

2 l6 h6 H2 ~) e! v$ V
9 R! @3 w* B2 r3 R6 D+ u! D1 ^8 J9 ]" S
收藏 评论2 发布时间:2019-9-17 12:50

举报

2个回答
jxchen 回答时间:2019-9-17 13:02:04
^^^^^^^^^^^^^^^^^^^^^^^^^
老牛洋车 回答时间:2019-9-17 15:52:18
项目的压缩文件(不含固件库等)。
) \2 j% A+ S( Z3 |8 n- e, a6 f project.rar (8.8 MB, 下载次数: 31)
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版