Пт янв 11, 2013 13:30:50
Пт янв 11, 2013 13:50:36
define I2C_DELAY 40 //ms
#define debug
//*** Формирование старт-бита
// <-- если 0 - линия занята, иначе - передан старт
unsigned char i2c_start (void)
{
unsigned char Res = 1;
CBI(I2C_DDR, I2C_SDA);
if (GBI(I2C_PIN, I2C_SDA)) // проверка на ошибку линии
{
// устанавливаем лог 1 на линии SCL за счет подтягивающих резисторов
CBI(I2C_DDR, I2C_SCL);
CBI(I2C_PORT, I2C_SCL);
delay_us(I2C_DELAY);
// устанавливаем лог 0 на линии SDA за счет защелки
SBI(I2C_DDR, I2C_SDA);
CBI(I2C_PORT, I2C_SDA);
delay_us(I2C_DELAY);
// устанавливаем лог 0 на линии SCL за счет защелки
SBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
}
else
Res = 0;
return Res;
}
//*** Формирование стоп-бита
void i2c_stop (void)
{
// устанавливаем лог 0 на линии SDA за счет подтягивающих резисторов
SBI(I2C_DDR, I2C_SDA);
CBI(I2C_PORT, I2C_SDA);
delay_us(I2C_DELAY);
// устанавливаем лог 1 на линии SCL за счет защелки
SBI(I2C_DDR, I2C_SCL);
CBI(I2C_PORT, I2C_SCL);
delay_us(I2C_DELAY);
// устанавливаем лог 1 на линии SDA за счет защелки
CBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
}
unsigned char i2c_write_byte(u8 Data)
{
unsigned char Res = 0;
CBI(I2C_PORT, I2C_SCL);
CBI(I2C_PORT, I2C_SDA);
for (u8 i = 0; i < 8; i++)
{
SBI(I2C_DDR, I2C_SDA);
if (Data & 0x80)
CBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
// устанавливаем лог 1 на линии SCL за счет подтягивающих резисторов
CBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
// устанавливаем лог 0 на линии SCL за счет подтягивающих резисторов
SBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
Data <<= 1;
}
CBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
// устанавливаем лог 1 на линии SCL за счет подтягивающих резисторов
CBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
Res = GBI(I2C_PIN, I2C_SDA);
// устанавливаем лог 0 на линии SCL за счет подтягивающих резисторов
SBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
SBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
return Res;
}
//*** Чтение байта из I2C
// --> Ack > 0 - генерировать, иначе - нет
// <-- принятые данные
unsigned char i2c_read_byte(u8 Ack)
{
unsigned char Res=0;
CBI(I2C_DDR, I2C_SDA);
CBI(I2C_PORT, I2C_SDA);
for(u8 x=0; x<8; x++)
{
Res <<= 1;
CBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
if(GBI(I2C_PIN, I2C_SDA))
Res |= 1;
SBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
}
if(Ack)
SBI(I2C_DDR, I2C_SDA);
else
CBI(I2C_DDR, I2C_SDA);
delay_us(I2C_DELAY);
CBI(I2C_DDR, I2C_SCL);
delay_us(I2C_DELAY);
SBI(I2C_DDR, I2C_SCL);
CBI(I2C_DDR, I2C_SCL);
return Res;
}
//*** Инициализация интерфейса I2C
void i2c_init( void )
{
CBI(I2C_DDR, I2C_SDA);
CBI(I2C_DDR, I2C_SCL);
CBI(I2C_PORT, I2C_SDA);
CBI(I2C_PORT, I2C_SCL);
}
Пт янв 11, 2013 14:24:22
Пт янв 11, 2013 14:25:07
//#######################################################################################################################
//#
//# ФУНКЦИИ РАБОТЫ С ЧАСАМИ DS1307
//#
//#######################################################################################################################
//ФУНКЦИЯ ЧТЕНИЯ БЛОКА ДАННЫХ ИЗ МИКРОСХЕМЫ ЧАСОВ DS1307
//чтение происходит в глобальный массив ClockData[7]
//последовательность данных - [0]секунды, [1]минуты, [2]часы, [3]день, [4]дата, [5]месяц, [6]год
void IICClockReadData (void)
{
IICStart();
IICByteWrite (0xD0); //запись данных в DS1307
IICByteWrite (0x00); //сбросить указатель адреса DS1307 на 0
IICStart();
IICByteWrite (0xD1); //команда на чтение данных
char temp = IICByteRead (0); //читсем секунды с выдачей подтверждения (0)
if (temp != ClockData[0]){
ClockData[0] = temp;
//вызов процедур 1 раз\сек
ClockMiliSecond = 0; //обнулить милисекунды
}
char* pClockData = &ClockData[1]; //указатель на данные часов
for (char i = 0; i<5; i++)
*pClockData++ = IICByteRead (0); //пишем, минуты, часы, день, дата, месяц (с выдачей подтверждением)
*pClockData = IICByteRead (1); //пишем год (без подтверждения)
IICStop();
}
//ФУНКЦИЯ ЗАПИСИ БЛОКА ДАННЫХ В МИКРОСХЕМУ ЧАСОВ DS1307
//запись происходит из глобального массива ClockData[7]
//последовательность данных - [0]секунды, [1]минуты, [2]часы, [3]день, [4]дата, [5]месяц, [6]год
void IICClockWriteData (void)
{
IICStart();
IICByteWrite (0xD0); //запись данных в DS1307
IICByteWrite (0x00); //сбросить указатель адреса DS1307 на 0
for (unsigned char i = 0; i<7; i++)
IICByteWrite (ClockData [i]); //пишем, секунды, минуты, часы, день, дата, месяц, год
IICStop();
}
#define IICDDR DDRC /*порт управления I2C*/
#define IICPORT PORTC /*порт вывода данных на линию I2C*/
#define IICPIN PINC /*порт ввода данных с линий I2C*/
#define IICData (1<<4) /*линия DATA*/
#define IICClc (1<<5) /*линия CLC*/
//#######################################################################################################################
//#
//# ФУНКЦИИ ОБСЛУЖИВАНИЯ ИНТЕРФЕЙСА I2C (софтовый вариант)
//#
//#######################################################################################################################
//задержка 2 микросекунды для формированя временных задержек IIC
NOINLINE void Delay2Mks (void)
{
_delay_us (2);
}
//ФУНКЦИЯ ФОРМИРОВАНИЯ СОСТОЯНИЯ START ПО ИНТЕРФЕЙСУ IIC
void IICStart (void)
{
IICDDR &= ~(IICData | IICClc);
Delay2Mks();
IICDDR |= IICData; //подтяжка data к нулю
Delay2Mks();
IICDDR |= IICClc; //подтяжка clc к нулю
Delay2Mks();
}
//ФУНКЦИЯ ФОРМИРОВАНИЯ СОСТОЯНИЯ STOP ПО ИНТЕРФЕЙСУ IIC
void IICStop (void)
{
IICDDR |= (IICData | IICClc);
Delay2Mks();
IICDDR &= ~IICClc; //подтяжка data к нулю
Delay2Mks();
IICDDR &= ~IICData; //подтяжка clc к нулю
Delay2Mks();
}
//ФУНКЦИЯ ЗАПИСИ БАЙТА ПО ИНТЕРФЕЙСУ IIC
//АРГУМЕНТ - байт данных для вывода по IIC
//ЗНАЧЕНИЕ - флаг подтверждения 0 (есть подтверждение) или 1 (нет подтверждения)
char IICByteWrite (char byte)
{
for (char i = 0; i<8; i++)
byte = IICBit (byte);
byte = 0x80;
return IICBit (byte); //возвращаем бит подтверждения (0-есть бит подтверждения, 1-нет)
}
//ФУНКЦИЯ ЧТЕНИЯ БАЙТА ПО ИНТЕРФЕЙСУ IIC
//АРГУМЕНТ - значение бита подтверждения (0 - есть подтверждение, 1 - нет подтверждения)
//ЗНАЧЕНИЕ - принятый байт
char IICByteRead (char bit)
{
char byte = 0xFF;
for (char i = 0; i<8; i++)
byte = IICBit (byte);
bit <<= 7;
IICBit (bit); //передать значение бита подтверждения
return byte; //возвращаем принятый байт
}
//ФУНКЦИЯ ЗАПИСИ\ЧТЕНИЯ БИТА ПО ИНТЕРФЕЙСУ IIC
//выводится значение старшего бита аргумента
//принятый бит возвращается в младшем бите предварительно сдвинутого влево аргумента
char IICBit (char byte)
{
if (byte & 0x80) //выводимый бит
IICDDR &= ~IICData; //вывод 1 на линию данных
else
IICDDR |= IICData; //вывод 0 на линию данных
Delay2Mks();
IICDDR &= ~IICClc; //старт строб импульса
while (! (IICPIN & IICClc)){} //ожидание формирования строба
Delay2Mks();
char temp;
if (IICPIN & IICData) //принимаем бит
temp = 1;
else
temp = 0;
IICDDR |= IICClc; //завершить строб
byte <<= 1;
byte |= temp;
return byte;
}
Пт янв 11, 2013 14:28:09
Пт янв 11, 2013 14:33:30
Пт янв 11, 2013 15:23:31
Пт янв 11, 2013 15:32:29
Пт янв 11, 2013 15:32:57
Пт янв 11, 2013 16:13:22
Пт янв 11, 2013 16:54:48
Пт янв 11, 2013 17:32:30
Пт янв 11, 2013 17:50:56
Пт янв 11, 2013 23:13:54
Сб янв 12, 2013 00:56:19
Пт янв 18, 2013 17:46:22
Пт янв 18, 2013 19:09:14
Сб янв 19, 2013 05:00:23
Сб янв 19, 2013 09:58:08
Сб янв 19, 2013 14:32:51