一、AT24C08的通讯方式6 L0 W; h+ H- Z3 @
AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口- b8 a! o; n4 t1 M
6 o) c0 J9 S9 R7 Q. L. h) q二、AT24C08的存储方式
0 d6 t! m k- j4 n5 O) H- `AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,: f; E' Y, N0 e
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间- y& u* M2 i2 @( r' U
就分成了4块,每块都有256字节存储空间,每个字节是8位' W, o& f. `) I) e, A [
, C/ R1 X: e6 x7 [
器件写地址分别是0xA0,0xA2,0xA4,0xA6
" Q5 n: A2 }" y5 A& Y器件读地址分别是0xA1,0xA3,0xA5,0xA72 h: x. p. W% `. c
- /*& n" T- Q! p6 m
- *描述: 在eeprom指定地址写入一个数据
" }# A3 `: F; t - *参数: WriteAddr :写入数据的目的地址
8 M0 n: Q7 _+ C# N ?5 ?) v. o* Y - * DataToWrite:要写入的数据
8 t2 S: K) S- d$ x* W" r4 Y+ U - *返回值:读到的数据5 K# a' R" d" F/ V! y) }
- */
9 X" @5 B q v$ b$ m, i, h7 F - void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
' m: e% x& D1 r& b+ i! ^ - { - R( R6 P+ l8 d' _
- IIC_Start();
) E( E0 {" v0 {+ V% }: t P
4 H: M0 H1 O- D g- IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 ) f% c1 i$ E2 n4 G% ~
- IIC_Wait_Ack();
2 A4 T! |2 w' Y( F - IIC_Send_Byte(WriteAddr%256); //发送低地址
2 n" e6 [" j+ m3 B% l6 [ - IIC_Wait_Ack();
3 L; P: M, I, X- d, Z - IIC_Send_Byte(DataToWrite); //发送字节 1 |8 Z7 r) E/ ~: k3 ]
- IIC_Wait_Ack();
5 M1 u& [/ O1 i* [, w9 z0 F& F - IIC_Stop();//产生一个停止条件
0 X9 B4 A, c# w8 f4 q - HAL_Delay(10); * i3 v' C" | N
- }) b- [! _8 } ?9 v( K) N6 j% s
- /*- @! t; f/ V- Y: e
- *描述: 在eeprom指定地址读出一个数据
( X% g& E) y; [" X5 p _ - *参数: ReadAddr:开始读数的地址
6 Q5 k" W# n2 v: A, ~. t - *返回值:读到的数据
t- B& h$ ] T0 q - */ W1 a: L- s% G0 ]
- u8 Eeprom_ReadOneByte(u16 ReadAddr)$ V% L3 z+ t9 I4 v
- {
; R! ~4 _8 O9 e- m% ] - u8 temp=0; ( c. d4 T+ Z* l) q' T. Y6 F: u; c
- IIC_Start();
+ ] \' R3 y3 I: A1 D -
4 q* ~4 _, w' P! M6 [4 k9 o - IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
9 c6 d! B2 s6 Z E! G. F - IIC_Wait_Ack();
( b2 y2 U7 p7 R- f7 J# A - IIC_Send_Byte(ReadAddr%256); //发送低地址" {, I3 p: V a: c+ ?
- IIC_Wait_Ack();
6 C6 F! H: C2 y- j' n6 s - IIC_Start(); / K& O8 @4 M4 _# q3 m: z% j5 ?
- IIC_Send_Byte(0XA1+((ReadAddr/256)<<1)); //进入接收模式 / ~3 T0 ^+ o. h; @
-
7 c( [. G8 S; z6 Z0 |+ {( M - IIC_Wait_Ack();
! M: I8 e5 t1 b ~! l - temp=IIC_Read_Byte(0);' O* D. ^) |9 ~6 F. U5 N$ n
-
% i1 g+ q# o6 E) p% H - IIC_Stop();//产生一个停止条件
. C9 q4 ?+ A3 _( O' w- l6 {, ~ -
( Z' `; |1 c- c: a - return temp;
# c+ L2 w0 m0 M( [ - }2 |" _: b" L: ]6 S5 l
- & g) f" {1 T6 r1 c
- /*
: \; [! G p" h2 b/ H$ f/ f - *描述: 检查EEPROM是否正常, u# S6 J5 h8 [8 |7 m6 U
- *参数: 无; o: K; d# ~$ G. ]2 P L/ i3 m0 w
- *返回值:外接EEPROM是否存在
6 G* i0 A8 X; o! c% \ - */9 P' `- l* e& {' B/ f3 `. G3 V% H; k3 d
- u8 Eeprom_Check(void)
+ j& B$ g6 L Z8 L p - {
! E0 u* U: {4 U' P- O! ], t& s - u8 temp;: x" S7 G, O! f: \- l: d- r
- temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM " y3 F4 _! A1 V( M/ D6 h" d% |
- if(temp==0X55)return 0;
+ E+ a$ E' ]; U6 A' o1 X - else//排除第一次初始化的情况
/ B) v; u) {) { - {- W! D9 t! @2 `1 v/ m
- Eeprom_WriteOneByte(1023,0X55);5 U4 j0 }; q8 N! ^
- temp=Eeprom_ReadOneByte(1023); C+ `/ h9 r+ n
- if(temp==0X55)return 0;5 s7 I, W3 Z' r7 F, C Q9 L
- }6 q4 q6 F+ {0 C# t
- return 1; : Q _1 w% l+ J+ v+ o$ e' p$ s
- }
/ u- a1 r2 l4 S" K" c2 A+ d
" J) K" h) O. y- x- & j' j0 C2 F9 J- a9 ?
- /*' c) v/ o+ {5 m/ ~& n
- *描述: 在EEPROM里面的指定地址开始读出指定个数的数据% t% ^/ C% A* z! r$ k1 P9 \2 O
- *参数: ReadAddr: 开始读出的地址
8 X( S! ~# Q3 X1 j0 d- ] - * pBuffer: 数据数组首地址
9 `& _2 m0 D8 c/ ^/ Y0 O0 r* e - * NumToRead:要读出数据的个数8 W1 x0 n7 q3 l2 e& @- H
- *返回值:读到的数据 _8 ~/ t ? {% L6 `9 U! h
- */0 }# L6 l- ]# p+ ^4 U& x
- void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)) y$ K" A2 X1 D' c. ?5 X0 Y
- {
% W8 o/ A* ^% r& i, a - while(NumToRead)2 C; E/ j. y% n4 ?/ u
- {
9 w+ r* b6 |6 t' z2 W( V - CLRWDG();! G' ~ T% B6 W# Z0 k: B
- *pBuffer++=Eeprom_ReadOneByte(ReadAddr++); 8 @+ | h* }/ y% t5 w* I
- NumToRead--;. ~) i; {1 J3 l8 O) `
- }
6 h/ _- t2 r1 N2 | - } ' }, ] v) D3 q( I) f# X
' j( p8 Q% Y; n: h+ S- /** x* ?- l4 s% n: i/ V- L# C- x
- *描述: 在EEPROM里面的指定地址开始写入指定个数的数据8 f) R8 v8 X" m$ c: e
- *参数: WriteAddr: 开始写入的地址5 _1 A% `4 p/ L3 _/ i( X
- * pBuffer: 数据数组首地址
+ E6 h- z, `4 J, r U# Z4 {; p7 e - * NumToWrite: 要写入数据的个数* M! [/ K( g J% z
- *返回值:读到的数据
+ K/ S# @- Y) F. [6 F - */
# Z% E# T5 W6 a: E( e, b1 @, @ - void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
# |$ @% o- J O$ t1 c: X; V - {
. q6 \# u# Q( `* w - while(NumToWrite--)% m, a B8 P8 m; n
- {/ S$ g" \& [* i! U/ m: \
- CLRWDG();
' R9 |) U% M7 Z - Eeprom_WriteOneByte(WriteAddr,*pBuffer);2 l5 ^) I1 F8 K: c1 F# e. z3 j
- WriteAddr++;
" r" h1 H1 Y- I' ?2 m) E - pBuffer++;
0 g6 E" L9 Y% }) H% s( e. B - }% h$ q: H7 G; ~2 Z" R* m
- }0 t/ E o, E/ C- ^; B
- ; L F- `* v1 W. |- W
复制代码
$ `) s: [, K& v8 g3 i* P/ s6 I+ N
Q) H! I# j% T7 f8 u7 J% f; J
. ?0 f$ I3 z, d! _+ U8 f1 z! `/ m4 q( ^ |