一、AT24C08的通讯方式
; y7 y9 X* ]8 E2 u6 a8 g& y6 TAT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口
" Q9 i2 N6 d8 u) j
; J$ m# x' B$ \5 {: C二、AT24C08的存储方式
; {& M0 Q/ B3 c9 u& U( ]AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,' n) i' A- b" F$ H! }7 o
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间6 q( G4 E: V9 W, ^" D4 s
就分成了4块,每块都有256字节存储空间,每个字节是8位
" A9 J; h( h$ V3 d+ w+ s4 ^
+ b! v7 t- v/ `- W' g器件写地址分别是0xA0,0xA2,0xA4,0xA6
4 a5 e6 S- y; x器件读地址分别是0xA1,0xA3,0xA5,0xA7+ C4 {' [& I* ` b1 ~$ m" B9 C$ I
- /*
2 E+ b1 M: g5 R& ^! X! D9 a3 t - *描述: 在eeprom指定地址写入一个数据+ z+ Q1 ]+ ~7 N4 g t, Q' w
- *参数: WriteAddr :写入数据的目的地址, @2 {5 k, u9 r" W4 Y* k
- * DataToWrite:要写入的数据6 d- c# K% f4 y
- *返回值:读到的数据3 o( e( n8 u$ F- m* p1 k$ {
- */5 N: i( Q7 I) t/ \7 z, U
- void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
8 P' r1 y$ `) H! b. K - {
" T/ m0 M3 W8 i3 D J. Q: O4 X0 X. R - IIC_Start();
; w$ N% V: L- r- C( G6 E - ) P2 ^ c+ q5 s$ a4 D
- IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 9 C0 f, t! C% b" K+ p# j5 @& p
- IIC_Wait_Ack();
/ ?! M! Y. [ T! `; o/ ^ - IIC_Send_Byte(WriteAddr%256); //发送低地址& y2 |5 E# l/ M) L$ O
- IIC_Wait_Ack();
- o: _+ }& h' E+ G% ^. [ - IIC_Send_Byte(DataToWrite); //发送字节 5 L: V: t7 g( u$ ~9 w$ r8 \2 h
- IIC_Wait_Ack(); 3 B3 J& m% e4 r. z
- IIC_Stop();//产生一个停止条件 $ {' H& N2 y" E+ z
- HAL_Delay(10); ( K& }/ v4 P' d) c( G" f
- }
+ z8 W; O4 f! u8 `# d2 W* } - /*
9 K# y3 {+ K: W) q9 B7 M - *描述: 在eeprom指定地址读出一个数据% R/ d& }+ r) d7 r# `1 B; c) _7 \
- *参数: ReadAddr:开始读数的地址
: ]+ k* l. G/ d - *返回值:读到的数据4 a8 ^' P/ @* B" n7 V! y A
- */6 [ z1 l0 t7 M# J+ C1 H+ j" K
- u8 Eeprom_ReadOneByte(u16 ReadAddr)
% s6 R4 Q( m2 S - {
7 d6 B$ p2 ~+ i" f" Z - u8 temp=0; 9 m( `, y, k8 z& i" K8 m$ _
- IIC_Start(); 0 U9 X' a, f! l f" W- u7 X8 A/ o
-
$ O- t5 Y- w7 ^& ?, O1 ?6 j/ c - IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据 c# m/ W* O' U8 @. z* E
- IIC_Wait_Ack();
$ p/ `! C1 i# X) q* E) S5 v8 l4 C C - IIC_Send_Byte(ReadAddr%256); //发送低地址' ?9 ]" J+ _+ t5 u8 F7 r
- IIC_Wait_Ack(); $ u2 A# b4 N% t- y# @
- IIC_Start(); / L1 Z; K5 F0 W L
- IIC_Send_Byte(0XA1+((ReadAddr/256)<<1)); //进入接收模式 8 L' N$ d$ w% e2 v$ c) H' l
- 5 T+ Y; v/ F2 A: K# x. g
- IIC_Wait_Ack(); ( A% p! }1 o; ~' ~
- temp=IIC_Read_Byte(0);) y) o; E2 K3 P/ m. [9 C
- I+ j- H1 s, i/ h( b5 @2 S5 r ^
- IIC_Stop();//产生一个停止条件 * c0 O3 M1 O6 D, n+ w' [" Y$ a
- K0 q. D T% | r
- return temp;
1 }% m0 i& }" b& ?7 C) O. w - }
& I) m" i- j6 j, j6 J+ H - 1 V( L$ F$ z: [- `: S
- /*$ D' w, A, \1 i( {; k
- *描述: 检查EEPROM是否正常
4 x: R5 k# B# p. h* T - *参数: 无
- @1 Z' t! P3 s - *返回值:外接EEPROM是否存在 6 K$ x" r6 X0 [$ y
- */, a( t6 f$ H& u+ Y
- u8 Eeprom_Check(void)$ I4 v) F1 F1 v9 m- r3 V0 q
- {; F0 w( ]* p7 ?+ l* q+ T8 t4 e
- u8 temp;6 K; b1 M% E# ?6 \- s$ p
- temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM ; t/ \! ~5 X; n! m8 ^
- if(temp==0X55)return 0;
- o# K' t( M; {' }. M - else//排除第一次初始化的情况# G. T; o1 ]3 j0 f- q I8 [
- {" _0 a' G& _) V1 E: y& [2 o" G" A3 K
- Eeprom_WriteOneByte(1023,0X55);( M, I2 V6 C. n2 a
- temp=Eeprom_ReadOneByte(1023);
. l2 l2 D6 B" [ - if(temp==0X55)return 0;
4 z; G$ W @7 h+ w - }1 B1 e- }) J7 a8 W0 ^8 \
- return 1; $ Z9 n _7 y; K; N
- }* j5 Q+ H B3 Y' @$ \. R- r: l
( W7 \5 x1 N0 o8 o- 3 [" T# a _8 ~
- /*( T% r3 j8 c$ ~3 ~3 N0 E- B
- *描述: 在EEPROM里面的指定地址开始读出指定个数的数据
9 N; m' H( E2 I, i' D! ~ - *参数: ReadAddr: 开始读出的地址
# z9 W5 A. P: } - * pBuffer: 数据数组首地址5 {, U3 K: u X z! L
- * NumToRead:要读出数据的个数; r& V1 G3 ^2 Q# d& y1 v$ E
- *返回值:读到的数据
' @6 h# U3 h, d7 i& e/ o - */9 n: y& `2 F) D7 U% x
- void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead): B: E& q1 m. H" \
- {
, o2 D, s2 h9 `& N I - while(NumToRead)- r9 e/ ^1 I* g. e2 ~' ]7 ~* \
- {
! c( I2 O( E- \6 E: A - CLRWDG();
; e, J2 N' L# _ - *pBuffer++=Eeprom_ReadOneByte(ReadAddr++); ; a& `+ Z% p1 C4 _+ |1 o
- NumToRead--;* M1 y; {+ M. F
- }/ I2 P6 {1 ^" \- [: N% k
- }
( t% _8 a1 y: h B- |1 H: N - ( O* J$ o1 _0 Q& Q- W; d( t2 Y
- /*
- L7 l. T# }) |# P: \ - *描述: 在EEPROM里面的指定地址开始写入指定个数的数据
8 u: G. d" _# e7 t) N8 g - *参数: WriteAddr: 开始写入的地址
3 D0 H% j# ]" V; G3 Y7 T8 X - * pBuffer: 数据数组首地址
1 t; v) H/ d; O/ x2 ?& p - * NumToWrite: 要写入数据的个数+ F" Y e% ^& l$ A
- *返回值:读到的数据. m; u0 d' K, R+ v+ G
- */6 a( p, A; h# G+ J% p' C
- void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
* h: T" |& ~( \6 g; P5 J - {
: W8 G+ s2 u8 S( y! n+ B* k - while(NumToWrite--)
: d/ {' K o( H) ? E& x - {7 Z' m+ {" `, o9 b
- CLRWDG();
" f( S+ S9 @; a5 e. P( w5 [ - Eeprom_WriteOneByte(WriteAddr,*pBuffer);
: m, @2 M# U' U- ?- l - WriteAddr++;' j8 E' N8 [3 t+ y5 c
- pBuffer++;
( P8 {6 d; C O. @$ c3 T! ~% \: y5 K - }
' G _: P9 W3 h0 L - }
) B6 N- X* s7 x3 l/ D* R
n8 w9 f' r( E* w7 R' X
复制代码 ; W1 L+ e, Z: S8 k( T" G3 h
' H7 M1 k) _( B3 O( W
) }( ]9 t: X) K1 b& t* W: r, g- @
2 B% ?/ f' ^4 M: j: F( R# A |