eedatap = 0x00; //seconds;
i2cSend(0xD0, 0x00, 1, 1, &eedatap);
ms_spin(5);
eedatap = RtcTime.minutes;
i2cSend(0xD0, 0x01, 1, 1, &eedatap);
ms_spin(5);
eedatap = RtcTime.hours;
i2cSend(0xD0, 0x02, 1, 1, &eedatap);
ms_spin(5);
eedatap = RtcTime.day;
i2cSend(0xD0, 0x04, 1, 1, &eedatap);
ms_spin(5);
eedatap = RtcTime.month;
i2cSend(0xD0, 0x05, 1, 1, &eedatap);
ms_spin(5);
eedatap = (RtcTime.year - 2000);
i2cSend(0xD0, 0x06, 1, 1, &eedatap);
Праща се пакет с два адреса - D0 адрес на DS1307 и веднага след това адрес минути, секунди, те са описани. за данни е ясно какво пращаш.
самото пращане:
//! Send a byte sequence on the I2C bus
void i2cSend(u08 device, u16 subAddr,u08 addrlength, u08 length, u08 *data)
{
I2C_START; // старт кондишън
i2cPutbyte(device); // адрес на устройството
if (addrlength == 2) i2cPutbyte(subAddr >>

; // and the subaddress ако е 2 байта, а той не е !!!
if (addrlength > 0) i2cPutbyte(subAddr); // and the subaddress low byte
// send the data
while (length--) //докато свършат байтовете данни, пращай
i2cPutbyte(*data++);
I2C_SDL_LO; // clear data line and
I2C_STOP; // send STOP transition
}
Старт и стоп кондишън и i2cPutbyte ти ги оставям за домашно. Ако не се справиш ще ти пратя и i2cPutbyte.
Всъщност програмата е за АТМЕГА, но принципа си е същия.
По същия начин четене:
i2cReceive(0xD0, 0x00, 1, 1, &eedatap);
RtcTime.seconds = eedatap;
i2cReceive(0xD0, 0x01, 1, 1, &eedatap);
RtcTime.minutes = eedatap;
i2cReceive(0xD0, 0x02, 1, 1, &eedatap);
RtcTime.hours = eedatap;
i2cReceive(0xD0, 0x04, 1, 1, &eedatap);
RtcTime.day = eedatap;
i2cReceive(0xD0, 0x05, 1, 1, &eedatap);
RtcTime.month = eedatap;
i2cReceive(0xD0, 0x06, 1, 1, &eedatap);
RtcTime.year = eedatap + 2000;