一、AT24C08的通讯方式5 `9 y! ]! i% t# J v# N
AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口: a: t, G( U- B; o
; w# x( B; \6 w二、AT24C08的存储方式
/ I4 ~) X9 Q& W5 `* y/ w1 D/ yAT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,
3 v ?5 h! C9 O. u' r5 _0 p* U5 a* k! S1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间
) R8 q4 D; A7 ~7 W" E# f, N就分成了4块,每块都有256字节存储空间,每个字节是8位! B s) Z) T$ C
; m+ e( T. s7 P. d# s. l7 ]
器件写地址分别是0xA0,0xA2,0xA4,0xA6% p& m, g+ A- V. S& s! K- Y8 p
器件读地址分别是0xA1,0xA3,0xA5,0xA7
4 o0 M; R+ _7 A; g \- I- /*) C6 f: X* r) i0 j
- *描述: 在eeprom指定地址写入一个数据
: W: T' m6 w2 R - *参数: WriteAddr :写入数据的目的地址
: x/ T! A c6 F5 Q+ A- R0 N - * DataToWrite:要写入的数据, o* `! H1 M: f9 L0 O. Y
- *返回值:读到的数据/ p! Y# h( z! R# R" ^
- */
6 S9 ]5 m' X" b0 t) O: v; Q - void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)2 Y J- P( r2 `: ~
- { " b* T' k: X5 G8 X
- IIC_Start(); 5 R1 @4 d+ G) M
; \9 Q9 q: E2 V- IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 0 P9 b' l: v9 O& c8 C1 y
- IIC_Wait_Ack(); , { e$ e5 k1 }/ t! A5 t7 ?7 _
- IIC_Send_Byte(WriteAddr%256); //发送低地址* v) ]- N, x& S' g' B
- IIC_Wait_Ack(); % Y4 K7 y9 T0 R) A% o
- IIC_Send_Byte(DataToWrite); //发送字节 9 Y# m% D/ i n( [% q$ k
- IIC_Wait_Ack();
/ v- K. G1 _% g - IIC_Stop();//产生一个停止条件
1 V7 ~) F+ ?# f1 V) l - HAL_Delay(10);
% K- u/ p, N: j+ t0 {2 h - }
2 F4 V/ g7 J, ^; n - /*
9 }0 c J& v! L% i; C0 u - *描述: 在eeprom指定地址读出一个数据8 l" `8 A7 Z" g5 e P7 c
- *参数: ReadAddr:开始读数的地址1 ^& F6 O+ p! A' a# D$ `
- *返回值:读到的数据
) n0 F; y1 N- k7 O1 ?0 a& A - */
% n. Z4 `& R: I" W" @ - u8 Eeprom_ReadOneByte(u16 ReadAddr)
4 e; t" f9 k# G, x P; [+ T - {
- U# |! O$ ]9 O' P8 Q - u8 temp=0; ; |: G! r) u4 i9 M, n) ^, h2 B
- IIC_Start(); 9 ]: d- \! `& E3 Z: V q. m
- 6 \5 m* V3 r# s g0 v
- IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据; t( g; {& w$ @; e
- IIC_Wait_Ack(); 4 ?- D) Z6 ~$ [1 C7 F
- IIC_Send_Byte(ReadAddr%256); //发送低地址
% w. V. M1 Q }, S+ t X - IIC_Wait_Ack();
3 U8 n% Z& \. T; f; F - IIC_Start(); " Q' U2 B4 X. S D7 d& [% I
- IIC_Send_Byte(0XA1+((ReadAddr/256)<<1)); //进入接收模式 $ f% w8 _" {+ \" b. I# a
-
: W q0 w+ R& V! @% Q - IIC_Wait_Ack();
! H2 E6 s: j: l! u$ x( e - temp=IIC_Read_Byte(0);
' w# `; e4 t5 W) c1 O+ n* u2 l8 T -
7 o7 ?) p/ {/ x$ F& b. ~ - IIC_Stop();//产生一个停止条件 7 G( b5 Z" q" [% @5 L
-
) n3 D9 r/ e& s K) O1 c0 n, S - return temp;' l4 u& l! S) ~
- }6 H1 i5 W# |) J. ^
' W7 C2 l* l: o1 v- /*
, M. ?" f( c% ~% `/ K - *描述: 检查EEPROM是否正常1 ^: o$ G" h% g) O% e K$ I
- *参数: 无
9 D) j* n9 E+ v7 {0 w - *返回值:外接EEPROM是否存在 7 y1 G8 i5 B! I0 A
- */2 g7 E6 s y# c% T
- u8 Eeprom_Check(void)) A$ M8 G- t' _& V% e
- {- C% q( y S! o4 d
- u8 temp;2 O5 Y/ M7 u4 W8 |
- temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM % [3 t) C6 c% u8 A
- if(temp==0X55)return 0; / Z1 c0 u9 ?" }( m: c
- else//排除第一次初始化的情况; U+ a, o1 @) T: j
- {
8 h2 e7 f# R5 I& w; v8 t. h" C1 o - Eeprom_WriteOneByte(1023,0X55);
5 p9 L1 {% _5 [) R, D d/ ~ - temp=Eeprom_ReadOneByte(1023);
8 w* C+ S4 p X3 d1 I- I" _ - if(temp==0X55)return 0;4 j9 Y2 O9 } w: Z, Z
- }7 Y0 W& ?2 f+ k: I8 P3 q
- return 1;
5 S4 w3 D1 H3 F1 Q. Z: \/ V9 C7 _ - }
2 D: F! _' {( }4 `- R: a
8 x( N) v4 e; a* A5 g* S
) K- C+ u/ p" U- /*/ d/ J% X. p5 d; W8 I1 l9 N
- *描述: 在EEPROM里面的指定地址开始读出指定个数的数据
; k- h9 d: B4 ]& G7 m4 k - *参数: ReadAddr: 开始读出的地址
0 k1 P+ n& _' o" M - * pBuffer: 数据数组首地址* c1 i7 ?) M0 K# Q" n e. n0 k. U
- * NumToRead:要读出数据的个数+ ?0 U4 T- ~# S+ Y
- *返回值:读到的数据
, X" ~- C# U! n9 { - */0 i% w8 h- J! ]6 C/ ~+ c3 U- W
- void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)# a9 A/ k/ V! K
- {9 [ z( G6 g$ k% V
- while(NumToRead)
+ B. r$ s2 |+ A2 H! J - {7 O, H# T4 U! ?5 w
- CLRWDG();6 l0 i- S8 n: u, S
- *pBuffer++=Eeprom_ReadOneByte(ReadAddr++); ' w2 R; U3 X) p) ^
- NumToRead--;; A/ Q- ?: i: J8 }, t J
- }
9 ], h: c4 V# q, V - } 4 t: T V2 n$ a
- , R: G5 ^. L1 y6 j1 V8 _+ B
- /*
% U/ `9 f3 G0 N( g# S& g. ~. N/ A& K8 `0 r - *描述: 在EEPROM里面的指定地址开始写入指定个数的数据, k8 K* q3 E2 e7 H8 k
- *参数: WriteAddr: 开始写入的地址
5 N# l& L. Y; w9 { - * pBuffer: 数据数组首地址# K! z/ |- o x1 L0 {
- * NumToWrite: 要写入数据的个数1 {! R7 x' z( E
- *返回值:读到的数据* K+ C7 M7 B3 z G! H. y. Q J8 h5 @
- */# W/ X5 y. _3 o2 _, s% h6 [
- void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)8 l: u; @5 T/ z. B: M' w
- {" Z; ]' W0 g3 b: Y( K
- while(NumToWrite--)
3 m% {& w" b6 U6 g: Q1 Z - {4 e2 V5 ?" z* Y3 s5 s- r
- CLRWDG();0 n4 D0 {* u9 w
- Eeprom_WriteOneByte(WriteAddr,*pBuffer);: F& k0 Y6 i7 s$ \+ u k9 I
- WriteAddr++; |1 ~% t0 L% P3 K5 }4 E* @/ `
- pBuffer++;
5 Z3 J3 k) _4 h8 z" B( r% u - }7 _8 q( g# c6 ?' S9 t' u. j% _; y
- }# o0 c% F) m& M$ K$ J7 ~- v! |
- * T( R5 ^5 ^) P- o; {1 s/ \& \
复制代码 ; ] Z6 T; J' U( j4 l: f9 `
1 @/ B" r0 j/ e. l+ [* I8 E8 C; z1 _
9 f/ O6 Z3 y% @3 g% X1 z1 N9 | |