projects
/
bertos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add documentation.
[bertos.git]
/
bertos
/
drv
/
i2c_bitbang.c
diff --git
a/bertos/drv/i2c_bitbang.c
b/bertos/drv/i2c_bitbang.c
index ef7c95851975b7823949392b5059ea0c214e808a..1d7e98d6819c0d7b86ec09829e3ca38cad274455 100644
(file)
--- a/
bertos/drv/i2c_bitbang.c
+++ b/
bertos/drv/i2c_bitbang.c
@@
-32,56
+32,69
@@
*
* \brief I2C bitbang driver (implementation)
*
*
* \brief I2C bitbang driver (implementation)
*
- * \version $Id
: adc.c 1604 2008-08-10 17:19:51Z bernie
$
+ * \version $Id$
* \author Francesco Sacchi <batt@develer.com>
*/
#include "i2c.h"
* \author Francesco Sacchi <batt@develer.com>
*/
#include "i2c.h"
-#include "timer.h"
-#include "hw/hw_i2c_bitbang.h"
+#include "cfg/cfg_i2c.h"
+
+#define LOG_LEVEL I2C_LOG_LEVEL
+#define LOG_FORMAT I2C_LOG_FORMAT
+
+#include <cfg/log.h>
+#include <cfg/macros.h>
+#include <cfg/module.h>
-#define I2C_PERIOD DIV_ROUND(500000UL / CONFIG_I2C_FREQ)
+#include <drv/timer.h>
+#include <cpu/irq.h>
-INLINE bool i2c_start(void)
+#include "hw/hw_i2c_bitbang.h"
+
+INLINE bool i2c_bitbang_start(void)
{
SDA_HI;
SCL_HI;
{
SDA_HI;
SCL_HI;
- timer_udelay(I2C_PERIOD);
- SDA_LOW;
- timer_udelay(I2C_PERIOD);
- return !SDA;
+ I2C_HALFBIT_DELAY();
+ SDA_LO;
+ I2C_HALFBIT_DELAY();
+ ASSERT(!SDA_IN);
+ return !SDA_IN;
}
}
-void i2c_stop(void)
+void i2c_
bitbang_
stop(void)
{
{
+ SDA_LO;
SCL_HI;
SCL_HI;
-
timer_udelay(I2C_PERIOD
);
+
I2C_HALFBIT_DELAY(
);
SDA_HI;
}
SDA_HI;
}
-bool i2c_put(uint8_t _data)
+bool i2c_
bitbang_
put(uint8_t _data)
{
{
+ /* Add ACK bit */
uint16_t data = (_data << 1) | 1;
uint16_t data = (_data << 1) | 1;
- for (uint16_t i = 0x100; i >= 0; i >>= 1)
+
+ for (uint16_t i = 0x100; i != 0; i >>= 1)
{
SCL_LO;
{
SCL_LO;
- timer_udelay(I2C_PERIOD);
if (data & i)
SDA_HI;
else
SDA_LO;
if (data & i)
SDA_HI;
else
SDA_LO;
+ I2C_HALFBIT_DELAY();
+
SCL_HI;
SCL_HI;
- timer_udelay(I2C_PERIOD);
- ASSERT(SDA == (data & i));
+ I2C_HALFBIT_DELAY();
}
}
- bool ack = !SDA;
-
ASSERT(ack)
;
+
+
bool ack = !SDA_IN
;
SCL_LO;
SCL_LO;
-
timer_udelay(I2C_PERIOD
);
+
I2C_HALFBIT_DELAY(
);
return ack;
}
return ack;
}
-bool i2c_start_w(uint8_t id)
+bool i2c_
bitbang_
start_w(uint8_t id)
{
id &= ~I2C_READBIT;
/*
{
id &= ~I2C_READBIT;
/*
@@
-91,26
+104,27
@@
bool i2c_start_w(uint8_t id)
* keep trying until the deveice responds with an ACK.
*/
ticks_t start = timer_clock();
* keep trying until the deveice responds with an ACK.
*/
ticks_t start = timer_clock();
- while (i2c_start())
+ while (i2c_
bitbang_
start())
{
{
- if (i2c_put(id))
+ if (i2c_
bitbang_
put(id))
return true;
return true;
- else if (timer_clock() - start > ms_to_ticks(CONFIG_
TWI
_START_TIMEOUT))
+ else if (timer_clock() - start > ms_to_ticks(CONFIG_
I2C
_START_TIMEOUT))
{
LOG_ERR("Timeout on I2C start write\n");
break;
}
{
LOG_ERR("Timeout on I2C start write\n");
break;
}
+ //LOG_INFO("Rep start\n");
}
return false;
}
}
return false;
}
-bool i2c_start_r(uint8_t id)
+bool i2c_
bitbang_
start_r(uint8_t id)
{
id |= I2C_READBIT;
{
id |= I2C_READBIT;
- if (i2c_start())
+ if (i2c_
bitbang_
start())
{
{
- if (i2c_put(id))
+ if (i2c_
bitbang_
put(id))
return true;
LOG_ERR("NACK on I2c start read\n");
return true;
LOG_ERR("NACK on I2c start read\n");
@@
-119,27
+133,33
@@
bool i2c_start_r(uint8_t id)
return false;
}
return false;
}
-int i2c_get(bool ack)
+int i2c_
bitbang_
get(bool ack)
{
uint8_t data = 0;
{
uint8_t data = 0;
- for (uint8_t i = 0x80; i
>
= 0; i >>= 1)
+ for (uint8_t i = 0x80; i
!
= 0; i >>= 1)
{
SCL_LO;
{
SCL_LO;
-
timer_udelay(I2C_PERIOD
);
+
I2C_HALFBIT_DELAY(
);
SCL_HI;
SCL_HI;
- timer_udelay(I2C_PERIOD);
- if (SDA)
+ if (SDA_IN)
data |= i;
data |= i;
+ else
+ data &= ~i;
+
+ I2C_HALFBIT_DELAY();
}
SCL_LO;
}
SCL_LO;
- timer_udelay(I2C_PERIOD);
if (ack)
SDA_LO;
else
SDA_HI;
if (ack)
SDA_LO;
else
SDA_HI;
+ I2C_HALFBIT_DELAY();
SCL_HI;
SCL_HI;
+ I2C_HALFBIT_DELAY();
+ SCL_LO;
+ SDA_HI;
/* avoid sign extension */
return (int)(uint8_t)data;
}
/* avoid sign extension */
return (int)(uint8_t)data;
}
@@
-149,8
+169,9
@@
MOD_DEFINE(i2c);
/**
* Initialize i2c module.
*/
/**
* Initialize i2c module.
*/
-void i2c_init(void)
+void i2c_
bitbang_
init(void)
{
{
+ MOD_CHECK(timer);
I2C_BITBANG_HW_INIT;
SDA_HI;
SCL_HI;
I2C_BITBANG_HW_INIT;
SDA_HI;
SCL_HI;