LIST p=16F874
include ‹p16F874.inc›
TRUE equ 1
FALSE equ 0
#define _SDA PORTC, 4
#define _SCL PORTC, 3
#define _BUF SSPBUF
#define _PADD SSPADD
_SAD equ b'1101000' ;адрес ведомого устройства
_SADw equ b'11010000' ;SAD+w
_SADr equ b'11010001' ;SAD+r
_SUBh equ 28h ;SUB - адрес регистра, из которого получаем старший байт данных
_SUBl equ 29h ;SUB - адрес регистра, из которого получаем младший байт данных
org 0x00
goto start
;
org 0x04 ; уход в прерывание
retfie ; возврат по стеку
start:
; ----- common initial ------
bsf INTCON, GIE ; глобальное разрешение всех прерываний
bsf INTCON, PEIE ; разрешение прерываний от периферийных модулей
; ----- I2C receiver -------
bsf STATUS, RP0 ; 1 банк
movlw .10
movwf SSPADD
bcf STATUS, RP0 ; 0 банк
movlw b'00001000' ; установка режима ведущего i2c
movwf SSPCON
bsf STATUS, RP0 ; 1 банк
movlw b'00011000' ; SCL на вход, SDA на вход
movwf TRISC
bsf STATUS, RP0 ; 1 банк
bcf SSPSTAT, CKE ; выходные уровни соответствуют спецификации I2C
bcf STATUS, RP0
movlw 0x00
movwf PIR1
bcf STATUS, RP0 ; 0 банк
movlw b'00101000' ; включение поддрежки i2c
movwf SSPCON
bsf STATUS, RP0 ; 1 банк
bsf SSPCON2, SEN ; инициирование START
call i2c_wait_SSPIF
bcf STATUS, RP0
movlw _SADw
movwf SSPBUF
call i2c_wait_ACK
call i2c_wait_SSPIF
bcf STATUS, RP0
movlw _SUBh
movwf SSPBUF
call i2c_wait_ACK
call i2c_wait_SSPIF
bsf STATUS, RP0 ; 1 банк
bsf SSPCON2, RSEN ; формируем повторный START
call i2c_wait_SSPIF
bcf STATUS, RP0
movlw _SADw
movwf SSPBUF
call i2c_wait_ACK
call i2c_wait_SSPIF
bsf STATUS, RP0 ; 1 банк
movlw 0x00
movwf SSPSTAT
bsf STATUS, RP0 ; 1 банк
bsf SSPCON2, RCEN ; разрешаем прием данных
call i2c_wait_SSPIF |