diff options
author | Barry Carter <barry.carter@robotfuzz.com> | 2012-09-03 17:45:58 +0100 |
---|---|---|
committer | Barry Carter <barry.carter@robotfuzz.com> | 2012-09-03 17:45:58 +0100 |
commit | ef5c4b9f30da2f4b9a0edd4231e95b3ef8a88d43 (patch) | |
tree | d47d10d04fb3edf45c0b3972c56afb297c956294 /libmaple/include/libmaple/i2c_common.h | |
parent | 359117bc2009a9302884f61b0b359bb1723ee0bd (diff) | |
download | librambutan-ef5c4b9f30da2f4b9a0edd4231e95b3ef8a88d43.tar.gz librambutan-ef5c4b9f30da2f4b9a0edd4231e95b3ef8a88d43.zip |
- tx and rx callbacks for each module
- Callbacks can be called after each read/write cycle or per byte
- Each I2C module can have different callbacks
- General call support also working
- Supports master and slave at same time. Also works with multimaster
Usage:
i2c_msg msg;
char buffer[255];
main()
{
i2c_slave_enable(I2C1, I2C_FAST_MODE | I2C_SLAVE_DUAL_ADDRESS | I2C_SLAVE_GENERAL_CALL | I2C_SLAVE_USE_RX_BUFFER); // init slave mode. Enables master too
i2c_slave_attach_recv_handler(I2C1, pmsg, funcrx); // attach receive handler
i2c_slave_attach_transmit_handler(I2C1, pmsg, functx); // attach transmit handler
i2c_slave_set_own_address(I2C1, 0x10); // set addresss 1
i2c_slave_set_own_address2(I2C1, 0x20); // set addresss 2
}
void funcrx(i2c_msg *msg)
{
printf("length is %d.\n", msg->length);
char return_data = msg0>data[0];
}
void functx(i2c_msg *dev)
{
msg->data[0] = 0x01;
msg->data[1] = 0x02;
msg->data[2] = 0x03;
msg->data[3] = 0x04;
msg->data[4] = 0x05;
msg->length = 5;
}
All code derived from datasheets and libmaple.
Signed-off-by:- Barry Carter <barry.carter@gmail.com>
Diffstat (limited to 'libmaple/include/libmaple/i2c_common.h')
-rw-r--r-- | libmaple/include/libmaple/i2c_common.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/libmaple/include/libmaple/i2c_common.h b/libmaple/include/libmaple/i2c_common.h index 17cabe3..5debcb8 100644 --- a/libmaple/include/libmaple/i2c_common.h +++ b/libmaple/include/libmaple/i2c_common.h @@ -52,9 +52,12 @@ typedef enum i2c_state { I2C_STATE_IDLE = 1, /**< Idle */ I2C_STATE_XFER_DONE = 2, /**< Done with transfer */ I2C_STATE_BUSY = 3, /**< Busy */ + I2C_STATE_SL_RX = 4, /**< Slave receiving */ I2C_STATE_ERROR = -1 /**< Error occurred */ } i2c_state; +typedef void (*i2c_slave_recv_callback_func)(struct i2c_msg *); +typedef void (*i2c_slave_transmit_callback_func)(struct i2c_msg *); /** * @brief I2C device type. */ @@ -88,6 +91,17 @@ typedef struct i2c_dev { nvic_irq_num ev_nvic_line; /**< Event IRQ number */ nvic_irq_num er_nvic_line; /**< Error IRQ number */ volatile i2c_state state; /**< Device state */ + uint32 config_flags; /**< Configuration flags */ + + /* Barry Carter + * Slave implementation. Callback functions in this struct allow + * for a separate callback function for each I2C unit available onboard + */ + i2c_slave_transmit_callback_func i2c_slave_transmit_callback; + i2c_slave_recv_callback_func i2c_slave_recv_callback; + + struct i2c_msg *i2c_slave_msg; /* the message that the i2c slave will use */ + } i2c_dev; #endif |