1 #ifndef EAGLE_EBOARD_HELPLIB_TWI 2 #define EAGLE_EBOARD_HELPLIB_TWI 17 #define TWI_FREQ 100000L 25 #define TWI_FREQ 100000L 28 #ifndef TWI_BUFFER_LENGTH 29 #define TWI_BUFFER_LENGTH 32 42 uint8_t
twi_readFrom(uint8_t, uint8_t*, uint8_t, uint8_t);
43 uint8_t
twi_writeTo(uint8_t, uint8_t*, uint8_t, uint8_t, uint8_t);
52 #ifndef TWI_BUFFER_LENGTH 53 #define TWI_BUFFER_LENGTH 32 64 #include <avr/interrupt.h> 65 #include <compat/twi.h> 68 #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) 72 #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 75 #include "pins_arduino.h" 77 static volatile uint8_t twi_state;
78 static volatile uint8_t twi_slarw;
79 static volatile uint8_t twi_sendStop;
80 static volatile uint8_t twi_inRepStart;
82 static void (*twi_onSlaveTransmit)(void);
83 static void (*twi_onSlaveReceive)(uint8_t*, int);
86 static volatile uint8_t twi_masterBufferIndex;
87 static volatile uint8_t twi_masterBufferLength;
90 static volatile uint8_t twi_txBufferIndex;
91 static volatile uint8_t twi_txBufferLength;
94 static volatile uint8_t twi_rxBufferIndex;
96 static volatile uint8_t twi_error;
106 twi_inRepStart =
false;
108 digitalWrite(SDA, 1);
109 digitalWrite(SCL, 1);
113 TWBR = ((F_CPU /
TWI_FREQ) - 16) / 2;
115 TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
118 uint8_t
twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sendStop) {
126 twi_sendStop = sendStop;
130 twi_masterBufferIndex = 0;
131 twi_masterBufferLength = length-1;
133 twi_slarw |= address << 1;
135 if (
true == twi_inRepStart) {
136 twi_inRepStart =
false;
138 TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE);
141 TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);
143 while(
TWI_MRX == twi_state)
continue;
145 if (twi_masterBufferIndex < length)
146 length = twi_masterBufferIndex;
148 for(i = 0; i < length; ++i) data[i] = twi_masterBuffer[i];
153 uint8_t
twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait, uint8_t sendStop) {
161 twi_sendStop = sendStop;
164 twi_masterBufferIndex = 0;
165 twi_masterBufferLength = length;
167 for(i = 0; i < length; ++i) twi_masterBuffer[i] = data[i];
169 twi_slarw = TW_WRITE;
170 twi_slarw |= address << 1;
172 if (
true == twi_inRepStart) {
173 twi_inRepStart =
false;
175 TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE);
178 TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA);
180 while(wait && (
TWI_MTX == twi_state))
continue;
182 if (twi_error == 0xFF)
return 0;
183 else if (twi_error == TW_MT_SLA_NACK)
return 2;
184 else if (twi_error == TW_MT_DATA_NACK)
return 3;
188 uint8_t
twi_transmit(
const uint8_t* data, uint8_t length) {
193 if(
TWI_STX != twi_state)
return 2;
195 twi_txBufferLength = length;
196 for(i = 0; i < length; ++i) twi_txBuffer[i] = data[i];
202 twi_onSlaveReceive =
function;
206 twi_onSlaveTransmit =
function;
211 TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA);
213 TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT);
219 TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO);
221 while(TWCR & _BV(TWSTO))
continue;
227 TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);
241 if(twi_masterBufferIndex < twi_masterBufferLength){
242 TWDR = twi_masterBuffer[twi_masterBufferIndex++];
247 twi_inRepStart =
true;
248 TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ;
254 twi_error = TW_MT_SLA_NACK;
257 case TW_MT_DATA_NACK:
258 twi_error = TW_MT_DATA_NACK;
262 twi_error = TW_MT_ARB_LOST;
266 twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
268 if(twi_masterBufferIndex < twi_masterBufferLength)
twi_reply(1);
271 case TW_MR_DATA_NACK:
272 twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
275 twi_inRepStart =
true;
276 TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ;
284 case TW_SR_GCALL_ACK:
285 case TW_SR_ARB_LOST_SLA_ACK:
286 case TW_SR_ARB_LOST_GCALL_ACK:
288 twi_rxBufferIndex = 0;
292 case TW_SR_GCALL_DATA_ACK:
294 twi_rxBuffer[twi_rxBufferIndex++] = TWDR;
300 if(twi_rxBufferIndex <
TWI_BUFFER_LENGTH) twi_rxBuffer[twi_rxBufferIndex] =
'\0';
302 twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex);
303 twi_rxBufferIndex = 0;
306 case TW_SR_DATA_NACK:
307 case TW_SR_GCALL_DATA_NACK:
311 case TW_ST_ARB_LOST_SLA_ACK:
313 twi_txBufferIndex = 0;
314 twi_txBufferLength = 0;
315 twi_onSlaveTransmit();
316 if(0 == twi_txBufferLength){
317 twi_txBufferLength = 1;
318 twi_txBuffer[0] = 0x00;
321 TWDR = twi_txBuffer[twi_txBufferIndex++];
322 if(twi_txBufferIndex < twi_txBufferLength)
twi_reply(1);
325 case TW_ST_DATA_NACK:
326 case TW_ST_LAST_DATA:
334 twi_error = TW_BUS_ERROR;
void twi_releaseBus(void)
void twi_setAddress(uint8_t)
uint8_t twi_transmit(const uint8_t *, uint8_t)
uint8_t twi_readFrom(uint8_t, uint8_t *, uint8_t, uint8_t)
void twi_setFrequency(uint32_t)
uint8_t twi_writeTo(uint8_t, uint8_t *, uint8_t, uint8_t, uint8_t)
#define TWI_BUFFER_LENGTH
void twi_attachSlaveRxEvent(void(*)(uint8_t *, int))
void twi_attachSlaveTxEvent(void(*)(void))