一、AT24C08的通讯方式
/ I1 [5 N; L2 R j W5 H* ?, l% ?AT24C08采用IIC通讯协议,本次例程是普通IO口模拟IIC端口+ a/ |7 @, Q& _5 d2 [1 Z
$ x( V- G& N# U. h* V4 |二、AT24C08的存储方式
/ H+ ?8 @* s- I0 f! T- c o0 F+ `AT24C08有8K位存储空间,可以存储8K/8=1K字节的空间,1 r5 I3 r8 Q x% r l
1K存储空间,是由外部的A2决定如何分配的,例如你的A2引脚固定接地,那么这1K的存储空间, v4 Z% e% @& o9 S% b7 i
就分成了4块,每块都有256字节存储空间,每个字节是8位
0 r- t& f5 v9 C. W8 x& I! @4 Z
' M1 |6 c9 I$ b2 J2 J- s器件写地址分别是0xA0,0xA2,0xA4,0xA6
& a8 b5 j) N ? @. X9 ~器件读地址分别是0xA1,0xA3,0xA5,0xA7( \$ p, ~/ \2 \6 g4 \% [* J Y! R
- /*
7 [ O6 p' |! K$ K. b - *描述: 在eeprom指定地址写入一个数据1 \9 v- I& a! p
- *参数: WriteAddr :写入数据的目的地址& ~9 g5 e' Y- d
- * DataToWrite:要写入的数据6 Z3 L# e- E0 Q2 L
- *返回值:读到的数据
3 o2 Z1 [6 |& T U/ ` - */. U0 e0 s( H, V. z. O% M4 x
- void Eeprom_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
7 k6 a* q+ ?& {9 Y. u6 z2 I% w - { 3 N, ]1 d5 Q3 r
- IIC_Start(); ) t9 x# u8 h9 a: I, X2 G
c7 K& h& h/ e) K5 K) I- IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
) D; N% d% @% v6 _) t4 v: V - IIC_Wait_Ack(); + ?1 V) h& ~1 g. e3 f2 @7 o
- IIC_Send_Byte(WriteAddr%256); //发送低地址
* U0 o! z4 l5 {" U4 K - IIC_Wait_Ack();
' I% }" K7 {9 S9 _& w - IIC_Send_Byte(DataToWrite); //发送字节 7 Y" i1 V* t& ?' B* l# P
- IIC_Wait_Ack();
7 R; m6 @1 r i9 o& \ - IIC_Stop();//产生一个停止条件
3 W% ?- c( t: P( ` - HAL_Delay(10); : t! @' L# X8 Z: I3 [
- }
6 \3 Z- L7 L- j" \ - /*
3 g+ q' O& P7 \6 c* {# f - *描述: 在eeprom指定地址读出一个数据
- w# _- u, i4 X, ^$ `, } - *参数: ReadAddr:开始读数的地址* g) W8 ]6 D- p" }0 V( ]
- *返回值:读到的数据
5 M1 c+ d5 n' O2 m5 F - */% }9 } ?" S6 E! P' ^
- u8 Eeprom_ReadOneByte(u16 ReadAddr)
$ ~9 E1 U% _, F0 J( ` - {
8 P" e& x' p |3 v) P& f; M7 d - u8 temp=0; % B+ B- R9 f5 A3 K& r( U
- IIC_Start(); 4 U0 d& y/ F! U1 Q, e4 D1 x
- $ W5 t/ v% r1 Y3 w& ]' o5 W( f6 k
- IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据: S, e4 k1 G* |' b3 P
- IIC_Wait_Ack();
7 h! F- R; {# a' G2 j1 e* I - IIC_Send_Byte(ReadAddr%256); //发送低地址) {9 W d( u _; T _8 }$ G- B
- IIC_Wait_Ack(); 5 A' b4 m; a" F5 }2 K5 m7 I
- IIC_Start();
! M, h% k" A/ C. P7 i - IIC_Send_Byte(0XA1+((ReadAddr/256)<<1)); //进入接收模式
1 p+ `2 X% D; V, L - " b& e5 D$ A8 N
- IIC_Wait_Ack(); r# R! J, w, c4 m# E' Q; T
- temp=IIC_Read_Byte(0);$ j9 _0 `3 J4 [2 x/ y
- 0 ?' k3 k) o' B. f4 E( _
- IIC_Stop();//产生一个停止条件 ) c* w' e; k* V
-
2 p* {: V1 `6 _4 G7 @ - return temp;
6 D& J; ~1 q# ] - }
- m) N) @$ K% C; L - % u6 s5 l) N$ L. `/ m' q `
- /*
& G: P. C5 Z1 _; M% t# M - *描述: 检查EEPROM是否正常+ ?& `5 G1 ~. [* i% x; J
- *参数: 无
: s6 ^* r- n: c - *返回值:外接EEPROM是否存在
# V9 ^+ }6 \* p0 H. n& I6 b - */7 `' y5 T5 z( ?- v7 H2 @) a8 d
- u8 Eeprom_Check(void)
( ]* f; F4 G4 m+ G& F2 o - {
% a& d6 Z" ^' `* i, f; V" h# w9 T - u8 temp;
% ^' z v. r# @! y; Z - temp=Eeprom_ReadOneByte(1023);//避免每次开机都写EEPROM 4 O( p- _. l2 m5 G2 d" o
- if(temp==0X55)return 0; 9 x, j' [) @% z) n/ d8 h+ K0 M- u, L8 Y
- else//排除第一次初始化的情况1 ~ o9 [) f4 l* H% M: `* L
- {6 W! B4 k a! p9 `" g
- Eeprom_WriteOneByte(1023,0X55);
# r/ p% s3 x2 f4 m+ g' p - temp=Eeprom_ReadOneByte(1023); 0 V7 i/ ]9 ~, G, Z+ M% v! j, F5 ~
- if(temp==0X55)return 0;
* C1 }" d( c1 p+ y4 H, [( `! b - }5 |5 g; l1 w# j1 `
- return 1;
$ y( l; D8 c2 d1 Q. s) m - }
# l5 P& X# i/ \/ u - 1 N. H+ Z+ Y; a- @$ W/ @- f& o$ ]
- 7 B8 I) A+ }+ V% ]. W+ m. b
- /*
1 \: A0 g+ K: q" G, r4 d& Y, ? - *描述: 在EEPROM里面的指定地址开始读出指定个数的数据# S. a+ L) f0 D3 @+ C
- *参数: ReadAddr: 开始读出的地址# M9 W5 V0 o# G* J8 H4 B4 \
- * pBuffer: 数据数组首地址" n+ X% ]7 i' ?+ F2 ?& j" j
- * NumToRead:要读出数据的个数
, Q k7 a3 N! Y' u [9 f - *返回值:读到的数据
; ?% K3 q/ Q+ n - */
" M* v5 D* ~6 J4 ^! w( J; I5 J1 h - void Eeprom_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)2 n ~ |* w( q# A& f& ~
- {# M7 l9 ^$ A' l/ d
- while(NumToRead)
( F; A: r' M( K" ?# K' m7 Z. R, x - {
5 q; c) o4 S! |3 z0 q - CLRWDG();7 d. G( D1 R, J7 d# _
- *pBuffer++=Eeprom_ReadOneByte(ReadAddr++); 2 T* @5 w* V8 ^- |
- NumToRead--;4 f$ u, o7 [5 h7 z+ i: i" u2 X
- }
( X- r" r& P' @( Y8 R, H - } ( C; L% y, M: E
' [# w l! o/ Y) _- /*
' H4 j/ M2 Z3 P: M: ~+ e* H - *描述: 在EEPROM里面的指定地址开始写入指定个数的数据
5 x- d; n! {" l E( u% D$ Q! i; P - *参数: WriteAddr: 开始写入的地址1 h, ^* P& _$ p6 D0 V4 u
- * pBuffer: 数据数组首地址 W. P1 _: m" |. h( L
- * NumToWrite: 要写入数据的个数6 H7 _7 ?, ^7 _- t) z
- *返回值:读到的数据
$ i% M( V5 M& W) O9 A" Y - */8 k) X4 ]8 C5 S( r1 I1 R& g
- void Eeprom_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)+ w* T' e0 i9 V* g+ X: a/ U0 U' O
- {
0 { v& G( x, l9 |3 J* A - while(NumToWrite--)$ p, `3 L: V( L' Q- ]6 V
- {
4 p' z0 s- H h3 P o4 M - CLRWDG();
9 c G& q, v* ^* P. F - Eeprom_WriteOneByte(WriteAddr,*pBuffer);; g7 M: X+ N1 M7 W9 g( H
- WriteAddr++;7 C; _7 g4 ~1 O# {* Y9 [
- pBuffer++;- X1 C/ _6 k v
- }" @0 M( }9 a. X: Y& Y( j7 q7 m
- }
* e, q) w7 } O) V2 m
+ w; u+ e# ^) w% P h: Y
复制代码 8 f: b$ @# u' }# W. a
; x& C- n% m, Y
- i0 M+ I- ~% g; ^% |# S0 e4 V2 G$ I5 I9 A$ W
|