poppy_com  0.1
Poppy2.0 communication library
 All Classes Files Functions Variables Enumerations Enumerator Pages
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 }
unsigned char id
Definition: context.h:42
DATA_CB data_cb
Definition: context.h:36
msg_dir_t
Message direction enum.
Definition: poppyNetwork.h:22