-
Notifications
You must be signed in to change notification settings - Fork 1
/
i2c_bitbang.c
140 lines (121 loc) · 3.23 KB
/
i2c_bitbang.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "DevelOS.h"
#ifdef MOD_I2C
void I2C_Init(void) // <editor-fold defaultstate="collapsed" desc="void I2C_Init(void)">
{
char i;
i2c_bus.BufPos =0;
i2c_bus.Delay = 0; // calculate for 100kHz here
for(i=0; i<I2C_Buffer;i++)
{
i2c_bus.Buffer[i]=0;
}
}
//</editor-fold>
void I2C_Start(void) // <editor-fold defaultstate="collapsed" desc="void I2C_Start(void)">
// do the start condition
{
SDA_t =0;
SCL_t =0;
SDA =1;
SCL =1;
// wait a moment ...
OS_delay_ns(i2c_bus.Delay);
SDA =0;
// wait another moment
OS_delay_ns(i2c_bus.Delay);
SCL =0;
// start done
} // </editor-fold>
void I2C_Stop(void) // <editor-fold defaultstate="collapsed" desc="void I2C_Stop(void)">
// do the stop condition
{
SDA_t =0;
SCL =1;
// wait
OS_delay_ns(i2c_bus.Delay);
SDA =1;
//wait
OS_delay_ns(i2c_bus.Delay);
// stop done
}//</editor-fold>
unsigned char I2C_ByteIn(char ack) // <editor-fold defaultstate="collapsed" desc="char I2C_ByteIn(char ack)">
// Read a byte from the bus, maybe ack it, return the byte
{
unsigned char byte,i;
byte =0;
// set SDA input
SDA_t = 1;
//clock in 8 bits
for(i=0;i<8;i++)
{
SCL = 1;
OS_delay_ns(i2c_bus.Delay);
if(SDA)
{
byte++;
}
byte = byte << 1;
SCL = 0;
OS_delay_ns(i2c_bus.Delay);
}
// set SDA output
SDA_t = 0;
// set ack/nack
if(ack==1)
{
SDA = 0;
}
else
{
SDA = 1;
}
// clock out the ack bit
SCL = 1;
OS_delay_ns(i2c_bus.Delay);
SCL = 0;
OS_delay_ns(i2c_bus.Delay);
// done, return the byte
return byte;
}//</editor-fold>
unsigned char I2C_ByteOut(char byte) // <editor-fold defaultstate="collapsed" desc="char I2C_ByteOut(char byte)">
// Write a byte to the bus, return the ack
{
unsigned char i,ack;
// set SDA output
SDA_t = 0;
//clock out 8 bits
for(i=0;i<8;i++)
{
SCL = 0;
if(byte & 0x01)
{
SDA = 1;
}
else
{
SDA = 0;
}
byte = byte >> 1;
SCL = 1;
OS_delay_ns(i2c_bus.Delay);
}
// set SDA input
SDA_t = 1;
// clock in ack/nack
SCL = 1;
OS_delay_ns(i2c_bus.Delay);
if(SDA)
{
ack = 0;
}
else
{
ack = 1;
}
SCL = 0;
OS_delay_ns(i2c_bus.Delay);
// done, return ack
return ack;
}
//</editor-fold>
#endif /* MOD_I2C */