; ************
; * ФУНКЦИЯ: Анализирует события вины I2С и реагирует требуемым образом *
; * ВХОД: Копия SSPCON в I2C_STATUS *
; * ВЫХОД: Выполняются требуемые действия I2C_ERROR = -1, ЕСЛИ событие не было распознано *
; ************
I2C_HANDLER; 1-е событие? (пакет адреса, ведущий-передатчик) --------
movf I2C_STATUS,w; Берем копию содержимого SSPSTAT
xorlw b’00001001’; Проверяем наличие S=1, D/A=0, R/W=0, BF=1
btfss STATUS,Z; Равно?
goto STATE2; ЕСЛИ нет, TO проверяем 2-е событие
movf SSPBUF,w; ИНАЧЕ читаем буфер для сброса флага BF
; 2-е событие? (пакет данных, ведущий-передатчик) ---------
STATE2 movf I2C_STATUS,w; Берем копию содержимого SSPSTAT
xorlw b’00101001’; Проверяем наличие S=1, D/A=1, R/W=0, BF=1
btfss STATUS,Z; Равно?
goto STATE3; ЕСЛИ нет, TO проверяем 3-е событие
movf SSPBUF,w; ИНАЧЕ считываем номер канала
call GET_ANALOG; Оцифровываем сигнал N-го канала
movwf TEMP; и сохраняем результат в регистре ТЕMР
; 3-е событие? (пакет данных, ведущий-передатчик) ----------
STATE3 movf I2C_STATUS,w; Берем копию содержимого SSPSTAT
xorlw b’00001100’; Проверяем наличие S=1, D/A=0, R/W=1, BF=0
btfss STATUS,Z; Равно?
goto STATE4; ЕСЛИ нет, ТО проверяем 4-е событие
movf TEMP,w; ИНАЧЕ берем значение температуры
movwf SSPBUF; и помещаем в буферный регистр для передачи
; 4-е событие? (пакет данных, ведущий-передатчик) -----------
STATE4 movf I2C_STATUS,w; Берем копию содержимого SSPSTAT
xorlw b’00101100’; Проверяем наличие S=1, D/A=1, R/W=1, BF=0
btfss STATUS,Z; Равно?
goto STATES; ЕСЛИ нет, TO проверяем 5-е событие
; Ничего не делаем!!!
; 5-е событие? (ведущий отослал ведомому NACK) ------------
STATE5 movf I2C_STATUS,w; Берем копию содержимого SSPSTAT
xorlw b’00101000’; Проверяем наличие S=1, D/A=1, R/W=0, BF=0
btfss STATUS,Z; Равно?
decf I2C_ERROR,f; ЕСЛИ нет, TO сообщаем об ошибке
return
Еще один пример использования модуля SSP приведен в документе AN734 «
Как и в случае с протоколом SPI, большинство Си-компиляторов для микроконтроллеров PIC имеют встроенные функции для реализации протокола I2С, что позволяет отказаться от написания собственных функций, манипулирующих различными битами регистров специального назначения.
В качестве примера рассмотрим Программу 12.13, написанную для компилятора CCS и выполняющую действия, аналогичные ассемблерной программе, фрагменты которой были приведены в Программах 12.9 и 12.10.