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

【STM32G4 NUCLEO G431RB】+ AT24C32驱动成功

[复制链接]
老牛洋车 发布时间:2019-9-17 12:50
    我购买的日历模块上除了DS1307外,还有一块AT24C32EEPROM,在DS1307成功驱动后,继续驱动AT24C32就顺理成章了。
: a$ w. U) \  o2 {9 Q) x    因为软件I2C在驱动DS1307时已经调试好了,所以AT24C32的驱动就异常顺利,加上我之前就有驱动AT24C02的代码,而AT24C32仅仅是地址比AT24C02多一个字节,复制过来后,只要稍作修改,并写单字节地址改为写双字节地址,整个驱动就算完成了。0 G3 e4 T3 Z0 o( x  s7 F4 Z
    下面是AT24C32的驱动代码,其实就是四个函数,分别是读写单个字节,读写连续的多个字节(此处没有考虑跨页处理)。
$ W' T/ k1 w, T8 B
  1. % ^: G9 h1 Z0 ]6 E8 J/ [
  2. #include "i2c.h"
    ! k/ _- e: }- _+ W
  3. #include "at24c32.h"
    9 g9 o( s$ Q5 i

  4. # w, e$ ^; K" k# N* D1 |% g
  5. /*************************************************************9 d+ F0 E; P' y  ~0 ]# V' x
  6. * 函数名:  at24cxx_Wite_Data(uint8_t addr,uint8_t data)
    0 B8 z9 G/ V& f: f. H
  7. * 输入参数:addr = 要写入的地址: v4 E/ l: z1 N' g+ x% i" h
  8. *           data = 要写入的数据
    3 k% K( g( F) W/ A( i" q; P
  9. * 输出参数:无6 p* ]$ N2 ?6 @- Z# d
  10. *************************************************************/4 B3 Z+ N/ t: _' g2 g9 j) w
  11. void at24cxx_Write_Data(uint16_t addr,uint8_t data) // 将数据data写入指定地址Addr# j/ d1 ^/ h8 d+ ?) r( @6 i2 }
  12. {* V  p4 B6 F; J% o8 b

  13. 8 `. l4 B: ^  S$ n9 U0 K+ R
  14.     SI2C_Start();                //开始I2C通讯
    3 m. D' r( z) e6 p9 [1 i
  15.     SI2C_Send(0xA0);             //发送EEPROM器件写入地址' _, [6 F. L  n  g, |" m/ P8 `
  16.     SI2CIsAck();                 //等待应答* L, z& h! l5 @- c$ b8 o
  17.     SI2C_Send(addr>>8);          //发送高8位地址
    ' {8 E/ Y& M5 O& J# A7 ?
  18.     SI2CIsAck();                 //等待应答
    7 l# h! F2 I" E; N3 U3 |) ^: P3 F
  19.     SI2C_Send(addr%256);         //发送低8位地址
    7 V1 @% D. M/ Q5 V5 r5 i9 J) Z' }
  20.     SI2CIsAck();                 //等待应答% R; ^' ?# C, |8 K0 u
  21.     SI2C_Send(data);             //发送数据! [8 M, \+ ^+ J, i# R" B( ]
  22.     SI2CIsAck();                 //等待应答+ ?6 i& K! \7 K! f2 I# ^' F
  23.     SI2C_Stop();                 //结束I2C通讯
    * [$ ^3 a8 L. [
  24.     delay_us(4);/ j4 z* D! Y2 C" b2 A/ o
  25. }2 h) @$ u# _2 j: D/ p9 d  y
  26. * ]  J4 D0 a2 i; P% Z. T6 {
  27. /*************************************************************! u' }5 m1 y! O# d; {3 R9 e1 U! U5 K4 {6 X
  28. * 函数名:  at24cxx_Read_Data(uint8_t addr)8 t! m1 X% p, Z3 V
  29. * 输入参数:addr = 要读取的地址
    5 g) v5 t0 K- P! C) d
  30. * 输出参数:data = 读出的数据. q- `; [) i. A8 C5 I' D# J
  31. *************************************************************/+ V& R, R0 r1 E# B, I$ |% s* {
  32. uint8_t at24cxx_Read_Data(uint16_t addr)            // 读指定地址Addr里的数据Data
    . b- `: _3 I* r
  33. {
    3 c1 W% [: R4 ~( J- Q1 F
  34.     uint8_t data=0x00;
    6 v( H' Z) [5 f+ o! B, m% [! P. H
  35.    
    * y7 L6 W# H1 b9 K# ^5 j% P
  36.     SI2C_Start();                //开始I2C通讯6 T. H3 N4 P* O! f- }) E7 t$ n& E8 m
  37.     SI2C_Send(0xA0);             //发送EEPROM器件地址
    0 k; S7 T$ L: v
  38.     SI2CIsAck();                 //等待应答
    / [9 A1 s) ~4 c" k: d" @- W
  39.     SI2C_Send(addr>>8);          //发送高8位地址& l' I% K+ L; O+ u5 s: O8 O! w
  40.     SI2CIsAck();                 //等待应答
    : g, V6 n/ A! I. ]* A: G* w
  41.     SI2C_Send(addr%256);         //发送低8位地址
    . I: D4 h& K0 W. ^% d
  42.     SI2CIsAck();                 //等待应答. [0 g. \3 h0 T+ X8 k! t7 T- B# B

  43. ; ~( A- |: I3 [  w# Q
  44.     SI2C_Start();
    4 z9 ]$ ~* y8 v5 n0 J+ \! b
  45.     SI2C_Send(0xA1);             //发送EEPROM器件读取地址& P+ Y, Z: M9 @- w- u8 V+ m5 ~
  46.     SI2CIsAck();( y3 d6 L7 z( n* s  N) T
  47.     . e/ z! I  z$ a" z. O2 d
  48.     data = SI2C_Receive();       //读一字节数据* v$ z+ J4 t/ u  ~
  49.     SI2CDoAck();& j! ]/ w5 c1 o, A* B/ M! `
  50.     SI2C_Stop();
    2 w# R5 d5 B& C) ?1 S  O
  51.     delay_us(4);9 h) W! v, b5 \' v: ]( m* Y1 l) O, G
  52.     return data;, E5 [) ]1 a' U$ x* u- e$ s( P6 I
  53. }- N$ T* X& k* B6 m' x

  54. 0 Q( n+ I% c, U' M& N
  55. /*************************************************************; r7 H" {6 N7 J8 D2 `2 F1 ~
  56. * 函数名:  at24cxx_Page_Write(uint8_t addr,uint8_t *buff,uint8_t size)8 u4 h0 i. c5 [, h  X
  57. * 输入参数:addr = 要写入的起始地址
    3 V  y7 ?4 n' e, t7 h' `* P# ~) v* Q
  58. *           *buff= 要写入的数组指针/ @9 h* r9 E' z3 x8 l& o
  59. *           size = 数组的长度% g& Z3 M, T: l. ~% w- m1 e
  60. * 输出参数:无
    $ M3 i% ]& b# ?7 W
  61. *************************************************************/( E4 p) ^/ v/ K: v" J
  62. void at24cxx_Page_Write(uint16_t addr,uint8_t *buff,uint8_t size) // 将数据buff数组写入指定起的始地址Addr+ H; g+ M$ ]% u0 S, l  ]! R( u
  63. {
    : F; ?0 ]- b. Z% L
  64.     uint8_t i;
    0 K* i( F0 i: X
  65.         # [1 C0 W0 I8 W5 I) Q, }& O
  66.     SI2C_Start();                //开始I2C通讯) h; f2 f  Q# G& @$ z
  67.     SI2C_Send(0xA0);             //发送EEPROM器件写入地址  }9 s, j# X& J" g% a
  68.     SI2CIsAck();                 //等待应答, g. z8 g  S3 _5 Q3 e8 v
  69.     SI2C_Send(addr>>8);          //发送高8位地址
    2 ?5 z. u7 n' W& u. [
  70.     SI2CIsAck();                 //等待应答+ C! a( S# t6 ]& u( J/ f
  71.     SI2C_Send(addr%256);         //发送低8位地址- {1 @! k  t6 H+ F$ v* }
  72.     SI2CIsAck();                 //等待应答        ' b; b1 {$ f0 J, ~
  73.         for(i=0; i<size; i++){# T4 b: n% s3 X% D  c& Z
  74.         SI2C_Send(buff[i]);      //发送数据* h' ?! q$ i0 }6 C- i+ c. {
  75.         SI2CIsAck();             //等待应答
    ( m- J4 q, K/ w
  76.     }+ ~% ]; ?; k6 s( g7 \7 w" Y. ?
  77.         SI2C_Stop();                 //结束I2C通讯
    ' H  L+ o1 E& ^* |/ o; f
  78.     delay_us(4);
    $ m2 b# l( `) f% U# h
  79. }1 \- z2 ^- Z* X$ D; b% a
  80. ; ?7 G6 z5 q# i9 r! x/ ]1 p
  81. /*************************************************************% S3 E3 x& G0 U' z) L  }
  82. * 函数名:  at24cxx_Page_Read(uint8_t addr)
    ( f- L! W# x9 V% a" p
  83. * 输入参数:addr = 要读取的地址
    2 P# [, K0 a" p' S% A( _
  84. * 输出参数:data = 读出的数据/ N7 H: s* ^1 C7 J9 W
  85. *************************************************************/
    ! J  z/ R! N! R; d
  86. uint8_t at24cxx_Page_Rea(uint16_t addr,uint8_t size)// 读指定起始地址Addr里的数据到buff7 t: s, O  O$ Z' K: e. ~+ o  p0 K
  87. {; b3 V  I: Z8 [
  88.     uint8_t i,buff[size];, Y1 u+ {8 P4 B: v4 R
  89.    
    ' l# q% m7 z+ ~  c
  90.     SI2C_Start();                //开始I2C通讯
    ( |! E& K! J$ c+ }
  91.     SI2C_Send(0xA0);             //发送EEPROM器件地址& i/ w4 m3 p) l1 a
  92.     SI2CIsAck();                 //等待应答
    1 O( N" D8 Q9 u. p$ b3 y0 z/ P
  93.     SI2C_Send(addr>>8);          //发送高8位地址& o  U, L$ u% Z! b( S/ z, M. f
  94.     SI2CIsAck();                 //等待应答
    ) N& L, A# t- T9 W4 v8 P) B
  95.     SI2C_Send(addr%256);         //发送低8位地址8 ~  v9 M$ D2 o+ n* c) z( e9 v2 l
  96.     SI2CIsAck();                 //等待应答
    ' S+ c. @; ?8 a# O2 u2 }$ F# J
  97. & G& N- D. d8 {! {: `' p  G3 o# z
  98.     SI2C_Start();
    4 T0 H% l; o9 e% {3 U
  99.     SI2C_Send(0xA1);             //发送EEPROM器件读取地址
    . p; E3 @) ^- ~0 L/ U
  100.     SI2CIsAck();
    3 V6 d: x+ j9 ^/ y6 S+ u
  101.     for(i=0; i<size; i++){
      o) Q% k! J- I( d3 R
  102.         buff[i] = SI2C_Receive();//读一字节数据3 ^5 z4 a) Y2 o# C
  103.         SI2CDoAck();/ k* Z3 ~# e* @7 r$ k) y( p. A. s
  104.     }" X! Y; D, k6 [& t/ I' l& s0 @
  105.         SI2C_Stop();- ]1 {, D: T7 P& Z# N2 @# Q% u1 A
  106.     delay_us(4);
    . p$ J2 h9 Q7 [7 n0 k2 m
  107.     return *buff;
    ) h1 C' O3 o$ b, r
  108. }+ i* _& ]3 e3 q/ ]2 g- u- G4 X& D

  109. 1 ]4 d$ f! ~8 f/ B% k
复制代码

. ]  ^! B& Y0 S) i0 J) O+ w7 B4 [3 j9 m, `& H

0 k9 g/ ^5 N+ {6 G0 f
4 A% G5 A/ X' b; x8 D  Y3 }
5 A. a. x. q+ p' X
收藏 评论2 发布时间:2019-9-17 12:50

举报

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