一、AT24C08的通讯方式
% @3 j5 O' s! K5 m# T3 C2 IAT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口7 q* V( S- i9 N2 f. r
) R& t- _ ] O
二、AT24C08的存储方式
% \; `" B5 t: c; x' s) o8 aAT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,; T' X8 W: v4 H9 @4 w/ Q
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间; Q+ U4 ]! s% G3 v& f
就分成了4块,每块都有256字节存储空间,每个字节是8位* J9 W+ G. b) s: b+ v
; Z+ A; c$ L; o. ?. d
器件写地址分别是0xA0,0xA2,0xA4,0xA6/ x; t$ t" y# I: w7 e
器件读地址分别是0xA1,0xA3,0xA5,0xA70 v' m: h h H1 ?
- /*/ i0 o9 l7 e/ B+ r* x
- *描述: 在eeprom指定地址写入一个数据
) P% `1 F; m9 ?+ w6 S - *参数: WriteAddr :写入数据的目的地址9 w, o0 J# q# K. M5 h$ G/ c
- * DataToWrite:要写入的数据
5 F @2 E- }( q4 z; C$ z! I - *返回值:读到的数据
& E) V3 Z% i9 e) | - */
1 ^' n. ]- ]( L2 l3 h7 w7 v! x; X - void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)% z _+ y. i" R" U0 T
- { ( @4 t* y1 {- D7 G, s6 B
- IIC_Start();
% a. u- K' J8 D* |' @5 H - - D" q3 c2 G- P1 }2 \, j u; \: o
- IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 ( h, I' ?4 W6 q# x- R
- IIC_Wait_Ack();
$ y/ t s1 ?1 h - IIC_Send_Byte(WriteAddr%256); //发送低地址- P I1 }# E6 n4 P7 h
- IIC_Wait_Ack();
, Q9 S: Y/ p) X; d$ o+ [7 j - IIC_Send_Byte(DataToWrite); //发送字节 * B* s9 J& A8 o7 a7 @/ r6 F
- IIC_Wait_Ack();
1 u) H" ?+ W+ ~9 O - IIC_Stop();//产生一个停止条件 " ]* i- b' j5 O( e2 [
- HAL_Delay(10); $ ^) ^4 G. U/ {0 K3 c4 ~
- }' y4 F+ I; T' m9 Y8 w8 {* P4 d
- /*
( ?/ W6 ~+ G2 Q4 a/ c2 ~$ o - *描述: 在eeprom指定地址读出一个数据% I( a& e" r G; O6 S9 r
- *参数: ReadAddr:开始读数的地址
1 w: F2 e* L9 O9 T y5 F8 V5 A - *返回值:读到的数据
9 b" `6 p, j$ S9 A0 } - */
- i% S* k1 s, [) p6 Y O- n - u8 Eeprom_ReadOneByte(u16 ReadAddr)
7 j, @# P' C9 @3 x - {
: @% D6 X) y( \6 Z6 C" j - u8 temp=0;
3 [7 U7 u( Y* Q - IIC_Start(); / p5 J7 m1 n7 r( J8 a2 C. l
- 0 g( V* N* O0 L9 P/ c+ M
- IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
( P( c' F4 e# z" { - IIC_Wait_Ack();
! s! Z6 {# L% b; G0 p- f! ^( B+ y- Y - IIC_Send_Byte(ReadAddr%256); //发送低地址1 @" d2 u( M0 D D
- IIC_Wait_Ack();
- T, k$ u+ m9 C# G - IIC_Start();
( X0 W* x% Z+ ]4 _1 w - IIC_Send_Byte(0XA1+((ReadAddr/256)<<1)); //进入接收模式
" X8 W, @- G% F0 v; M4 ~/ K3 [ - , X" J4 E* W1 {, Y7 D/ C
- IIC_Wait_Ack(); $ D! ~8 A# H4 i" v/ h
- temp=IIC_Read_Byte(0);
% E4 _1 \! @, y7 n3 K4 ~; [# ]2 b9 u - 6 ^' f2 w2 i0 B/ \
- IIC_Stop();//产生一个停止条件
8 N1 w; w- D r* E7 ~& @ -
3 ~6 \) @; n7 X, K8 ?0 a& j6 a5 o7 Q - return temp;; y. _, {5 u: P# i
- }2 q8 a' I; n" b( Z* x8 C
7 h7 ?" J# L1 ]5 j7 Z$ Q- /*
! K# q. ]$ O# u4 m - *描述: 检查EEPROM是否正常
; p7 z0 ]5 @, z6 O - *参数: 无
0 L* j5 K6 A W; _ - *返回值:外接EEPROM是否存在
0 u6 [5 r4 e% h$ V# h! H0 Q - */
3 o4 b/ N9 k+ i7 z6 K; x - u8 Eeprom_Check(void)
! N$ j; x9 F3 v" t% a3 } - {
6 e8 [: M" u! Y$ j8 y - u8 temp;4 g w: o' k" ^& p
- temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM
/ _2 P/ E/ V4 D6 b* M - if(temp==0X55)return 0;
. i% _# t- c* F9 I/ a# @! d - else//排除第一次初始化的情况
8 V4 b. Z ~8 M+ g/ x! u( P - {' K. }( s- `- W# _. ~. a
- Eeprom_WriteOneByte(1023,0X55);
& g' L7 n! j+ G! g% S - temp=Eeprom_ReadOneByte(1023); : v |0 o" _1 Q$ y: u% f
- if(temp==0X55)return 0;: V7 H$ m9 e! H6 ~ ]9 z9 g
- }
9 n" F+ h, K1 C' O4 ^) @ - return 1;
8 Q. t* ~- O$ {0 ?7 P - }$ x8 |: {$ _$ G5 N
- 2 v K4 ]/ i( Y% B5 y4 c
- $ ]6 r% o9 l) M
- /*
* c. M4 U* F: y( p - *描述: 在EEPROM里面的指定地址开始读出指定个数的数据
& c0 A I( o0 J6 u, y; v# C - *参数: ReadAddr: 开始读出的地址( w0 n- t- a1 S
- * pBuffer: 数据数组首地址# p( Q! ]# y# c0 o3 X
- * NumToRead:要读出数据的个数
3 c4 q2 p& ?$ L& T# z. ~3 _ - *返回值:读到的数据/ y, ?3 L9 |1 O) \; a# }6 J6 V/ S
- */, P$ A( V( Z3 Y6 u$ g
- void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)$ w5 T1 K" Q3 o6 ?8 |3 `/ q
- {" h- }: Q* `9 F: i$ M6 [3 K, f# l/ _/ d4 D
- while(NumToRead)2 V2 v, x5 @! O3 g9 n5 N0 y
- {' K3 b/ X" _( M7 }
- CLRWDG();
8 @4 p7 \1 R# r6 c2 X, d - *pBuffer++=Eeprom_ReadOneByte(ReadAddr++); " s9 Y9 ?; Y; k- V( E; ~# [
- NumToRead--;) @. [: h* B" U( d
- }
/ E- n4 d# a5 b - }
9 j4 g& a% N; l) F. h( E
3 |. b4 W) r; d* t( B' g& u, y- /*
: G0 R, ]. f- J# I) Q - *描述: 在EEPROM里面的指定地址开始写入指定个数的数据
! \8 i$ I, P" B3 p. i4 p - *参数: WriteAddr: 开始写入的地址
: q7 j# d6 R. G0 `4 S; d: M - * pBuffer: 数据数组首地址( h, z+ z& S) Y! A
- * NumToWrite: 要写入数据的个数
; ]: C& O4 S/ R3 F% V- r - *返回值:读到的数据
8 }* c& _* ?* B5 @$ T - */9 D# I: f% o/ @ f: p/ k6 I: p- @3 n
- void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)) z: o+ b/ }( ]1 W" K g8 e
- {
7 V1 G+ B6 \, P8 O% C$ J - while(NumToWrite--)
9 x' j3 R, @; W0 @& E - {
0 G# t1 V$ ~% l, i/ l/ I, d/ Y - CLRWDG();
6 Z4 s3 s& M- f8 X/ k - Eeprom_WriteOneByte(WriteAddr,*pBuffer);
( P) s- |) c/ N; G) q7 z3 E - WriteAddr++;/ o" r4 Y# T+ |7 }( I: H
- pBuffer++;( H s# w$ u* D2 ~/ y4 x, T- P* l4 U
- }6 _' J- {+ q- X! ]' k" |
- }
. f- E0 q' R# f! s3 p
( e' f, {, r% H- N8 M* F
复制代码 " c) ~! b" w$ a) d
( H4 R c& G$ w7 N* M9 d7 {
) u3 H6 A, w* A2 [5 K
9 {8 o- t) B$ v: h9 { |