一、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% ^
& ~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
. 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
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
% 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 }
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
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 ?
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
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
& 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 ?
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
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
- /**
; M# W0 s% L2 u+ Z {5 {8 J - *@功能:读取指定字节数据
# g" U% ?: d1 C* M: M6 c - *@参数1:ReadAddr---读取数据的起始地址) { t6 G, @7 W, ?) ^! t: }" j) T. N
- *@参数2:*Rdata ---读取到的数据缓存起始地址2 m) a8 M0 n! |% G: S
- *@参数3: Num ---读取数据的个数
5 x8 q/ j- l3 ^) o0 O - **/
8 q( O* j0 N* r - void AT24C256_ReadData(u16 ReadAddr, u8* Rdata, u16 Num)
/ W$ g3 h# I5 l - {
$ c) |6 G$ y+ h1 f - IIC_Start(); //发送起始条件 ) x w) h( j( r w
- IIC_Send_Byte(0XA0); //发送写命令2 ~3 K6 m) }6 @% D/ \7 [
- IIC_Wait_Ack(); //等待应答# E* }! V9 J: E9 d0 C ]2 H2 S1 F3 D* Q
- IIC_Send_Byte(ReadAddr>>8); //发送高地址 5 E9 z; [3 Q3 l
- IIC_Wait_Ack(); //等待应答
& O+ z/ D% h$ E8 h" |3 m6 \0 T6 w - IIC_Send_Byte(ReadAddr%256); //发送低地址" M9 q2 d, T! r- x
- IIC_Wait_Ack(); //等待应答
% e: A; B5 {& `+ i3 m$ n - IIC_Start(); //发送起始条件 & Z2 Y/ d$ m7 r' Z
- IIC_Send_Byte(0XA1); //发送读命令 / Y( b) n/ a$ m0 \& ^, l4 b. @
- IIC_Wait_Ack(); //等待应答% {8 }! E& p) R& c, ^
- for(int i=0;i<Num;i++) //读取数据9 y, x/ Z) I' ^: S
- {' S. J! x* i T" F# |8 E l
- if(i==Num-1) {Rdata<i>=IIC_Read_Byte(0);}//读取最后一个数据后,发送非应答命令- }! r4 X- E1 f# x
- else {Rdata<i>=IIC_Read_Byte(1);}//读取其他数据后,发送应答命令
; o2 z+ _0 ?7 r1 m* p, ` - }- j0 Z( }5 u& X$ \7 _: A
- IIC_Stop(); //发送停止条件
! i! n- z$ Z& O( A3 T' D) {4 V - }</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
- /**4 ]- Q. J- K S+ W# u
- *@功能:在一页中写多个数据
; w& \ j& X) B/ q% `! d' w1 T! ^ - *@参数1:WriteAddr---写入数据的起始地址6 b1 e& ~1 _% n: J) G7 [8 s
- *@参数2:*Wdata ---写入数据缓存的起始地址' z' b2 R. {$ N6 C
- *@参数3: Num ---写入数据的个数8 a( Q& y' Y6 K; M0 }3 b
- **/
- {/ D" O0 M: o$ H0 s/ ] - void AT24C256_PageWriteData(u16 WriteAddr,u8* Wdata,u16 Num)9 ?9 G- j2 ? e( I. ]
- {
6 r2 |+ W& G: T- C+ n/ b - IIC_Start();
* J5 l; n2 b( n4 \, J8 l J l" m5 s - IIC_Send_Byte(0XA0); //发送写命令2 P7 t8 I% X! Y
- IIC_Wait_Ack();6 f) n8 E$ S; v: P' Z0 A
- IIC_Send_Byte(WriteAddr>>8);//发送高地址
7 i ? Z8 ]- ~9 [( q4 y5 j - IIC_Wait_Ack(); 4 k6 d$ U4 h6 ~) [1 e
- IIC_Send_Byte(WriteAddr%256); //发送低地址: y5 d5 W0 @1 q8 u
- IIC_Wait_Ack();% N8 b5 ~6 ?7 M2 [
- for(int i=0;i<Num;i++)5 w1 j# u1 V+ j" T' {; y- O' p
- {
1 w) J2 f$ ~3 I0 ?* I - IIC_Send_Byte(Wdata); //发送字节
$ a8 K0 L7 \) \9 E7 Q* I - IIC_Wait_Ack();
! ]3 m: U, e. P r9 |4 Q* G - }
. u( M" Q9 v+ ]2 T' o- h - IIC_Stop(); //产生一个停止条件
+ M$ P% e( O4 `6 a6 H" G - delay_ms(10); //每写一页都需要延时10ms后再写入下一页, p1 f$ |+ a& H& j; l& o) N x. c
- }
复制代码
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- void AT24C256_WriteData(u16 WriteAddr,u8* Wdata,u16 Num): y7 B: k/ f* y
- {
; q- g$ }8 `) N4 \) X t - u16 Addr_mod=WriteAddr%64; //起始地址在本页的位置
( ^) N) n( b) P: ] - u16 Num1=64-Addr_mod; //起始地址那一页数据个数# [6 o, V6 C5 v# o! |5 z
- u16 PageNum = WriteAddr/64+1; //起始地址在第几页& F% Z ]" E% S
- if(Addr_mod+Num<=64)( z% h" p8 B; \
- {
% v" n0 x% i ^5 t% { - AT24C256_PageWriteData(WriteAddr,Wdata,Num);. S4 @9 \! y9 N, _! @% B
- }2 D" z; N- ]8 v1 r: ]
- else J1 I* q1 S5 b
- {
" U2 K# e7 d. J7 x- u - AT24C256_PageWriteData(WriteAddr,Wdata,Num1);//写入起始地址的那一页数据$ U0 ]6 [/ `# I& J( k
- for(int i=0;i<((Num+Addr_mod)/64);i++)4 r+ U, @" X0 h- ?8 |! p# v: m
- {
; Q% j+ l# \! J( h3 g! R5 j - if((Num-(i*64+Num1))>64) //判断这页是不是最后一页
# f# T9 T/ ]2 A# j" A4 [; ^! _ - {
. d$ V4 |5 }( q8 A4 U5 O, z - AT24C256_PageWriteData((PageNum+i)*64,&Wdata[i*64+Num1],64);//中间整页写入' g! |$ d4 {2 d8 i
- }
& |( {+ C% x' N# P$ i - else3 p( h$ J7 {8 p* U" p, ]
- {5 p- ] v4 Q7 G" V
- AT24C256_PageWriteData((PageNum+i)*64,&Wdata[i*64+Num1],Num-(i*64+Num1));//最后一页写入1 W. q- Z. M& p9 {5 d
- }
# ^+ ]( N! r% M0 B - }' o5 O" q7 i0 p* z; H6 C) u
- }
) D0 f. H: i; C$ x! i* G - }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 |