Прописка
Регистрация: 21.06.2003
Сообщений: 118
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 19 сообщении(ях)
|
Вот кусок программы. все немного деревяное, но зато точно работает.
;Модуль процедур и функций I2C устройств
;**********************************
; Процедура stop_bit
Stop_Bit
bcf PORTA,SCL
bcf PORTA,SDA_W
bsf PORTA,SCL
bsf PORTA,SDA_W
return
;**********************************
; Процедура start_bit
Start_Bit
bsf PORTA,SDA_W
bsf PORTA,SCL
bcf PORTA,SDA_W
bcf PORTA,SCL
return
;**********************************
;ФУНКЦИЯ Check_Bus - Check I2C Bus
;Возвращает out = 1, если шина BUSY
Check_Bus
bcf tbit1, out ;сброс выходного бита
bsf PORTA,SCL ;установка в 1 на всякий случай
bsf PORTA,SDA_W ;отключение МАСТЕРА от шины...
btfsc PORTA,SDA_R
return
;Если не ответил - подождем и спросим еще разок
nop
nop
call Reset_Bus
nop
nop
;
btfss PORTA, SDA_R
bsf tbit1, out ; "BUSY!!!"
return
;**********************************
;--------------------------------------------------------------
; Процедура WriteByte записывает байт в Slave устройсво
; для задания адреса надо сделать ручную корректеровку...
; Входная информация из W регистра...
Write_Byte
;--------------------------------------------------------------
;передаем переменную в i2c_var1
movwf i2c_var1
;Формируем счетчик
movlw 8
movwf i2c_var2
;Сброс SCL в 0 на всякий...
bcf PORTA,SCL
; пишем бит
wb btfsc i2c_var1, 7
goto hi
;низкий уровень
bcf PORTA, SDA_W
goto wbl
hi ;высокий уровень
bsf PORTA,SDA_W
;=================
wbl
;Щелкаем...
bsf PORTA,SCL
bcf PORTA,SCL
;=================
;вычитаем счетчик битов...
decfsz i2c_var2, f ;если 0 то пропустить...
goto wn
goto fin
wn bcf STATUS,C ;сбросим на всякий С-флаг переноса/заема
rlf i2c_var1,f
goto wb ;следующий бит
;=================
fin ;все...главное не зыбыть спросить подтверждение!...
return
;--------------------------------------------------------------
; Процедура Read_Byte считывает 8 бит при передаче SLAVE-устройством
; Выходной байт записывается в W...
Read_Byte
;Устанавливаем SDA_W в HIGH...
bsf PORTA,SDA_W
;обнуляем рабочий регистр i2c_var1
clrf i2c_var1
;Формируем счетчик
movlw 8
movwf i2c_var2
;считываем байт
;сдвиг регистра влево...
rbl1 bcf STATUS,C
rlf i2c_var1, f
;начало такта синхронизации...
bsf PORTA,SCL
;Чтение состояния SDA
btfsc PORTA, SDA_R
bsf i2c_var1, 0
;Конец такта синхронизации
bcf PORTA,SCL
;вычитание счетчика
decfsz i2c_var2,f
goto rbl1
movf i2c_var1,w
return
;--------------------------------------------------------------
;Функция Read_Ack - читает подтверждение от SLAVE и
; выставляет флажок tbit1.out, если Slave не подтвердил
Read_Ack
bcf tbit1, out ;сброс выходного бита
bsf PORTA, SDA_W ;отключение
bsf PORTA, SCL
;-------------------------------------------------------------
;послушаем
btfsc PORTA, SDA_R
bsf tbit1, out ; 1 - Slave не подтвердил !
;-------------------------------------------------------------
bcf PORTA, SCL
return
;--------------------------------------------------------------
; Процедура Write_Ack выдает в линию
;положительный подтверждающий сигнал
Write_Ack
bcf PORTA, SDA_W
bsf PORTA, SCL
bcf PORTA, SCL
bsf PORTA, SDA_W
return
; Процедура Write_No_Ack выдает в линию
;отрицательный подтверждающий сигнал
Write_No_Ack
bsf PORTA, SDA_W
bsf PORTA, SCL
bcf PORTA, SCL
return
;**********************************
;--------------------------------------------------------------
; Процедура Сброса I2C устройств
;--------------------------------------------------------------
Reset_Bus
; 1-SDA и SCL в "1"
; 2-10 раз взмахнуть синхронизацией,
; 3-свормировать стоп-бит
; 4-Если SDA=0 - Ждать
;============================
bsf PORTA, SCL
bsf PORTA, SDA_W
;============================
; 10 синхронизацией в любом случае...
movlw 10
movwf i2c_var1
ReBL1 bcf PORTA,SCL
bsf PORTA,SCL
decfsz i2c_var1,f
goto ReBL1
;============================
;Формирование СТОП-бита
call Stop_Bit
;============================
; 4-Если SDA=0 - Ждать
btfss PORTA, SDA_R
goto $-1
return
|