//=Библиотека внешних функций i2c=, РадиоХобби, №5-2005  =1
#include <avr/io.h>            //Библиотека ввода-вывода =2
#define SCL  PB0   //Условное имя для линии PB0 шины I2C =3
#define SDA  PB1   //Условное имя для линии PB1 шины I2C =4
#define TIME 10         //Константа для задержки времени =5
//---------------Функция задержки времени--------------- =6
void pause(void)        //Фиксированная во времени пауза =7
{ static unsigned char p;              //Счетчик времени =8
  for (p=TIME; p > 0; p--);  //Задержка на TIME-итераций =9
  return;            //Возврат после выполнения функции =10
}                           //Окончание функции "pause" =11
//-------------Функция старта для шины I2C------------- =12
void i2start(void)             //Команда START шины I2C =13
{ DDRB &= ~_BV(SDA) & ~_BV(SCL);     //SDA, SCL - входы =14
  PORTB &= ~_BV(SDA) & ~_BV(SCL); //SDA,SCL-имитация ОК =15
		pause();                 //Пауза с лог.1 на SCL и SDA =16
  DDRB |= _BV(SDA);            //Установка лог.0 на SDA =17
  pause();      //Пауза для лог.0 на SDA и лог.1 на SCL =18
  DDRB |= _BV(SCL);            //Установка лог.0 на SCL =19
  pause();                 //Пауза с лог.0 на SCL и SDA =20
  return;            //Возврат после выполнения функции =21
}                         //Окончание функции "i2start" =22
//-----------Функция записи байта по шине i2c---------- =23
void i2write(unsigned char bw) //Команда WRITE шины I2C =24
{ unsigned char k, m;        //Вспомогательные счетчики =25
  for (k=0; k < 8; k++)         //Смена 8 битов в байте =26
  { m = 0x01 & (bw >> (7-k));      //Сдвиг битов вправо =27
    if (m == 0) DDRB |= _BV(SDA);    //Бит лог.0 на SDA =28
	   else DDRB &= ~_BV(SDA);    //Иначе бит лог.1 на SDA =29
    pause();                //Пауза перед импульсом SCL =30
    DDRB &= ~_BV(SCL); pause();  //Импульс лог.1 на SCL =31
    DDRB |= _BV(SCL); pause();   //Пауза с лог.0 на SCL =32
  }                //Переход к передаче следующего бита =33
  return;            //Возврат после выполнения функции =34
}                         //Окончание функции "i2write" =35
//---------Функция проверки бита подтверждения--------- =36
unsigned char i2ack(void)        //Команда ACK шины I2C =37
{ unsigned char check=0;    //Бит подтверждения в норме =38
  DDRB &= ~_BV(SDA); pause();    //Пауза с лог.1 на SDA =39
  DDRB &= ~_BV(SCL); pause();    //Импульс лог.1 на SCL =40
  if (bit_is_set(PINB,SDA)) check++;      //Если ошибка =41
  DDRB |= _BV(SCL); pause();     //Пауза с лог.0 на SCL =42
  return (check);   //Возврат "0" (норма), "1" (ошибка) =43
}                           //Окончание функции "i2ack" =44
//--------Функция завершения работы с шиной I2C-------- =45
void i2stop(void)               //Команда STOP шины I2C =46
{ DDRB |= _BV(SDA); pause();   //Пауза с лог.0 SDA, SCL =47
  DDRB &= ~_BV(SCL);           //Установка лог.1 на SCL =48
		pause();        //Пауза с лог.0 на SDA и лог.1 на SCL =49
  DDRB &= ~_BV(SDA); pause();  //Пауза с лог.1 SDA, SCL =50
  return;            //Возврат после выполнения функции =51
}                          //Окончание функции "i2stop" =52
