i2c асмовое
;Используемые регистры
;I2Csign-адреса устройств
;
WriteTimer:
mov I2Csign,#10100000b
jmp WriteI2C
ReadTimer:
mov I2Csign,#10100001b
jmp ReadI2C
ReadTimerB:
mov I2Csign,#10100001b
jmp ReadI2Cb
WriteTimerB:
mov I2Csign,#10100000b
jmp WriteI2Cb
WriteFrq:
mov I2Csign,#10100010b
jmp WriteI2C
WriteFrqB:
mov I2Csign,#10100010b
jmp WriteI2Cb
ReadFrq:
mov I2Csign,#10100011b
jmp ReadI2C
ReadFrqB:
mov I2Csign,#10100011b
jmp ReadI2Cb
WriteEEPROM:
mov I2Csign,#10101110b
jmp WriteI2C
ReadEEPROM:
mov I2Csign,#10101111b
jmp ReadI2C
WriteEEPROMb:
mov I2Csign,#10101110b
jmp WriteI2Cb
ReadEEPROMb:
mov I2Csign,#10101111b
jmp ReadI2Cb
StartI2Cw:
mov A, I2Csign
clr ACC.0
sjmp StartI2C
StartI2Cr:
mov A, I2Csign
setb ACC.0
StartI2C:
setb SDA
nop
setb SCL
nop
nop
clr SDA ;Условие START
nop
nop
clr SCL
;Tlow=1.2 [3.0]
PutI2C:
setb C
rlc A
1$: mov SDA, C
clr C
setb SCL ;Thigh=0.6 [1.0]
rlc A
clr SCL ;Tlow=1.2 [3.0]
jnz 1$
setb SDA
setb SCL
mov C, SDA ;Подтверждение приема (0=ОК!)
clr SCL
ret
GetI2C:
mov A, #1
1$: setb SCL
mov C, SDA
rlc A
clr SCL
jnc 1$
ret
Ans0: clr SDA
Ans1: setb SCL
clr SCL
setb SDA
ret
StopI2Cerr:
1$: setb C
StopI2C:
clr SDA
setb SCL
nop ;Tsu,sto=0.6 [1.0]
setb SDA
ret
WriteI2C: ;R5=адр.м/сх, A=<байт>
; Выход: C=1 - ошибка
; B,R7,R6 - раб.регистры
mov B, A
mov R7, #3+1 ; к-во попыток записи
clr F0
1$: mov R6, #0 ; тайм-аут ожидания ответа
2$: call StartI2Cw
jnc 4$
3$: call StopI2C
djnz R6, 2$ ; ожидание - примерно 42 цикла
jmp StopI2Cerr ; Выход по ошибке 2
4$: mov A, R5
call PutI2C
jc 3$
jnb F0, 5$
mov A, B
call PutI2C
jc 3$
call StopI2C
jbc F0, 2$
5$: call StartI2Cr
jc 3$
call GetI2C
call Ans1
call StopI2C
cjne A, B, 6$
inc R5
RET
6$: setb F0 ; Признак записи
djnz R7, 1$
mov A, #44+1 ; СОБЫТИЕ 45: ошибка записи в РР-1
7$: setb C
RET
ReadI2C: ;R1=адр.м/сх
; Выход: A=<байт>, C=1 - ошибка
call StartI2Cw
jc 1$
mov A, R5
call PutI2C
jc 1$
call StartI2Cr
jnc 2$
1$: jmp StopI2Cerr ; Выход по ошибке 2 (нет ответа РР)
2$: call GetI2C
call Ans1
inc R5
clr C
jmp StopI2C
ReadI2Cb:
;R5-колчество принемаемых байт
;R0-указатель начала буфера в ОЗУ
;R1-указатель начала в устройстве
call StartI2Cw
jc 1$
mov A,R1
call PutI2C
jc 1$
call StartI2Cr
jnc 3$
1$: jmp StopI2Cerr ; Выход по ошибке
2$: call Ans0
3$: call GetI2C
mov @R0, A
inc R0
djnz R5, 2$
call Ans1
clr C
jmp StopI2C
WriteI2Cb:
;R5-колчество записываемых байт
;R0-указатель начала буфера в ОЗУ
;R1-указатель начала в устройстве
inc R5
call StartI2Cw
jc 3$
mov A,R1
2$: call PutI2C
jc 1$
mov A,@R0
inc R0
djnz R5, 2$
jmp StopI2C
3$: inc R5
1$: jmp StopI2Cerr ; Выход по ошибке