|
编写好 I2C 数据读写函数, 下面就可以编写 AT24CXX 的读写函数, 代码如下: - /****************************************************************7 h8 n. O/ a: |. _. I9 k/ B; k
- * 函 数 名 : AT24CXX_ReadOneByte$ \0 B" _2 J* y6 ^5 T
- * 函数功能 : 在AT24CXX 指定地址读出一个数据
$ n+ P# U. j& L+ ] - * 输 入 : ReadAddr:开始读数的地址2 Q! j, F$ W* {8 x* q" R
- * 输 出 : 读到的数据
K( q3 o/ Z8 p' l - *****************************************************************/
3 k$ |# G& ?, _/ N: }3 R - u8 AT24CXX_ReadOneByte(u16 ReadAddr)6 r$ [5 v: @2 ~
- {
5 l; z, h# O+ ^9 f( { - u8 temp=0;! G! x# h# j2 h4 w" K' W6 l
- IIC_Start();) o# j- K' y. d4 A% |! @3 t
- if(EE_TYPE>AT24C16)& @# _' @. N; z1 k
- {
; x$ H3 C$ k: N) B - IIC_Send_Byte(0XA0); //发送写命令" j$ I' ~; B1 R0 i$ b: M! q
- IIC_Wait_Ack();6 j9 }9 Q# E' n1 B4 @) k `" j
- IIC_Send_Byte(ReadAddr>>8);//发送高地址) R# F, I! F8 {( Q. q
- }
7 ]) q8 `. _) r* n* J( v. o - else, \0 @# J3 e/ L7 N9 I: j/ {
- {; m; w. D% p9 _: L- _
- IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据/ c! U) [, [4 m8 h
- }
9 H, h/ n3 E& q7 \, N - IIC_Wait_Ack();
2 w, T3 R! Z* C1 G% a% b6 f - IIC_Send_Byte(ReadAddr%256); //发送低地址* y C) I' L6 {
- IIC_Wait_Ack();# }. y9 J' P/ I" d/ c+ b) d
- IIC_Start();
' Z( Y( s! y, z4 N# P - IIC_Send_Byte(0XA1); //进入接收模式
* d X! v4 y2 |0 c5 E - IIC_Wait_Ack();
6 q! m% _0 C/ K - temp=IIC_Read_Byte(0);
; e5 j0 c& ]: I! Z! K/ r - IIC_Stop();//产生一个停止条件
0 k, \* `0 u1 Y7 ^# P3 ^ - return temp;
5 z6 ?4 r; T- G, o+ d6 K7 u1 l i- a - }
复制代码- /****************************************************************/ {3 `$ V" ^% d, b" q
- * 函 数 名 : AT24CXX_WriteOneByte
+ I x" Q% M1 y7 O - * 函数功能 : 在AT24CXX 指定地址写入一个数据
( _* x7 U1 C- w+ w$ \2 ]6 a - * 输 入 : WriteAddr :写入数据的目的地址DataToWrite:要写入的数据' K) } i. g3 i3 g$ F7 z) R
- * 输 出 : 无; [# W( @. u; l7 I: X
- *****************************************************************/
( R* P* w7 ?3 A$ P0 G8 N - void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
# d: Z' }; K0 U" Y6 H9 R) I - {2 J) B; [4 Z( ^7 v2 d
- IIC_Start();6 I8 E7 \! m' a; r
- if(EE_TYPE>AT24C16)- v- A+ \6 |. S- A( t
- {
6 ?5 U8 k5 s8 ?3 O! ~6 z* Y - IIC_Send_Byte(0XA0); //发送写命令( K0 a) @9 D# G! U
- IIC_Wait_Ack();
N' b, g; l0 f8 F - IIC_Send_Byte(WriteAddr>>8);//发送高地址" f9 E0 U' T# z! I
- }
2 B. S; L3 k5 I - else( |3 u1 _* p r$ z% A S
- {# d9 T9 V5 x/ }
- IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据. z% a0 ~* ^% h6 L. k
- }
9 v' R) v0 `. l: @8 ]3 ^ ?" V4 ~ E - IIC_Wait_Ack();8 H6 w3 | H; v2 m
- IIC_Send_Byte(WriteAddr%256); //发送低地址
2 I$ J4 a% I% q! x/ K% l3 K - IIC_Wait_Ack();9 P( z; X& V% Y" M* Q. e0 A
- IIC_Send_Byte(DataToWrite); //发送字节* D1 N. M7 p8 q9 P k# }" n
- IIC_Wait_Ack();/ t* J I3 E7 [; N0 y
- IIC_Stop();//产生一个停止条件
0 R8 Q* B4 B2 D - delay_ms(10);
5 O9 O2 d. M d - }
复制代码- /****************************************************************
! w+ K) H8 F: S5 I4 |/ x) i. Q# Z - * 函 数 名 : AT24CXX_WriteLenByte
7 }2 w5 R% a: } - * 函数功能 : 在 AT24CXX 里面的指定地址开始写入长度为 Len的数据用于写入 16bit 或者 32bit 的数据
( K( o. D: @8 [) l - * 输 入 : WriteAddr :写入数据的目的地址' i9 C, o- [5 [5 M. O2 r! S, v6 E
- DataToWrite:要写入的数据
0 H& e0 n. @ f+ t. M1 W) Q7 @' _ - Len :要写入数据的长度 2,45 L/ r* i" L1 h5 P- J
- * 输 出 : 无; j, d; h$ I0 S& _, c( w
- *****************************************************************/
' p' \/ X6 @- t& S1 H - void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)5 V0 n3 b# ^$ T. Z
- {$ y: O" D1 O: W. K
- u8 t;3 o9 ?/ r2 f7 }+ [
- for(t=0;t<Len;t++)
3 L$ l7 R3 w* H) ` - {
9 w) D; v( v! u' i% o F2 B - AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);5 e$ S7 \6 }. u1 R
- }
! j6 i: p" K5 }! h - }
复制代码- /****************************************************************
$ a0 t+ Y8 x. A7 O/ e! z - * 函 数 名 : AT24CXX_ReadLenByte5 Y. B7 m8 O( n0 o& p' ^
- * 函数功能 : 在 AT24CXX 里面的指定地址开始读出长度为 Len的数据用于读出 16bit 或者 32bit 的数据! R& G; ^1 Z! a1 ~
- * 输 入 : ReadAddr :开始读出的地址
5 e5 o: P$ [8 b) r - Len :要读出数据的长度 2,4
% h6 M# g Z( F4 B N0 O5 o - * 输 出 : 读取的数据) s0 ]1 Z( ^' u& z2 V2 F/ N S3 v* U
- *****************************************************************/
2 u0 z2 e8 ^& z7 {& m$ \ - u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)2 h. J' k3 i4 E% B* l
- {
" s h+ a+ S; ? - u8 t;
( [, V% d' N$ Z. U: j - u32 temp=0;! y3 h; _: M3 u3 @& e+ s" _
- for(t=0;t<Len;t++)7 q& w/ g/ T1 U. ~
- {/ h5 W3 N+ w4 L
- temp<<=8;! \4 Y$ u6 s$ G, T& P& Q& C
- temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);% K! k/ A% H9 w$ Q+ a9 ~
- }4 z; W% {8 T/ D: W0 {
- return temp;
' d9 @; y, |% Z0 K! q6 s' l - }
复制代码- /****************************************************************
+ a5 f) N1 @0 Z& i. n: k - * 函 数 名 : AT24CXX_Check* A8 X( b: l) x
- * 函数功能 : 检查 AT24CXX 是否正常
* [3 [0 D5 a$ I, F/ A - * 输 入 : 无& }! g+ [/ ^9 d7 b
- * 输 出 : 1:检测失败,0:检测成功
3 r# f/ M- w4 Y# p; e - *****************************************************************/2 `$ J o' L4 I& }; w' A" {
- u8 AT24CXX_Check(void)$ r* ~0 Z) g' v" Y
- {4 q6 p$ u$ Y( M3 D0 l
- u8 temp;! F# R9 S$ E- w' Q- m
- temp=AT24CXX_ReadOneByte(255);//避免每次开机都写 AT24CXX% ?, x% k2 K8 u, w% D
- if(temp==0x36)return 0;3 J- R5 d& D8 Y2 T$ ]
- else//排除第一次初始化的情况! O7 R+ F! h: X: G6 Z; X
- {
9 C; G+ J- t# q - AT24CXX_WriteOneByte(255,0X36);
9 N/ ?6 \4 S* } - temp=AT24CXX_ReadOneByte(255);
( a: P% Z" e8 j- V* ^! l - if(temp==0X36)return 0;
3 M/ A- t: H/ N3 H8 g) U) x M* S - }* }1 U" q' \3 V* \1 \
- return 1;
" X: G; M2 o* a# H; t+ ] - }
复制代码- /****************************************************************
5 S2 V b$ m. L9 U. Z9 I; B - * 函 数 名 : AT24CXX_Read, ?) K% c N7 C. x- X+ z
- * 函数功能 : 在 AT24CXX 里面的指定地址开始读出指定个数的数据' C, K, j4 ^) l
- * 输 入 : ReadAddr :开始读出的地址 对 24c02为0~255
$ ]1 S" t2 d0 i+ t' ` - pBuffer :数据数组首地址
; W% M$ j3 A/ a9 z5 @ - NumToRead:要读出数据的个数/ T# }0 Q* G- q* p0 l
- * 输 出 : 无. |+ ?; j7 G) r" S
- *****************************************************************/9 m$ z+ x/ J6 ~
- void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
* g# ?: z5 X. a) n - {, u' @. F, o4 C5 A' |: T) I2 U# s* {
- while(NumToRead)- K- n t( Z" r& Z6 k" }7 a
- {
, r7 d. l* A' u$ A# C4 v - *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);* V2 n. f f& d: [8 f/ g( W
- NumToRead--;
) Z0 k, e6 V4 E- o \ - }
W9 v( b% Y$ D- N1 S5 q - }
复制代码- /****************************************************************
- r1 I6 b! | q4 W% r* Y - * 函 数 名 : AT24CXX_Write
( h- [% W, A# _& E: U - * 函数功能 : 在 AT24CXX 里面的指定地址开始写入指定个数的数据
4 Y( A0 {5 u) G Q$ \% H2 ]6 j - * 输 入 : WriteAddr :开始写入的地址 对 24c02为0~255
+ O6 s: v4 A3 x: b( R2 Y2 N - pBuffer :数据数组首地址
. J e4 m& E) C8 w& S: Q - NumToRead:要读出数据的个数
2 B, J9 c& J5 R - * 输 出 : 无/ x& F1 v3 D0 h4 m7 R- i) I
- *****************************************************************/1 I5 Y0 P5 N3 b9 F
- void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
7 q' c2 _0 F; T9 @ v - {
' W& o0 B t. f% ? - while(NumToWrite--)
" l! a7 |/ \# K$ B' P7 \% v - {
; H) Q+ c8 v$ ^; b% l - AT24CXX_WriteOneByte(WriteAddr,*pBuffer);; p3 \( c. R, ?: d" u; U
- WriteAddr++;
' z" X% `, B+ O" X* b6 ]& F. ~2 p( i! W - pBuffer++;3 R; @7 R/ r" }
- }* J+ |1 ^8 O$ I
- }
复制代码 这部分函数在 24cxx.c文件内,这个文件支持 AT24CXX 系列的很多芯片,可通过 24cxx.h 文件内的 EE_TYPE宏来修改,可修改的宏定义如下: - #define AT24C01 127! }) d N' O; ^; ^/ g0 Z0 E8 W
- #define AT24C02 2553 l6 Y: ?0 O. w4 Z5 ]; v
- #define AT24C04 511
! m8 Z* g, \. x7 N - #define AT24C08 1023- g$ b* u8 F( b
- #define AT24C16 2047
4 J: T6 Q" F9 j: } - #define AT24C32 4095
- { V* R$ A3 [; U6 l; I. n+ } - #define AT24C64 8191; Y- ?7 ?+ d0 {9 X: m
- #define AT24C128 16383
' B, ^) I2 B) A2 b - #define AT24C256 32767
复制代码
( {0 \! i" T, \% g' M
由于我们开发板上使用的是 AT24C02,所以宏定义默认是:
3 O6 B6 _/ G& E8 R* ^ 如果你自己设计的电路板上使用的是其他的 AT24CXX 芯片, 那么可以修改这个宏,实现不同芯片数据的读取和写入操作。 * w: ~# ^- r9 v2 M& v6 Y9 o
|