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

STM32F103标准库开发---IIC主控实验---普通I/O口模拟---读写AT24Cxx系列EEPROM实验

[复制链接]
STMCU小助手 发布时间:2022-9-7 14:59
一、AT24Cxx系列芯片简介
1 V% J5 A' X" S4 Y9 |" iEEPROM是指带电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。( c; D7 r. e3 R$ S
AT24Cxx系列芯片是EEPROM芯片的一种,它是基于IIC总线的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。) c$ X% y- L7 t8 `; ?! Z2 a& S5 F
AT24Cxx系列芯片 在电路中的主要作用就是在 掉电的情况下保存数据。
- q2 p' u& w% S* [% b+ t! c9 y2 K: ~0 V5 V) ^" c4 M" S1 C8 P
1. 存储结构
/ w. n9 G$ h" m9 V% ^ 1~UGCKZ~1@ASD55H_ZEY832.png & ~5 h+ s% X8 q) P( q) P1 A

) u6 V' p# ]; e5 O1 |2. 引脚
3 p/ Y" ?9 [" |0 r# l8 yAT24C02,AT24C32,AT24C64,AT24C128,AT24C256" G* U' t% {$ X+ `% n- t, K( S
这五种型号的芯片,引脚图都如下所示:
* M% ?* z. D; p+ Z( u# E0 C
9 y* x9 |2 q3 O6 u& ]9 e 8f3c6592d4244dbcac0df106c52370dc.png . p; P0 v- h6 \

) G/ \+ N7 @6 a) X5 q' U5 z# y# u引脚说明如下:
( _1 H" z" c. M8 q
: Z- z9 }0 w1 N: y% v NJF($WU3]VLD]UW]FQ8P$BT.png
1 [8 b, K& s) I  d; v$ x8 n8 R2 u1 W% I
AT24C04,AT24C08,AT24C16
% F0 D- ?% D: V: H这三种型号的芯片,引脚图都如下所示:
0 w3 f6 K9 x. o# [- `: S" \- |0 m( q% F5 E6 g8 D8 U- x
)QUM1[O{4D8{Y0U`[GDK3X8.png
% p% D4 N# \4 g5 H& T7 d6 Y
& q% p! U' Q& D" e  D) B8 JAT24C512" [3 G2 j6 ^% W: @$ S$ T
引脚图都如下所示:
  h- a& y9 X8 h6 t; c3 S! o1 P1 ]
9 d! K9 O5 x4 \# O% O; a+ H- r

. J4 B/ S1 O& yA0和A1是硬件地址,NC空脚可接地,总线上同时级联4个AT24C512器件。
+ ?8 L! H' \6 Q, Z. l8 D' ^$ Z8 ?0 k* T" Y& O: l
3. 原理图
( m8 o0 S% O3 I  b5 K7 s
' X2 R' N  f  b" C1 w' V2 D/ f$ x+ F6 } c47ba4c356cc4fbf91e16**460f510.png 5 q, r# w4 ?! S7 z0 Z! k
! e- a, D, k' ~
4. 从控设备地址2 `* d3 _: _$ x. f  r
从控设备地址前4位,所有型号都是一样的。& |( r0 w! C4 Z% [4 U  W
随后3位是A2,A1和A0为硬件地址位,与硬件输入引脚一致;P2,P1和P0为数据地址高位。
- b& N/ j& m0 P7 |最后1位是读/写选择位,1为读操作,0为写操作。+ F+ N; }' p# b3 d

+ |9 a0 q' H0 _! H( y 1[[E($%K[7YDHJUPX0DL~PC.png
8 c* z: h- [( ~9 x8 `& h7 ]* D, y  e# O: C
二、IIC总线的数据传输/ D! p8 [: m1 W5 D0 W
IIC总线上的每一个设备都可以作为主设备或者从设备。/ E& P/ c* W3 N/ |; C4 t9 @2 ?0 m1 x
每一个设备都有对应一个唯一的设备地址,设备地址就是通过A2,A1和A0物理接地和拉高决定,主从设备之间就通过设备地址来确定与哪个器件进行通信。
$ k3 W2 Q0 ^9 l% `! m/ L这次以STM32F103开发板为主控,以AT24Cxx为从控。
( e2 j; P5 c; y' {( H7 S" u" p# g- N7 ]- ~! e1 D9 K
1. IIC总线数据传输协议
+ m/ x9 D! z. D8 h# ~主控设备在传输有效数据之前要先指定从控设备地址,然后确定数据传输方向 (0表示主控向从控写数据,1表示主控向从控读数据),然后传输数据。
: u9 |1 D/ S/ |; K- i; S& z  s2 H! S# v3 ?
8f1d2c0437894e1987e184a2902d3072.png
8 T: z' V# t& U
2 e* \3 n+ Y* K1 |) |8 F2. IIC总线主控写数据
* y  G+ s: a' ~% ^IIC总线主控写数据时序图1 B* A8 |8 l+ K
5 i; v% ~3 L7 O
cdadee2fec894cdcad0d728d5774d943.png
3 h3 A. I, F/ O4 W' n% Z- r, d! F$ d: s& e1 b3 ?( S
主要流程:
1 o: I9 [& A$ P# ^/ G: u* |2 w7 P, b6 G% w# F7 n1 _7 L
主控发送起始条件
. m9 ^4 ?5 f2 n+ w主控发送从控设备地址
" s0 ~! i# Y* t) i6 d  V主控发送写操作
- \$ Y! U# z) M0 U* _! r8 q0 @5 ~主控等待从控应答:应答失败,主控发送停止条件;" m' P1 L7 L1 b+ ~5 Y/ s% U
         应答成功进行下一步
+ W0 q& m$ u: Z( l5 p0 S+ g* O从控应答后,主控发送要写入的数据- t5 @/ b; z+ J" H) c
主控等待从控应答:应答失败,主控发送停止条件;
1 E4 ^5 X7 ^; H6 D& q" a; B         应答成功,进行下一步0 O- b. H) R( \  r1 U9 T
主控数据发送未完:重复5和6步骤;
6 r& R# O  `, H) C8 D0 v6 L主控数据发送完毕:主控发送停止条件5 L6 E* Y% G, d/ M+ z( j. t+ s" S
2 D# t% j2 v; T" p2 Z& @0 P
3. IIC总线主控读数据
# l4 J. R. j' DIIC总线主控读数据时序图
9 B# x, ~- L5 e. Y) X3 n5 C: w* H$ z' o0 q& ^; z
1d4518e470d94e0e95c105a423c5472f.png
& Q- e1 e4 ^" b5 ?1 _" F+ B% X
) F1 f& `2 m/ y/ ]9 L" U! n主要流程:
1 d* y4 N$ F' o8 h& N( H主控发送起始条件. [% J) ?$ r0 c  l  w9 j
主控发送从控设备地址
4 ^: }+ s7 I0 U+ b5 m" }' t主控发送*读操作**8 Q# N% M0 J, \/ J9 @9 k
主控等待从控应答:应答失败,主控发送停止条件;) t0 q* [) s7 J1 y  B) Y$ K
         应答成功进行下一步
  ^5 _' f9 ]4 q: F$ K从控应答后,主控读取从控发送的数据
( l3 y: E& ?: }主控发送应答:应答失败,主控发送停止条件;' e. G& q0 k4 S3 y8 e/ u# h
       应答成功,重复5和6步骤
4 d. H, V+ L. G5 M/ `9 B4 f, G' h. K+ }& H: ?% K/ y
三、普通I/O口模拟IIC总线读写AT24C256
+ O, G4 I* l: A3 d% u, z( z$ n& [. H. r  ?
VU3Y{N289OTVFL%N10BT~4B.png 9 q4 Q% N" J0 t# L
# F6 q  j5 h4 Q7 i2 }
1. 原理图
4 X9 |' T' ^; L/ Z! v# w' t  e, r% }* f- f6 l
bf021ee357254b82b7db8da798be8fae.png 3 A" j7 w! y( s( H
& ?1 u, T4 I+ w& Z* n: }! Z
2. IIC总线底层驱动程序( V, h+ ^( ?) K3 r! C( J
文章链接:STM32F103标准库开发—IIC主控实验—普通I/O口模拟—基本原理和底层驱动程序
* P0 M0 w7 Y0 [* J* b3 O. i0 Q. N. x" V9 k& }6 e
3. 普通I/O口模拟IIC总线读取AT24C256数据6 t1 [/ T: r7 x. w; [
具体流程如下:# p8 z- O/ \: q8 k' W
写入数据地址----此地址为读取数据的起始地址2 {. Y! |. Y; Z9 R+ l0 [; ]: ]
读取数据----可以读取多字节数据
1 ]+ _: z. F' w/ f% a4 X) P
+ ~8 v9 z. O7 p* \具体程序如下:1 j% @$ h5 {% k. j, D
( C  J" i* O! [5 \& h( E
  1. /**
    ; M# W0 s% L2 u+ Z  {5 {8 J
  2.   *@功能:读取指定字节数据
    # g" U% ?: d1 C* M: M6 c
  3.   *@参数1:ReadAddr---读取数据的起始地址) {  t6 G, @7 W, ?) ^! t: }" j) T. N
  4.   *@参数2:*Rdata ---读取到的数据缓存起始地址2 m) a8 M0 n! |% G: S
  5.   *@参数3:        Num   ---读取数据的个数
    5 x8 q/ j- l3 ^) o0 O
  6.   **/
    8 q( O* j0 N* r
  7. void AT24C256_ReadData(u16 ReadAddr, u8* Rdata, u16 Num)
    / W$ g3 h# I5 l
  8. {                                                                                                                                                                    
    $ c) |6 G$ y+ h1 f
  9.   IIC_Start();                                  //发送起始条件        ) x  w) h( j( r  w
  10.   IIC_Send_Byte(0XA0);                           //发送写命令2 ~3 K6 m) }6 @% D/ \7 [
  11.   IIC_Wait_Ack();                                //等待应答# E* }! V9 J: E9 d0 C  ]2 H2 S1 F3 D* Q
  12.   IIC_Send_Byte(ReadAddr>>8);        //发送高地址         5 E9 z; [3 Q3 l
  13.   IIC_Wait_Ack();                                 //等待应答
    & O+ z/ D% h$ E8 h" |3 m6 \0 T6 w
  14.   IIC_Send_Byte(ReadAddr%256);  //发送低地址" M9 q2 d, T! r- x
  15.   IIC_Wait_Ack();                            //等待应答
    % e: A; B5 {& `+ i3 m$ n
  16.   IIC_Start();                                         //发送起始条件                     & Z2 Y/ d$ m7 r' Z
  17.   IIC_Send_Byte(0XA1);          //发送读命令                   / Y( b) n/ a$ m0 \& ^, l4 b. @
  18.   IIC_Wait_Ack();                                 //等待应答% {8 }! E& p) R& c, ^
  19.   for(int i=0;i<Num;i++)                //读取数据9 y, x/ Z) I' ^: S
  20.   {' S. J! x* i  T" F# |8 E  l
  21.         if(i==Num-1)        {Rdata<i>=IIC_Read_Byte(0);}//读取最后一个数据后,发送非应答命令- }! r4 X- E1 f# x
  22.         else            {Rdata<i>=IIC_Read_Byte(1);}//读取其他数据后,发送应答命令  
    ; o2 z+ _0 ?7 r1 m* p, `
  23.   }- j0 Z( }5 u& X$ \7 _: A
  24.   IIC_Stop();                                        //发送停止条件            
    ! i! n- z$ Z& O( A3 T' D) {4 V
  25. }</i></i>
复制代码

: l5 P" J' Y, {! E, D* k: A4 ?4. 普通I/O口模拟IIC总线写入AT24C256数据
# y5 u1 h7 ~8 `# P, B具体流程如下:! |; t3 b" g. Q7 j9 V
写入数据地址----此地址为读取数据的起始地址
" i% D5 T( W0 K1 Q写入数据----可以写入多字节数据
& ?- o1 r; A7 }, p/ zAT24Cxx系列EEPROM,页与页之间写数据需要延时10ms。  u7 P. e9 p5 Y# `8 n
AT24C256 每页可以写64个字节数据。
  i& }4 E0 D7 }" n页写程序如下:
( N/ I, P* x5 \9 t1 s" b: i# o, g) K  z- E* ]" n
  1. /**4 ]- Q. J- K  S+ W# u
  2.   *@功能:在一页中写多个数据
    ; w& \  j& X) B/ q% `! d' w1 T! ^
  3.   *@参数1:WriteAddr---写入数据的起始地址6 b1 e& ~1 _% n: J) G7 [8 s
  4.   *@参数2:*Wdata ---写入数据缓存的起始地址' z' b2 R. {$ N6 C
  5.   *@参数3:        Num   ---写入数据的个数8 a( Q& y' Y6 K; M0 }3 b
  6.   **/
    - {/ D" O0 M: o$ H0 s/ ]
  7. void AT24C256_PageWriteData(u16 WriteAddr,u8* Wdata,u16 Num)9 ?9 G- j2 ?  e( I. ]
  8. {
    6 r2 |+ W& G: T- C+ n/ b
  9.         IIC_Start();  
    * J5 l; n2 b( n4 \, J8 l  J  l" m5 s
  10.         IIC_Send_Byte(0XA0);            //发送写命令2 P7 t8 I% X! Y
  11.         IIC_Wait_Ack();6 f) n8 E$ S; v: P' Z0 A
  12.         IIC_Send_Byte(WriteAddr>>8);//发送高地址
    7 i  ?  Z8 ]- ~9 [( q4 y5 j
  13.         IIC_Wait_Ack();           4 k6 d$ U4 h6 ~) [1 e
  14.           IIC_Send_Byte(WriteAddr%256); //发送低地址: y5 d5 W0 @1 q8 u
  15.         IIC_Wait_Ack();% N8 b5 ~6 ?7 M2 [
  16.         for(int i=0;i<Num;i++)5 w1 j# u1 V+ j" T' {; y- O' p
  17.         {                 
    1 w) J2 f$ ~3 I0 ?* I
  18.                 IIC_Send_Byte(Wdata); //发送字节
    $ a8 K0 L7 \) \9 E7 Q* I
  19.                 IIC_Wait_Ack();
    ! ]3 m: U, e. P  r9 |4 Q* G
  20.         }                                       
    . u( M" Q9 v+ ]2 T' o- h
  21.           IIC_Stop();                                         //产生一个停止条件
    + M$ P% e( O4 `6 a6 H" G
  22.         delay_ms(10);                                  //每写一页都需要延时10ms后再写入下一页, p1 f$ |+ a& H& j; l& o) N  x. c
  23. }
复制代码

9 c4 f0 M) \5 W" FAT24C256 写入多个数据
( N: @0 X$ J2 Q具体程序如下:
3 \% W3 z0 o8 [' t
0 _7 ^* e* O2 [) i2 R. H4 A6 E
  1. void AT24C256_WriteData(u16 WriteAddr,u8* Wdata,u16 Num): y7 B: k/ f* y
  2. {
    ; q- g$ }8 `) N4 \) X  t
  3.   u16 Addr_mod=WriteAddr%64;                //起始地址在本页的位置
    ( ^) N) n( b) P: ]
  4.   u16 Num1=64-Addr_mod;                                        //起始地址那一页数据个数# [6 o, V6 C5 v# o! |5 z
  5.   u16 PageNum = WriteAddr/64+1;        //起始地址在第几页& F% Z  ]" E% S
  6.   if(Addr_mod+Num<=64)( z% h" p8 B; \
  7.   {
    % v" n0 x% i  ^5 t% {
  8.         AT24C256_PageWriteData(WriteAddr,Wdata,Num);. S4 @9 \! y9 N, _! @% B
  9.   }2 D" z; N- ]8 v1 r: ]
  10.   else  J1 I* q1 S5 b
  11.   {
    " U2 K# e7 d. J7 x- u
  12.         AT24C256_PageWriteData(WriteAddr,Wdata,Num1);//写入起始地址的那一页数据$ U0 ]6 [/ `# I& J( k
  13.         for(int i=0;i<((Num+Addr_mod)/64);i++)4 r+ U, @" X0 h- ?8 |! p# v: m
  14.         {
    ; Q% j+ l# \! J( h3 g! R5 j
  15.           if((Num-(i*64+Num1))>64)                //判断这页是不是最后一页
    # f# T9 T/ ]2 A# j" A4 [; ^! _
  16.           {
    . d$ V4 |5 }( q8 A4 U5 O, z
  17.                 AT24C256_PageWriteData((PageNum+i)*64,&Wdata[i*64+Num1],64);//中间整页写入' g! |$ d4 {2 d8 i
  18.           }
    & |( {+ C% x' N# P$ i
  19.           else3 p( h$ J7 {8 p* U" p, ]
  20.           {5 p- ]  v4 Q7 G" V
  21.                 AT24C256_PageWriteData((PageNum+i)*64,&Wdata[i*64+Num1],Num-(i*64+Num1));//最后一页写入1 W. q- Z. M& p9 {5 d
  22.           }
    # ^+ ]( N! r% M0 B
  23.         }' o5 O" q7 i0 p* z; H6 C) u
  24.   }
    ) D0 f. H: i; C$ x! i* G
  25. }9 o/ k, s0 B! A+ ~2 `+ s
复制代码

3 I: r3 }0 D% D, p' @6 A  K————————————————0 l/ a/ Z6 ~, N7 r. K+ J' L) A
版权声明:根号五! z4 K3 H  x5 _; n8 x% C

1 K# {( _8 L: r! ^0 N/ m- h" v0 ~/ k% b( ?/ I

& y' {; ]9 z2 H8 t, A9 g
a9f8f7fc2c3b41ac827145a034930fe3.png
143cb3c4011b4fa286127ef2030ee7cc.png
收藏 评论0 发布时间:2022-9-7 14:59

举报

0个回答

所属标签

相似分享

官网相关资源

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