[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ: у меня работает.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Лёха 19 февраля 2002 г. 15:16
В ответ на: Помогите чайнику подцепить 24с16 к АТ89С52 отправлено Сусанин 19 февраля 2002 г. 15:08

; I2C.asm
;******************************************************************************
; Работа с двухпроводным интерфейсом I2C (12MHz).
;******************************************************************************

;------------------------------------------------------------------------------
I2C_Start:
setb SDA
setb SCL

; Ждем, когда шина освободится.
I2C_S_Busy:
mov C, SCL
anl C, SDA
jnc I2C_S_Busy

; Сигнал начала связи.
clr SDA
lcall I2C_Delay
clr SCL

ret

;------------------------------------------------------------------------------
I2C_Stop:
clr SDA
call I2C_SCL_High
call I2C_Delay
setb SDA
call I2C_Delay
ret

;------------------------------------------------------------------------------
; Задержка для синхронизации шины.
I2C_Delay:
nop
nop
ret

;------------------------------------------------------------------------------
; Установка SCL = 1 и ожидание окончания действия.
I2C_SCL_High:
setb SCL
call I2C_Delay

I2C_SCLH_Wait:
jb SCL, I2C_SCLH_Quit
jnb TF1, I2C_SCLH_Wait

I2C_SCLH_Quit:
ret

;------------------------------------------------------------------------------
; Посылаем один байт данных в I2C устройство.
I2C_SendByte:
mov R3, #008h ; Загружаем счетчик бит.

I2C_SB_Cycle:
rlc A
mov SDA, C
lcall I2C_SCL_High
lcall I2C_Delay
clr SCL
lcall I2C_Delay
djnz R3, I2C_SB_Cycle

setb SDA
lcall I2C_Delay
lcall I2C_SCL_High
lcall I2C_Delay

I2C_SB_Ack:
jnb SDA, I2C_SB_Quit
jnb TF1, I2C_SB_Ack

I2C_SB_Quit:
lcall I2C_Delay
clr SCL
lcall I2C_Delay
ret

;------------------------------------------------------------------------------
; Читаем один байт данных из I2C устройства.
I2C_ReadByte:
mov R3, #008h ; Загружаем счетчик бит.
setb SDA

I2C_RB_Cycle:
lcall I2C_SCL_High
lcall I2C_Delay
mov C, SDA
rlc A
clr SCL
lcall I2C_Delay
djnz R3, I2C_RB_Cycle

; Подтверждаем прием байта.
clr SDA
ret

;------------------------------------------------------------------------------
; Запись данных в I2C устройство.
; R0 - адрес устройства;
; R1 - адрес для записи;
; R2 - данные.
WriteI2C:
call I2C_Start

; Посылаем адрес I2C устройства.
mov A, R0
clr ACC.0
call I2C_SendByte

; Посылаем нач.адрес для записи данных.
mov A, R1
call I2C_SendByte

; Передаем данные.
mov A, R2
call I2C_SendByte
call I2C_Stop
ret

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru