1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| #include <avr/io.h>
#define RTC_ADDRESS 0b1101000 //7-bit DS1307 address
unsigned char Data[10];
unsigned char SLA_R,SLA_W;
void Initialize(unsigned char TWISlaveAddress)
{
SLA_R = ((TWISlaveAddress << 1) | 0x01);
SLA_W = (TWISlaveAddress << 1);
TWBR = 50; //By default prescalar is 1, TWSR_TWPS1 = 0, TWSR_TWPS0 = 0
TWCR = (1 << TWEN);
}
void Read(unsigned char TWIReadStartAddress, unsigned char TWIReadByteCount, unsigned char *TWIDestinationArrayR)
{
TWCR |= (1 << TWINT) | (1 << TWSTA); //Send START
while (!(TWCR & (1 << TWINT))); //Wait until TWINT = 1
if ((TWSR & 0xF8) == 0x08) //START sent
PORTA |= (1 << PA0);
TWDR = SLA_W;
TWCR |= (1 << TWINT); //Clear TWINT to send SLA_W
while (!(TWCR & (1 << TWINT))); //Wait until TWINT = 1
if ((TWSR & 0xF8) == 0x18) //SLA_W transmitted, ACK received
PORTA |= (1 << PA1);
TWDR = TWIReadStartAddress;
TWCR |= (1 << TWINT); //Clear TWINT to send Address
while (!(TWCR & (1 << TWINT))); //Wait until TWINT = 1
if ((TWSR & 0xF8) == 0x28) //Data byte transmitted, ACK received
PORTA |= (1 << PA2);
//Repeated START
TWCR |= (1 << TWINT) | (1 << TWSTA); //Send Repeated START
while (!(TWCR & (1 << TWINT))); //Wait until TWINT = 1
PORTB = (TWSR & 0xF8);
if ((TWSR & 0xF8) == 0x10) //Repeated START transmitted
PORTA |= (1 << PA3);
TWDR = SLA_R;
TWCR |= (1 << TWINT); //Clear TWINT to send SLA_R
while (!(TWCR & (1 << TWINT))); //Wait until TWINT = 1
if ((TWSR & 0xF8) == 0x40) //SLA_R transmitted, ACK received
PORTA |= (1 << PA4);
TWCR |= (1 << TWEA); //Return ACK after each byte read
unsigned char TWIReadCount;
for (TWIReadCount = 0; TWIReadCount <= (TWIReadByteCount - 1); TWIReadCount++)
{
TWCR |= (1 << TWINT); //Clear TWINT to read (next) Data
while (!(TWCR & (1 << TWINT))); //Wait until TWINT = 1
if ((TWSR & 0xF8) == 0x50) //Data byte received, ACK returned
{
*TWIDestinationArrayR = TWDR;
TWIDestinationArrayR++;
}
}
PORTA |= (1 << PA5);
TWCR &= (~(1 << TWEA)); //Return NACK after last byte read
TWCR |= (1 << TWINT) | (1 << TWSTO); //Send STOP
while(TWCR & (1 << TWSTO)); //Wait until bus release
PORTA |= (1 << PA6);
}
int main()
{
DDRA = 0xFF;
DDRB = 0xFF;
Initialize(RTC_ADDRESS);
Read(0x01, 6, &Data[0]);
return 0;
} |