• Главная • Назад •








Counter

 


Функции I2C для PIC18 на ассемлере
 


Подпрограммы на ассемблере для работы с шиной I2C.

Для работы с шиной необходимо написать несколько функций.

b_start_w                                         ; формирования начала START для записи
b_start_r                                          ; формирования начала START для чтения
b_restart_w                                     ; формирования повторного начала для записи

b_restart_r                                       ; формирования повторного начала для чтения

i2c_write                                           ; формирования записи байта в устройство

i2c_read_ack                                   ; формирования чтения байта из устройства с подтверждением приема

i2c_read_noack                               ; формирования чтения байта из устройства с не_подтверждением приема

b_stop                                               ; формировать бит стоп

 

 

 

;============================================================================================

;================== подпрограммы шины I2C ===================================================

;============================================================================================

i2c_idle                ; ожидание окончания активности                    

                                                           clrf         timerzh

                                                           movlw  .5

                                                           movwf  timerzl                                              

                                                           btfsc      SSPSTAT,R_W                                                 ; проверить происходит ли передача данных

                                                           bra         $-2                                                                    ; если происходит, то ожидать

cojid                                                 

                                                           decfsz   timerzh,f                                                         ; 18f45K20

                                            bra         $+.12                                                                              ; исправление зависания

                                                           decfsz   timerzl,f                                                           ; 18f45K20

                                            bra         $+.8                                                                                 ; исправление зависания                                      

                                                           bcf         SSPCON1,SSPEN                                            ;

                                                           nop                                                                                 ;

                                                           bsf         SSPCON1,SSPEN                                            ;             

                                                          

                                                           movf     SSPCON2,w                                                    ; скопировать регистр в аккумулятор

                                                           andlw   0x1F                                                                 ; операцией and избавиться от 3 старших разрядов

                                                           btfss      STATUS,Z                                                         ; тестировать результат на ноль

                                                           bra         cojid                                                                 ; если не ноль, повторить тестирование

                              return

;============================================================================================

b_start_w                                         ; формирования начала START для записи      

                                                           bcf         ER_I2C                                                              ;

                                                           call         i2c_idle                                                            ; ожидание окончания активности

                                                           bsf         SSPCON2,SEN                                                ; формирование бита СТАРТ

                                                           btfsc      SSPCON2,SEN                                                ; ожидание окончания формирования бита старт

                                                           bra         $-2        

; формирования передачи адреса устройства (цикл последующая запись)

                                                           call         i2c_idle                                                            ; ожидание окончания активности

                                                           bcf         adres,0                                                            ; установить  в "0" бит 0 (признак записи)

                                                           movf     adres,w                                                           ; загрузить адрес ведомого по шине I2C

                                                           movwf  SSPBUF                                                            ; в буфер

                                                           call         i2c_idle                                                            ; ожидание окончания активности

                                                           btfss      SSPCON2,ACKSTAT                                        ; проверка подтверждения от устройства о получении адреса

               return                                                                                                                         ; выход если нет ошибки

                                                           bsf         SSPCON2,PEN                                                 ; нет подтвержения о приеме адреса формировать стоп

                                                           btfsc      SSPCON2,PEN                                                ; ожидание окончания формирования бита стоп

                                                           bra         $-2                                                                    ;

                                                           bsf         ER_I2C                                                              ; выход с ошибкой "нет ответа от устройства" при попытке записи

               return

;============================================================================================

b_start_r                                          ; формирования начала START для чтения

                                                           bcf         ER_I2C                                                              ;

                                                           call         i2c_idle                                                            ; ожидание окончания активности

                                                           bsf         SSPCON2,SEN                                                ; формирование бита СТАРТ

                                                           btfsc      SSPCON2,SEN                                                ; ожидание окончания формирования бита старт

                                                           bra         $-2        

; формирования передачи адреса устройства (цикл последующая запись)

                                                           call         i2c_idle                                                             ; ожидание окончания активности

                                                           bsf         adres,0                                                            ; установить  в "1" бит 0 (признак чтения)

                                                           movf     adres,w                                                            ; загрузить адрес ведомого по шине I2C

                                                           movwf  SSPBUF                                                            ; в буфер

                                                           call         i2c_idle                                                            ; ожидание окончания активности

                                                           btfss      SSPCON2,ACKSTAT                                       ; проверка подтверждения от устройства о получении адреса

               return                                                                                                                         ; выход если нет ошибки

                                                           bsf         SSPCON2,PEN                                                 ; нет подтвержения о приеме адреса формировать стоп

                                                           btfsc      SSPCON2,PEN                                                ; ожидание окончания формирования бита стоп

                                                           bra         $-2                                                                    ;

                                                           bsf         ER_I2C                                                              ; выход с ошибкой "нет ответа от устройства" при попытке записи

               return

;============================================================================================

b_restart_w                      ; формирования повтоного начала для записи

                                                           btfsc      ER_I2C                                                             ; ошибка прервать работу

                                            return                                                                                                          ;

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           bsf         SSPCON2,RSEN                               ; повторный рестарт

                                                           btfsc      SSPCON2,RSEN                               ; ожидания окончания формирования рестарта

                                                           bra         $-2        

; формирования передачи адреса устройства (цикл последующая запись)

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           bcf         adres,0                                              ; установить  в "0" бит 0 (признак записи)

                                                           movf     adres,w                                             ; загрузить адрес ведомого по шине I2C

                                                           movwf  SSPBUF                                             ; в буфер

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           btfss      SSPCON2,ACKSTAT                         ; проверка подтверждения от устройства о получении адреса

               return                                                                                                           ; выход если нет ошибки

                                                           bsf         SSPCON2,PEN                                  ; нет подтвержения о приеме адреса формировать стоп

                                                           btfsc      SSPCON2,PEN                                  ; ожидание окончания формирования бита стоп

                                                           bra         $-2                                                     ;

                                                           bsf         ER_I2C                                               ; выход с ошибкой "нет ответа от устройства" при попытке записи

               return

;============================================================================================

b_restart_r                        ; формирования повторного начала для чтения

                                                           btfsc      ER_I2C                                              ; ошибка прервать работу

                                            return                                                                             ;

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           bsf         SSPCON2,RSEN                               ; повторный рестарт

                                                            btfsc      SSPCON2,RSEN                               ; ожидания окончания формирования рестарта

                                                           bra         $-2        

; формирования передачи адреса устройства (цикл последующая запись)

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           bsf         adres,0                                              ; установить  в "1" бит 0 (признак чтения)

                                                           movf     adres,w                                             ; загрузить адрес ведомого по шине I2C

                                                           movwf  SSPBUF                                              ; в буфер

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           btfss      SSPCON2,ACKSTAT                         ; проверка подтверждения от устройства о получении адреса

               return                                                                                                           ; выход если нет ошибки

                                                           bsf         SSPCON2,PEN                                  ; нет подтвержения о приеме адреса формировать стоп

                                                           btfsc      SSPCON2,PEN                                  ; ожидание окончания формирования бита стоп

                                                           bra         $-2                                                     ;

                                                           bsf         ER_I2C                                               ; выход с ошибкой "нет ответа от устройства" при попытке записи

               return

;============================================================================================

i2c_write                           ; формирования записи байта в устройство

                                                           btfsc      ER_I2C                                              ; ошибка прервать работу

                                            return                                                                             ;

                                                           movwf  regisr                                                 ;

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           movff   regisr,SSPBUF                                  ; загрузить данные в буфер передачи          

                                                           bcf         PIR1,SSPIF                                        ; сброс бита окончания формирования операции шины I2C

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           btfss      SSPCON2,ACKSTAT                         ; проверка подтверждения от устройства о получении адреса

               return                                                                                                           ; выход если нет ошибки

                                                           bsf         SSPCON2,PEN                                  ; нет подтвержения о приеме адреса формировать стоп

                                                           btfsc      SSPCON2,PEN                                  ; ожидание окончания формирования бита стоп

                                                           bra         $-2                                                     ;

                                                           bsf         ER_I2C                                               ; выход с ошибкой, если нет ответа от устройства

               return

;============================================================================================

i2c_read_ack                    ; формирования чтения байта из устройства с подтверждением приема

                                                           btfsc      ER_I2C                                              ; ошибка прервать работу

                                            return                                                                             ;

                                                           bsf         SSPCON2,RCEN                               ; начать прием данных

                                                           btfss      SSPSTAT,BF                                      ; проверить происходит ли передача данных

                                                           bra         $-2                                                     ; если происходит, то ожидать                                                        

                                                           bcf         SSPCON2,ACKDT                             ; установить бит подтвеждения приема

                                                           bsf         SSPCON2,ACKEN                             ; начать формировать бит

                                                           btfsc      SSPCON2,ACKEN                             ; ожидать окончания формирования бита

                                                           bra         $-2

                                                           movf     SSPBUF,w                                         ; чтение буфера запись в переменную

               return

;============================================================================================

i2c_read_noack               ; формирования чтения байта из устройства с не_подтверждением приема

                                                           btfsc      ER_I2C                                              ; ошибка прервать работу

                                            return                                                                             ;

                                                           bsf         SSPCON2,RCEN                               ; начать прием данных

                                                           btfss      SSPSTAT,BF                                      ; проверить происходит ли передача данных

                                                           bra         $-2                                                     ; если происходит, то ожидать

                                                           bsf         SSPCON2,ACKDT                             ; установить бит не_подтвеждения приема

                                                           bsf         SSPCON2,ACKEN                             ; начать формировать бит

                                                           btfsc      SSPCON2,ACKEN                             ; ожидать окончания формирования бита

                                                           bra         $-2

                                                           movf     SSPBUF,w                                         ; чтение буфера запись в переменную

               return

;============================================================================================

;============================================================================================

b_stop                                ; формировать бит стоп

                                                           call         i2c_idle                                             ; ожидание окончания активности

                                                           bsf         SSPCON2,PEN                                  ; формировать бит стоп

                                                           btfsc      SSPCON2,PEN                                  ; ожидание окончания формирования бита стоп

                                                           bra         $-2                                                     ;

;                                                          clrf         ercode                                               ; очистить регистр ошибок

               return

;============================================================================================

 


Для получения дополнительной информации используйте:

MAGETEX
Ukraine
Телефон: +380-50-575-98-63
Факс: +380-50-575-98-63
Интернет: invent-systems@ya.ru
 

Главная | Назад
 
Отправить сообщение для: gchernov@mail.ru с вопросами и замечаниями об этом веб-узле.
© 2007 MAGETEX
Дата изменения: 23.08.2013