Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Константы
- SDA_BIT EQU 0 ; Бит 0 порта B - SDA
- SCL_BIT EQU 1 ; Бит 1 порта B - SCL
- AY_PORTB EQU 0xFFFD ; Адрес порта B AY
- ; Инициализация
- I2C_INIT:
- LD BC, AY_PORTB
- LD A, 0xFF ; Все пины на вывод
- OUT (C), A
- ; Установить SDA=1, SCL=1
- LD A, (1<<SDA_BIT) | (1<<SCL_BIT)
- OUT (C), A
- RET
- ; Старт-условие I²C
- I2C_START:
- ; SDA=1, SCL=1 -> SDA=0 при SCL=1
- LD A, (1<<SCL_BIT)
- OUT (C), A
- CALL DELAY
- LD A, 0
- OUT (C), A
- CALL DELAY
- RET
- ; Отправка байта
- I2C_SEND_BYTE:
- LD E, 8 ; 8 бит
- I2C_BIT_LOOP:
- RLC D ; Бит из D в carry
- LD A, 0
- JR NC, BIT_ZERO
- OR (1<<SDA_BIT)
- BIT_ZERO:
- OR (1<<SCL_BIT) ; Поднять SCL
- OUT (C), A
- CALL DELAY
- RES SCL_BIT, A ; Опустить SCL
- OUT (C), A
- CALL DELAY
- DEC E
- JR NZ, I2C_BIT_LOOP
- ; Принять ACK
- RET
- ; Чтение байта
- I2C_READ_BYTE:
- LD E, 8
- LD D, 0
- ; Настроить SDA на вход
- LD A, ~(1<<SDA_BIT)
- OUT (C), A
- READ_BIT_LOOP:
- LD A, (1<<SCL_BIT)
- OUT (C), A ; SCL=1
- CALL DELAY
- ; Прочитать SDA
- IN A, (C)
- AND (1<<SDA_BIT)
- JR Z, BIT_LOW
- SET 0, D ; Установить бит
- BIT_LOW:
- LD A, 0
- OUT (C), A ; SCL=0
- CALL DELAY
- DEC E
- JR NZ, READ_BIT_LOOP
- LD A, 0xFF ; Вернуть SDA на вывод
- OUT (C), A
- RET
Advertisement
Add Comment
Please, Sign In to add comment