X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/35e9ec0c03a150e3fe6a3350549573e4c02be67b..a11e60da10b1065dfcf57bb742670b74784703e2:/avr/i2c.c diff --git a/avr/i2c.c b/avr/i2c.c index 3ab222a..ae2f8da 100644 --- a/avr/i2c.c +++ b/avr/i2c.c @@ -1,11 +1,15 @@ +/* + * (C) Copyright 2014 Leo C. + * + * SPDX-License-Identifier: GPL-2.0+ + */ -/* - * I2C (TWI) master interface. +/* + * I2C (TWI) master interface. */ #include "common.h" #include -#include #include #include "config.h" @@ -13,9 +17,11 @@ #include "debug.h" #include "i2c.h" -#ifdef DEBUG -//# define DEBUG_I2C -#endif +#define DEBUG_I2C 0 + +#define debug_i2c(fmt, args...) \ + debug_cond(DEBUG_I2C, fmt, ##args) + /* General TWI Master status codes */ #define TWI_START 0x08 /* START has been transmitted */ @@ -46,33 +52,33 @@ * TWSTO: TWI STOP Condition Bit * TWEN: TWI Enable Bit * TWIE: TWI Interrupt Enable - * + * * (1< 255) { tmp_twbr >>= 4; twps += 1; @@ -249,9 +236,7 @@ void i2c_init(uint32_t speed) twbr = (uint8_t) tmp_twbr; - debug("*** i2c_init: i2c_speed: %lu, twbr: %u, twps: %u\n", - speed, twbr, twps); - + PRR0 &= ~_BV(PRTWI); _init(); } @@ -260,7 +245,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; @@ -270,14 +255,14 @@ int_fast8_t i2c_waitready(void) xmit.stat |= timeout; -#ifdef DEBUG_I2C +#if DEBUG_I2C dump_ram((uint8_t *) &xmit, 4, "=== i2c_wait ready: (done)"); _delay_ms(30); -#endif +#endif return xmit.stat; } -//static +static int i2c_send(uint8_t chip, uint16_t addr, uint8_t alen, uint8_t *buffer, int8_t len) { uint8_t i, n; @@ -296,11 +281,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; - -#ifdef DEBUG_I2C + +#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< 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(); - debug("** i2c_write: result=0x%02x\n",rc); return (rc & XMIT_DONE) != 0; } @@ -384,15 +368,11 @@ 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); - debug("** i2c_read: result=0x%02x\n",rc); return !((rc & (XMIT_DONE|DATA_ACK)) == (XMIT_DONE|DATA_ACK)); } - - -