I 2 C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I 2 C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I 2 C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
下面是我写的AT89C51单片机对24C04的读写控制的代码:
;;;; 写入并读出一页数据
;;; RAM 1OH--17H 写入 24C02的 10H---17H
;;; 再将10h--17h 读出存入内部RAM 30H--37H
ORG 000H
ajmp begin
org 0050h
begin: mov A,#1
MOV R0,#10H
TOU: MOV @R0,A
INC R0
INC A
CJNE R0,#18H,TOU
acall start1
mov a,#0a0h
acall wbta
acall ack
mov r0,#10h
mov a,r0
acall wbta
acall ack
conw:mov a,@r0
acall wbta
acall ack
inc r0
cjne r0,#14h,conw
acall stop ;;;;写入数据
mov r7,#200
delay_01: nop
nop
nop
djnz r7,delay_01 ;;延时
acall start1
mov a,#0a0h
acall wbta
acall ack
mov a,#10h
acall wbta
acall ack
acall start1
mov a,#0a1h
acall wbta
acall ack
mov r0,#40h
contr: acall rbta
mov @r0,a
inc r0
acall wack
cjne r0,#48h,contr
acall wnack ;;;读出数据
rbta: mov r7,#8 ;;读出一字节子程序
rbta1: setb p0.6
setb p0.7
mov c,p0.6
rlc a
clr p0.7
djnz r7,rbta1
clr p0.6
ret
wbta: mov r7,#8 ;;写入一字节子程序
wbta1:rlc a
mov p0.6,c
setb p0.7
nop
nop
nop
clr p0.7
clr p0.6
djnz r7,wbta1
ret
start1:setb p0.7
setb p0.6
nop
nop
nop
clr p0.6
nop
nop
nop
clr p0.7
ret
stop: clr p0.6
setb p0.7
nop
nop
nop
setb p0.6
nop
nop
nop
clr p0.6
ret
ack: setb p0.6
setb p0.7
jb p0.6,$
clr p0.7
clr p0.6
ret
wnack:setb p0.6
setb p0.7
nop
nop
nop
clr p0.7
clr p0.6
ret
wack: clr p0.6 ;;写入ack位
setb p0.7
nop
nop
nop
clr p0.7
setb p0.6
ret
对24C04的控制主要在于对其时序的控制。由于不同的IC的反应时间不一,写的时候,你可以读写的时候慢点来确保时序无误,然后再去调整起时间。