summaryrefslogtreecommitdiff
path: root/avr/i2c.c
diff options
context:
space:
mode:
authorLeo C2014-09-17 22:23:17 +0200
committerLeo C2014-09-17 22:23:17 +0200
commit04a63b0d5660f1c0c0b7e8123e4f56d188e52a5d (patch)
tree6cecaf46786fe977dee58aa1b72948221c3fe837 /avr/i2c.c
parent6035a17b2becc788c0daaf440deb6cc37d364029 (diff)
downloadz180-stamp-04a63b0d5660f1c0c0b7e8123e4f56d188e52a5d.zip
Disable all peripheral functions globally. Enable used functions when needed.
Diffstat (limited to 'avr/i2c.c')
-rw-r--r--avr/i2c.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/avr/i2c.c b/avr/i2c.c
index dbb5da1..e0e5a19 100644
--- a/avr/i2c.c
+++ b/avr/i2c.c
@@ -1,6 +1,6 @@
-/*
- * I2C (TWI) master interface.
+/*
+ * I2C (TWI) master interface.
*/
#include "common.h"
@@ -48,33 +48,33 @@
* TWSTO: TWI STOP Condition Bit
* TWEN: TWI Enable Bit
* TWIE: TWI Interrupt Enable
- *
+ *
* (1<<TWEN)|(1<<TWIE)|(1<<TWINT)
* (1<<TWEN)|(1<<TWIE)|(1<<TWINT)| (1<<TWEA)
* (1<<TWEN)|(1<<TWIE)|(1<<TWINT)
- *
+ *
* default:
* (1<<TWEN)| (1<<TWINT)| (1<<TWSTO)
- *
+ *
* Init:
* (1<<TWEN)
- *
+ *
* start read/write:
* (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA)
* (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA)
* (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA)
* (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA)
- *
+ *
* wait ready:
* (1<<TWIE)|(1<<TWSTO)
*
*
*
- *i2c_result
+ *i2c_result
*
* 0b10000000 Busy (Transmission in progress)
* 0b01000000 Timeout
- * 0b00001000 Start transmitted
+ * 0b00001000 Start transmitted
* 0b00000100 Slave acknowledged address
* 0b00000010 Data byte(s) transmitted/received
* 0b00000001 Transmission completed
@@ -86,8 +86,8 @@
#define TWI_C_DISABLE 0x00
#define TWI_C_ENABLE (1<<TWEN)
-
-
+
+
typedef struct i2c_msg_s {
uint8_t stat;
#define XMIT_DONE (1<<0)
@@ -114,7 +114,7 @@ ISR(TWI_vect)
tmp_stat = xmit.stat;
uint8_t twsr = TWSR;
-
+
switch (twsr & 0xf8) {
case TWI_START:
@@ -223,7 +223,7 @@ void i2c_init(uint32_t speed)
{
twps = 0;
uint32_t tmp_twbr = F_CPU /2 / speed - 8;
-
+
while (tmp_twbr > 255) {
tmp_twbr >>= 4;
twps += 1;
@@ -231,6 +231,8 @@ void i2c_init(uint32_t speed)
debug_cond((twps > 3), "*** TWCLK too low: %lu Hz\n", speed);
twbr = (uint8_t) tmp_twbr;
+
+ PRR0 &= ~_BV(PRTWI);
_init();
}
@@ -239,7 +241,7 @@ int_fast8_t i2c_waitready(void)
{
uint32_t timer = get_timer(0);
uint8_t timeout = 0;
-
+
do {
if (get_timer(timer) >= 30) {
timeout = TIMEOUT;
@@ -252,7 +254,7 @@ int_fast8_t i2c_waitready(void)
#if DEBUG_I2C
dump_ram((uint8_t *) &xmit, 4, "=== i2c_wait ready: (done)");
_delay_ms(30);
-#endif
+#endif
return xmit.stat;
}
@@ -275,11 +277,11 @@ int i2c_send(uint8_t chip, uint16_t addr, uint8_t alen, uint8_t *buffer, int8_t
for (n = len + i; i < n; i++)
xmit.buf[i] = *buffer++;
xmit.len = i;
-
+
#if DEBUG_I2C
dump_ram((uint8_t *) &xmit, 0x20, "=== i2c_send");
_delay_ms(30);
-#endif
+#endif
/* Enable TWI, TWI int and initiate start condition */
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA);
@@ -339,13 +341,13 @@ int i2c_write(uint8_t chip, unsigned int addr, uint_fast8_t alen,
uint8_t *buffer, uint_fast8_t len)
{
int rc;
-
+
if ((alen > 2) || (1 + alen + len > CONFIG_SYS_I2C_BUFSIZE)) {
debug("** i2c_write: buffer overflow, alen: %u, len: %u\n",
alen, len);
return -1;
}
-
+
i2c_send(chip, addr, alen, buffer, len);
rc = i2c_waitready();
@@ -362,10 +364,10 @@ int i2c_read(uint8_t chip, unsigned int addr, uint_fast8_t alen,
alen, len);
return -1;
}
-
+
if (alen != 0) {
i2c_send(chip, addr, alen, NULL, 0);
- }
+ }
rc = i2c_recv(chip, buffer, len);
return !((rc & (XMIT_DONE|DATA_ACK)) == (XMIT_DONE|DATA_ACK));