Revision 240c122b
Implemented tiny-twi reading
scout_avr/bom/tiny-twi.c | ||
---|---|---|
24 | 24 |
uint8_t recv_idx; |
25 | 25 |
uint8_t recv_data[RECV_BUF_SIZE]; |
26 | 26 |
slave_rx_t onDataRecieved; |
27 |
uint8_t temp; |
|
27 | 28 |
|
28 | 29 |
static void twi_set_ctr(char n) { |
29 | 30 |
USISR = n; |
... | ... | |
69 | 70 |
state = is_read? SEND_READ_ACK : SEND_WRITE_ACK; |
70 | 71 |
} |
71 | 72 |
|
73 |
static void twi_send_data() { |
|
74 |
twi_set_ctr(0); |
|
75 |
// TODO set USIDR from buffer |
|
76 |
USIDR = ++temp; |
|
77 |
DDRB |= _BV(SDA); |
|
78 |
state = SEND_DATA; |
|
79 |
} |
|
80 |
|
|
81 |
static void twi_recv_ack() { |
|
82 |
twi_set_ctr(14); |
|
83 |
DDRB &= ~_BV(SDA); |
|
84 |
state = RECV_ACK; |
|
85 |
} |
|
86 |
|
|
72 | 87 |
ISR(USI_START_vect) { |
73 | 88 |
twi_start(); |
74 | 89 |
} |
... | ... | |
109 | 124 |
break; |
110 | 125 |
|
111 | 126 |
case SEND_READ_ACK: |
112 |
DDRB &= ~_BV(SDA); |
|
113 |
// TODO write to USIDR |
|
114 |
state = SEND_DATA; |
|
127 |
twi_send_data(); |
|
115 | 128 |
break; |
116 | 129 |
|
117 | 130 |
case SEND_DATA: |
131 |
twi_recv_ack(); |
|
118 | 132 |
break; |
119 | 133 |
|
120 | 134 |
case RECV_ACK: |
135 |
if (input & 1) { |
|
136 |
// received nak |
|
137 |
twi_ready(); |
|
138 |
} else { |
|
139 |
// received ack |
|
140 |
twi_send_data(); |
|
141 |
} |
|
121 | 142 |
break; |
122 | 143 |
} |
123 | 144 |
USISR = _BV(USIOIF) | (USISR & 0xF); |
Also available in: Unified diff