poppy_com
0.1
Poppy2.0 communication library
Main Page
Related Pages
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Enumerations
Enumerator
Pages
poppy-com
hal
stub
hal.c
1
#include "poppy-com/hal/stub/hal.h"
2
#include "poppy-com/inc/i2c_slave.h"
3
4
typedef
enum
{
5
DATA_TX,
6
ADDR_MATCH,
7
DATA_RX,
8
DATA_RXGC,
9
STOP_CATCHED,
10
}status_reg_t;
11
12
// Global variables
13
extern
context_t
ctx;
14
unsigned
char
data_reg;
15
status_reg_t status_reg;
16
unsigned
char
gc = 0;
17
msg_dir_t
dir_cpy;
18
19
20
// I2C Slave mode
21
void
i2c_interrupt(
void
) {
22
// Test if there is really an interrupt
23
switch
(status_reg) {
24
// SLAVE TRANSMITTER MODE
25
case
DATA_TX:
26
// Slave TX callback
27
ctx.
data_cb
(
TX
, &data_reg);
28
break
;
29
30
// SLAVE RECEIVER MODE
31
case
ADDR_MATCH:
32
break
;
33
34
// Data has been received on SLA+W; ACK has been returned.
35
case
DATA_RX:
36
// Slave RX callback
37
ctx.
data_cb
(
RX
, &data_reg);
38
break
;
39
40
// Data has been received on general call;ACK has been returned.
41
case
DATA_RXGC:
42
// Slave RX general call callback
43
ctx.
data_cb
(
RXGC
, &data_reg);
44
break
;
45
46
// OTHER
47
case
STOP_CATCHED:
48
ctx.
data_cb
= idle;
49
ctx.
data_cb
(
END
, &data_reg);
50
default
:
51
break
;
52
}
53
}
54
55
void
hal_init(
void
) {
56
// I2C configuration
57
}
58
59
unsigned
char
i2c_transmit(com_state_t type) {
60
switch
(type) {
61
case
START:
62
status_reg = ADDR_MATCH;
63
i2c_interrupt();
64
break
;
65
case
DATA:
66
case
DATA_NACK:
67
if
(!dir_cpy) {
68
if
(gc) {
69
status_reg = DATA_RXGC;
70
i2c_interrupt();
71
}
else
{
72
status_reg = DATA_RX;
73
i2c_interrupt();
74
}
75
}
else
{
76
status_reg = DATA_TX;
77
i2c_interrupt();
78
}
79
break
;
80
case
STOP:
81
status_reg = STOP_CATCHED;
82
i2c_interrupt();
83
return
0;
84
}
85
// TODO(NR) Timeout
86
return
(0);
87
}
88
89
90
unsigned
char
i2cAddr(
unsigned
char
addr,
msg_dir_t
dir) {
91
if
(addr)
92
gc = 0;
93
else
94
gc = 1;
95
dir_cpy = dir;
96
if
(dir) {
97
addr = (addr << 1) | 0;
98
}
else
{
99
addr = (addr << 1) | 1;
100
}
101
102
i2c_transmit(START);
103
return
0;
104
}
105
106
unsigned
char
i2cWrite(
unsigned
char
data) {
107
data_reg = data;
108
i2c_transmit(DATA);
109
return
0;
110
}
111
112
unsigned
char
i2cRead(
unsigned
char
ack_enable,
unsigned
char
*data) {
113
if
(ack_enable)
114
i2c_transmit(DATA);
115
else
116
i2c_transmit(DATA_NACK);
117
*data = data_reg;
118
return
0;
119
}
120
121
void
id_update(
unsigned
char
id
) {
122
ctx.
id
= id;
123
/*
124
* TORO(NR) : Write this ID on EEPROM and use it as default at
125
* reboot (do this after debug)
126
*/
127
}
128
129
unsigned
char
crc(
unsigned
char
* data,
unsigned
char
size) {
130
unsigned
char
x;
131
unsigned
int
crc = 0xFFFF;
132
133
while
(size--) {
134
x = crc >> 8 ^ *data++;
135
x ^= x>>4;
136
crc = (crc << 8) ^ ((
unsigned
int
)(x << 12))
137
^ ((
unsigned
int)(x <<5))
138
^ ((
unsigned
int
)x);
139
}
140
return
(
unsigned
char
)crc;
141
}
context_t::id
unsigned char id
Definition:
context.h:42
TX
Definition:
poppyNetwork.h:23
RXGC
Definition:
poppyNetwork.h:25
END
Definition:
poppyNetwork.h:26
RX
Definition:
poppyNetwork.h:24
context_t
Definition:
context.h:34
context_t::data_cb
DATA_CB data_cb
Definition:
context.h:36
msg_dir_t
msg_dir_t
Message direction enum.
Definition:
poppyNetwork.h:22
Generated on Fri Aug 5 2016 15:36:17 for poppy_com by
1.8.6