|
发表于 2008-8-1 16:09:00
|
显示全部楼层
来自: 中国河南新乡
就是啊,首先你要看懂I2C协议,在就是根据某个芯片,看一下控制程序就大概可以了!下面就是24C02的读写程序:
1 j& W! U( @8 L: n, N9 E! o* w# @5 U% g5 j, ]: E8 t1 O. J
6 L" U* O" C7 k/ `1 g #define uchar unsigned char
8 l7 M) v" u0 M1 Y' U6 H8 L #define uint unsigned int
" m R/ X( a' h* ~. ~3 \# Z #include <reg52.h>
8 h) d/ t( A9 U; s$ ^7 j: l #include <stdio.h>
5 z& ^5 C9 Q! P9 S- Z. b% O #include <absacc.h>- Y- ~& R# z: _( v' \
sbit scl=P3^5; //24c02 SCL
* l7 F- v8 `+ u( ^* ~+ Y4 |9 e sbit sda=P3^4; //24c02 SDA
# U- j$ y& Q) P1 ^& c sbit DOG=P1^7; //狗0 M G) h8 I% |1 w0 M; I3 j/ x
uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据* x' ?: o* q0 _1 U$ n: [9 t" ~
void x24c02_write(uchar address,uchar info);
# R! v! {, n) q2 K- l //向24c02的address地址中写入一字节数据info
/ {0 F! |$ Y' z( f, Z7 I void x24c02_init(); //24c02初始化子程序
/ A' P" b5 O# @' \ void delay1(uchar x);: I* Q3 T. {% t2 ~( {, h% j) B
void flash();8 g' ~0 I" X1 A7 V: j
void x24c01_init();
% {; f+ ^! v$ L6 \; z void start();
. Z% d" R/ r! m& A! n4 C7 Z } void stop();4 U. ?/ q9 ^* x' _4 y
void writex(uchar j);) Z1 ?8 N. x: c. c8 R8 W% F3 e6 _' j
uchar readx();
! A4 P7 ~/ | {( _. X7 B* o2 ~ void clock();8 Q+ R0 K3 H( W* D0 h# l
void delay1(uchar x)9 G9 O% ]( h- T% D
{. @, }" O4 n6 m! v
uint i;
, E4 {2 L0 n% p' t9 m for(i=0;i<x;i++);- K5 X' M( `$ o: `0 C& J! Z
DOG=~DOG;7 N, [2 b( a4 D. q. y- z5 [1 |* c
}7 b- o4 A+ S7 ~4 ?# m Z* i* e' G
void flash()
( }. ~/ [* K# J1 `- k* _9 s, c" W {& a9 Q" L! d( w" n0 L. V# ^
uchar u;
& @' z1 z8 X$ F0 W) x$ f DOG=~DOG;# \! J; J/ p) j8 b5 U. E6 \
}
; h7 p1 Z& N: V1 M5 @, ^ void x24c02_init()
1 Z/ P/ }) k9 w6 N1 f! t% D {
4 o. o" ~" G3 Z" x/ R scl=1; flash(); sda=1; flash();
7 u. B' V1 ^( F0 J/ z }8 W' j) ^4 S1 c; H3 k
void start()& j3 A9 V, s; I
{$ u( e) C( `; X2 n ]. C
sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
& A- D, E& F Z4 ^ }# L7 u4 Y( e3 A. B, l* A- L5 H
void stop()
8 R% G; M; q, t. ?3 A P, V' g {
5 Q# ~! W/ _6 [( W( R sda=0; flash(); scl=1; flash(); sda=1; flash();) T! \& M+ y2 n
}
! r1 S4 p+ @# Y; G- L, l void writex(uchar j)
4 m5 ?( {' A- O$ X+ Q7 S {1 \) b# q/ ?% J- p. m$ [
uchar i,temp;! v/ {% f7 G, D: r# i- a5 n) `
temp=j;
9 Q* m8 b/ Q" C for (i=0;i<8;i++){( q( `' \) `# w! @7 T u
temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; 5 t! A- u- ~& C: r& R
flash();8 E) v" X+ Q F M9 G
}
% l* [- c4 t$ ^" X- f, B scl=0; flash(); sda=1; flash();
' @. ^) s' x2 r) w2 [ }4 i) H- F+ V7 v+ u4 V
uchar readx()
0 u# P0 \/ q: X {
" f t& u4 g2 z/ p) L0 C/ r$ Y uchar i,j,k=0;
7 \' _0 w& R" R6 G0 r scl=0; flash(); sda=1;
* U- z& [+ N4 C9 S) _ for (i=0;i<8;i++){
* S* m" T4 p3 T* e% Q& V flash(); scl=1; flash();* a2 m1 T; m) ?
if (sda==1) j=1;! N1 N, J! W A# E m7 A
else j=0;
6 C% i2 m& X; O+ O k=(k<<1)|j; scl=0;% \1 K% s+ F# `' d8 L
}
8 r T$ l% F0 I0 T# Z flash(); return(k);
' _+ L. e' n5 ~- m8 H0 L1 _ }: r( H$ e: k# e" i
void clock()
V* S E* ]3 z0 e {
( q! U5 I' n! D- m1 K uchar i=0;8 q& s" Y0 h* B
scl=1; flash();7 K6 \* {+ f" K4 n
while ((sda==1)&&(i<255))i++;
1 }/ j% @( M. I' I8 K- Z4 K+ O. s, z- @ scl=0; flash();/ k F" i3 X4 g5 w* f* w J
}
" A# ^! g) f* K% A9 U+ D uchar x24c02_read(uchar address)6 s" K/ f7 Y( u4 L3 W; K$ u; |, _1 A: J
{3 T2 ?. F5 P( c: [* m( m8 O/ P
uchar i;
- l4 e V! [* K" ] L/ j+ o" O0 R start(); writex(0xa0);
6 H& `! g- c6 a" E clock(); writex(address);2 F8 u7 w2 G6 l
clock(); start();
s1 g1 s" s/ ~9 p writex(0xa1); clock();
5 @ Z- w \0 C* S2 a% r i=readx(); stop();
0 G: E" X9 x+ B delay1(10);& w+ t7 M/ g6 n7 `# X
return(i);
1 R9 u$ K* d+ b9 M, H+ Z }* s2 a3 V, z! q A
void x24c02_write(uchar address,uchar info)$ ~, h3 b+ V& m+ D+ T% C
{' c0 S! w: d+ B& ]- S5 l/ s
EA=0;6 V$ C- L: g8 _/ Q1 Z. ~! ]* @4 s' i
start(); writex(0xa0);
$ H. U% G" |% W clock(); writex(address);
5 L3 s% M! M @0 Z clock(); writex(info);
( |1 g8 C+ e* {4 Y+ [8 K) c2 X clock(); stop();0 V0 e3 t/ n% G$ g( w
EA=1;
% [; n8 d8 B- }3 G% A5 S8 ` delay1(50);
5 L0 t( m2 ?0 o$ d6 ?% c1 z$ p+ \+ o } |
|