;===========================================================================
;				I2C bus hard driver
;
;===========================================================================
; 			Настройка скорости работы I2C
;---------------------------------------------------------------------------
IIC_init:
		ldi temp,5				;TWBR =((8000000/300000)-16)/(2*4^0)=5 300кГц
	;	ldi temp,32				;TWBR =((8000000/100000)-16)/(2*4^0)=32 100кГц
		OUT TWBR,temp			; частота работы 300кГц при F кварца 8 мГц
		ldi temp, (0<<TWPS1)|(0<<TWPS0) 
		OUT TWSR,temp			;Коэфф. предделителя TWI равен 1 (TWPS=0)
		ret

;===========================================================================
; 				Отправка стартовой посылки
;---------------------------------------------------------------------------
IIC_Start:
		ldi temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) ;Отправляем стартовую посылку
		OUT TWCR,temp
		rcall iic_wait					; Ожидаем, пока передатчик выполнит
		ret

;===========================================================================
; 				Отправка стоповой посылки 
;---------------------------------------------------------------------------
IIC_Stop:
	ldi temp,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)	;Отправляем стоповую посылку
	OUT TWCR,temp
	ret

;===========================================================================
; 				Приём байта. Принятый байт помещается в temp
;---------------------------------------------------------------------------
iic_recieve:
	ldi temp,(1<<TWINT)|(1<<TWEN)|(1<<TWEA)	;Настраиваем передатчик
	OUT TWCR,temp
	rcall iic_wait							;Ожидаем, пока передатчик выполнит
	in temp,TWDR							;Считываем байт
	ret

;===========================================================================
; 		Приём последнего байта (без ACK). Принятый байт помещается в temp
;---------------------------------------------------------------------------
iic_recieve_lst:
	ldi temp,(1<<TWINT)|(1<<TWEN)	; Настраиваем передатчик
	OUT TWCR,temp					;
	rcall iic_wait					; Ожидаем, пока передатчик выполнит ЭКШН
	in temp,TWDR					; Считываем байт
	ret

;===========================================================================
; 			Отправка байта. Передаваемый байт помещается в temp
;---------------------------------------------------------------------------
iic_send:
	out TWDR,temp					; Отправляем байт
	ldi temp,(1<<TWINT)|(1<<TWEN)	; Настраиваем передатчик
	OUT TWCR,temp					; 
	rcall iic_wait					; Ожидаем, пока передатчик выполнит ЭКШН
	ret

;===========================================================================
; 					Ожидание готовности передатчика
;---------------------------------------------------------------------------
IIC_Wait:
	in temp,TWCR			; Берём значение из TWCR и помещаем в temp
	sbrs temp,TWINT			; Пока флаг прерывания в 1 - идёт передача
	rjmp IIC_Wait			; Как только обнулился, выходим из подпрограммы
	ret
;===========================================================================


.EXIT
