|
Подпрограммы на ассемблере для работы с шиной I2C. Для работы с шиной необходимо написать несколько функций.
b_start_w
; формирования начала START для записи 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 ;============================================================================================
Для получения дополнительной информации используйте: |
|