немного кода для софтварного I2C
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено DASM 14 января 2005 г. 18:42
В ответ на: Подскажите где почитать про протокол ds1307 можно? а то что то ничего не могу понять из даташита, совсем что то голова не соображает отправлено nvn 14 января 2005 г. 14:56


#pragma pack (1)
typedef struct {
unsigned char sec;
unsigned char min;
unsigned char hour;
unsigned char day;
unsigned char month;
unsigned char year;
unsigned char control;
} ds1307mem;

typedef struct {
unsigned char hour;
unsigned char min;
unsigned char sec;
} TIME_STR;
#pragma pack ()

extern ds1307mem ds_mem;
extern TIME_STR systime;
void InitDS1307 ();
void ScanDallasProc (void *p);

#define DS1307_ADDR 0xd0

void i2cSendStop()
{
i2cdelay();
SDA_OUT();
SDA_0();
i2cdelay();
SCL_1();
i2cdelay();
SDA_1();
i2cdelay();
}
//
void i2cSendStart()
{
SDA_OUT();
SDA_1();
SCL_1();
i2cdelay();
SDA_0();
i2cdelay();
SCL_0();
i2cdelay();
}
//
unsigned char i2cSendByte(unsigned char data)
{
unsigned char i;
unsigned char res = 1;
SDA_OUT();
i2cdelay();
for (i = 0; i < 8; i++)
{ if (data & (1 << 7))
SDA_1();
else
SDA_0();
i2cdelay();
SCL_1();
i2cdelay();
SCL_0();
i2cdelay();
data <<= 1;
}
SDA_IN();

i2cdelay();
//ask
if (GET_SDA())
res = 0;
SCL_1();
i2cdelay();
SCL_0();
i2cdelay();
return res;
}
//

unsigned char i2cGetByte(char bAsk)
{
unsigned char i;
unsigned char data = 0;
SDA_IN();
i2cdelay();
for (i = 0; i < 8; i++)
{
data <<= 1;
if (GET_SDA())
data |= 1;
SCL_1();
i2cdelay();
SCL_0();
i2cdelay();
}
if (bAsk)
{
SDA_OUT();
SDA_0();
}
else {
SDA_IN();
}

//ask
i2cdelay();
SCL_1();
i2cdelay();
SCL_0();
i2cdelay();
return data;
}
//
void InitDS1307 ()
{
i2cSendStart();
i2cSendByte(DS1307_ADDR);
i2cSendByte (0x0); // CH bit
i2cSendByte (0x0); // CH bit
i2cSendStop();
}

void ReadDS1307 (ds1307mem *pmem)
{
char i;
unsigned char *p = (unsigned char *)pmem;
i2cSendStart();
i2cSendByte(DS1307_ADDR);
i2cSendByte (0x0); // ser reg pointer
i2cSendStop();

i2cSendStart();
i2cSendByte(DS1307_ADDR + 1); // read
for (i = 0; i < (sizeof (ds1307mem) - 1); i++)
{
*p++ = i2cGetByte(1);
}
*p = i2cGetByte(0); // no ask
i2cSendStop();
}

void WriteDS1307 (ds1307mem *pmem)
{
char i;
unsigned char *p = (unsigned char *)pmem;
i2cSendStart();
i2cSendByte(DS1307_ADDR);
i2cSendByte (0x0); // ser reg pointer
for (i = 0; i < (sizeof (ds1307mem)); i++)
{
i2cSendByte(*p++);
}
i2cSendStop();
}

void ConvertTimeFromDS (TIME_STR *pt, ds1307mem *pmem)
{
pt->hour = pmem->hour & 0x1f;
pt->min = 10 * ((pmem->min & 0x70) >> 4) + (pmem->min & 0x0f);
pt->sec = 10 * ((pmem->sec & 0x70) >> 4) + (pmem->sec & 0x0f);
}

void ConvertTimeToDS (ds1307mem *pmem, TIME_STR *pt)
{
pmem->hour = pt->hour & 0x1f;
pmem->min = ((pt->min / 10) << 4)+ pt->min % 10 ;
pmem->sec = ((pt->sec / 10) << 4)+ pt->min % 10 ;
}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru