-
Notifications
You must be signed in to change notification settings - Fork 0
/
i2c.c
121 lines (97 loc) · 2.25 KB
/
i2c.c
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
This code is based on the BMP085 library by Stefan Sicklinger published on
http://www.sicklinger.com
I am redistributing this modified version under the GNU General Public
License version 3
*/
#ifndef F_CPU
#define F_CPU 16000000L
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <util/twi.h>
#include "i2c.h"
void i2cSetup()
{
// Set the Serial Clock Line prescalar
//
// TWPS1 TWPS0 Prescalar Value
// 0 0 1
// 0 1 4
// 1 0 16
// 1 1 64
TWSR = ((0 << TWPS1) | (0 << TWPS0));
// Set the frequency of the Serial Clock Line to 200 kHz
//
// F_SCL = F_CPU / (16 + 2 * TWBR * (Prescalar Value))
TWBR = 32;
}
void i2cStart(void)
{
// Send start condition
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
}
uint8_t i2cStop(void)
{
uint8_t i = 0; // Time out variable
uint8_t errorCode = 0;
// Transmit stop condition
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
// Wait until stop condition is executed and bus released
while ((TWCR & (1 << TWSTO)) && (i < 90))
{
_delay_us(1);
i++;
}
if (i > 89)
{
_delay_us(1);
errorCode = 100;
}
return errorCode;
}
void i2cSendByte(uint8_t data)
{
// Save data to the TWDR
TWDR = data;
// Begin send
TWCR = (1 << TWINT) | (1 << TWEN);
}
void i2cReadByteACK(void)
{
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA);
}
void i2cReadByteNOACK(void)
{
TWCR = (1 << TWINT) | (1 << TWEN);
}
uint8_t i2cWaitForComplete(void)
{
uint8_t i = 0; // Time out variable
uint8_t errorCode = 0;
// Wait for the i2c interface to complete the operation
while ((!(TWCR & (1 << TWINT))) && (i < 90))
{
_delay_us(1);
i++;
}
if (i > 89)
{
_delay_us(1);
errorCode = 100;
}
return errorCode;
}
uint8_t i2cGetReceivedByte(void)
{
return (uint8_t) TWDR;
}
uint8_t i2cCheckReturnCode(uint8_t expectedErrorCode)
{
uint8_t errorCode = 0;
if ((TWSR & 0xF8) != expectedErrorCode)
{
errorCode = 10;
}
return errorCode;
}