[an error occurred while processing this directive]
|
Адаптация под USI старой атымеловской аппноты по программной реализации I2C (AVR триста какой-то):
[pre] ;*Ожидание освобождения линии SCL ведомым устройством ;*Передача байта по I2C ;* Передача условия СТОП. ;*Освобождение порта после обмена по I2C. in temp2,i2cport .exit
E-mail:
info@telesys.ru
;*Настройка порта для обмена по I2C.
seep_init:
ldi temp1,(1<
ldi temp1,0xFF
out usidr,temp1
in temp1,i2cport ; Регистры данных и направления
ori temp1,(1<
ori temp2,(1<
out i2cport-1,temp2 ; SDAP,SCLP - ODoutputs
sbi usisr,USISIF ; Release SCL by "Start" detector
ret
wait_SCL_high:
sbis I2CPORT-2,SCLP
rjmp wait_SCL_high
small_delay:
ret
;*Передача повторного условия СТАРТ и адреса ведомого.
i2c_rep_start:
cbi I2CPORT,SCLP ; SCL = 0
sbi I2CPORT,SDAP ; SDA = Z
sbi I2CPORT,SCLP ; SCL = Z
rcall wait_SCL_high ; Ожидание освобождения SCL
rcall small_delay
cbi I2CPORT,SDAP ; SDA = 0 ( старт )
rcall small_delay
i2c_write:
out usidr,usi_data
ldi temp1,0xF0 ; Release SCL by "Start"
out usisr,temp1 ; detector and clear counter
cbr usi_stat,(1<
cbi I2CPORT,SCLP ; Тактирование USI
sbi I2CPORT,SDAP ; Release SDA by port - set data by USIDR
rcall small_delay
sbi I2CPORT,SCLP
rcall wait_SCL_high
sbrs usi_stat,i2c_complete ; Обмен завершён?
rjmp i2c_clock
in usi_data,usidr
i2c_ack:
cbi I2CPORT,SCLP ; SCL = 0
sbrc usi_stat,i2c_ack_get ; Если чтение - выдать
rjmp get_ack ; если передача - получить "ACK"
brcs i2c_put_ack_high ; если C=1
cbi I2CPORT,SDAP ; иначе SDA = 0
get_ack:
i2c_put_ack_high:
ldi temp1,0xFF ; Release SDA by USIDR
out usidr,temp1
rcall small_delay
sbi I2CPORT,SCLP ; SCL = Z
rcall wait_SCL_high ; Ожидание освобождения SCL
clc
sbic I2CPORT-2,SDAP ; если SDA = 1
sec ; установить "С"
ret
seep_stop:
cbi I2CPORT,SCLP ; SCL = 0
cbi I2CPORT,SDAP ; SDA = 0
rcall small_delay
sbi I2CPORT,SCLP ; SCL = Z
rcall wait_SCL_high ; Ожидание освобождения SCL
rcall small_delay
sbi I2CPORT,SDAP ; SDA = Z
ret
seep_rel:
ldi temp1,0x0
out usicr,temp1 ; Запрещение USI/I2C
ret
[/pre]
ldi temp1,(1<
and temp2,temp1
out i2cport,temp2 ; Всё, кроме LED, в Z
rcall put_ret
rjmp waitcmd
Ответы