12#include "hardware/structs/i2c.h"
13#include "hardware/regs/dreq.h"
16#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_I2C
17#ifdef PARAM_ASSERTIONS_ENABLED_I2C
18#define PARAM_ASSERTIONS_ENABLED_HARDWARE_I2C PARAM_ASSERTIONS_ENABLED_I2C
20#define PARAM_ASSERTIONS_ENABLED_HARDWARE_I2C 0
69extern i2c_inst_t i2c1_inst;
71#define i2c0 (&i2c0_inst)
72#define i2c1 (&i2c1_inst)
74#if !defined(PICO_DEFAULT_I2C_INSTANCE) && defined(PICO_DEFAULT_I2C)
75#define PICO_DEFAULT_I2C_INSTANCE() (__CONCAT(i2c,PICO_DEFAULT_I2C))
91#ifdef PICO_DEFAULT_I2C_INSTANCE
92#define i2c_default PICO_DEFAULT_I2C_INSTANCE()
114uint
i2c_init(i2c_inst_t *i2c, uint baudrate);
171static_assert(NUM_I2CS == 2,
"");
172#define I2C_NUM(i2c) ((i2c) == i2c1)
184static_assert(NUM_I2CS == 2,
"");
185#define I2C_INSTANCE(num) ((num) ? i2c1 : i2c0)
196#ifndef I2C_IS_INSTANCE
197static_assert(NUM_I2CS == 2,
"");
198#define I2C_IS_INSTANCE(i2c) ((i2c) == i2c0 || (i2c) == i2c1)
214#define I2C_DREQ_NUM(i2c,is_tx) (DREQ_I2C0_TX + I2C_NUM(i2c) * 2 + !(is_tx))
227#define I2C_RESET_NUM(i2c) (i2c_get_index(i2c) ? RESET_I2C1 : RESET_I2C0)
242#define i2c_hw_index(i2c) i2c_get_index(i2c)
262 invalid_params_if(HARDWARE_I2C, num >= NUM_I2CS);
312static inline int i2c_write_timeout_us(i2c_inst_t *i2c, uint8_t addr,
const uint8_t *src,
size_t len,
bool nostop, uint timeout_us) {
317int i2c_write_timeout_per_char_us(i2c_inst_t *i2c, uint8_t addr,
const uint8_t *src,
size_t len,
bool nostop, uint timeout_per_char_us);
331static inline int i2c_read_timeout_us(i2c_inst_t *i2c, uint8_t addr, uint8_t *dst,
size_t len,
bool nostop, uint timeout_us) {
336int i2c_read_timeout_per_char_us(i2c_inst_t *i2c, uint8_t addr, uint8_t *dst,
size_t len,
bool nostop, uint timeout_per_char_us);
349int i2c_write_blocking(i2c_inst_t *i2c, uint8_t addr,
const uint8_t *src,
size_t len,
bool nostop);
377int i2c_read_blocking(i2c_inst_t *i2c, uint8_t addr, uint8_t *dst,
size_t len,
bool nostop);
402 const size_t IC_TX_BUFFER_DEPTH = 16;
403 return IC_TX_BUFFER_DEPTH -
i2c_get_hw(i2c)->txflr;
428 for (
size_t i = 0; i < len; ++i) {
447 for (
size_t i = 0; i < len; ++i) {
465 assert(hw->status & I2C_IC_STATUS_RFNE_BITS);
466 return (uint8_t)hw->data_cmd;
480 assert(hw->status & I2C_IC_STATUS_TFNF_BITS);
481 hw->data_cmd = value;
@ DREQ_I2C1_RX
Select I2C1's RX FIFO as DREQ.
Definition dreq.h:129
@ DREQ_I2C0_RX
Select I2C0's RX FIFO as DREQ.
Definition dreq.h:127
@ DREQ_I2C1_TX
Select I2C1's TX FIFO as DREQ.
Definition dreq.h:128
@ DREQ_I2C0_TX
Select I2C0's TX FIFO as DREQ.
Definition dreq.h:126
static int i2c_write_timeout_us(i2c_inst_t *i2c, uint8_t addr, const uint8_t *src, size_t len, bool nostop, uint timeout_us)
Attempt to write specified number of bytes to address, with timeout.
Definition i2c.h:312
#define I2C_NUM(i2c)
Returns the I2C number for a I2C instance.
Definition i2c.h:172
int i2c_read_blocking_until(i2c_inst_t *i2c, uint8_t addr, uint8_t *dst, size_t len, bool nostop, absolute_time_t until)
Attempt to read specified number of bytes from address, blocking until the specified absolute time is...
Definition i2c.c:342
static i2c_inst_t * i2c_get_instance(uint num)
Convert I2C hardware instance number to I2C instance.
Definition i2c.h:261
void i2c_deinit(i2c_inst_t *i2c)
Disable the I2C HW block.
Definition i2c.c:58
void i2c_set_slave_mode(i2c_inst_t *i2c, bool slave, uint8_t addr)
Set I2C port to slave mode.
Definition i2c.c:112
int i2c_write_blocking(i2c_inst_t *i2c, uint8_t addr, const uint8_t *src, size_t len, bool nostop)
Attempt to write specified number of bytes to address, blocking.
Definition i2c.c:245
int i2c_write_burst_blocking(i2c_inst_t *i2c, uint8_t addr, const uint8_t *src, size_t len)
Attempt to write specified number of bytes to address, blocking in burst mode.
Definition i2c.c:262
i2c_inst_t i2c0_inst
Definition i2c.c:15
static size_t i2c_get_read_available(i2c_inst_t *i2c)
Determine number of bytes received.
Definition i2c.h:413
uint i2c_set_baudrate(i2c_inst_t *i2c, uint baudrate)
Set I2C baudrate.
Definition i2c.c:62
#define I2C_DREQ_NUM(i2c, is_tx)
Returns the dreq_num_t used for pacing DMA transfers to or from this I2C instance....
Definition i2c.h:214
#define I2C_IS_INSTANCE(i2c)
Returns true if the I2C instance is one of the h/w I2C instances.
Definition i2c.h:198
static size_t i2c_get_write_available(i2c_inst_t *i2c)
Determine non-blocking write space available.
Definition i2c.h:401
static int i2c_read_timeout_us(i2c_inst_t *i2c, uint8_t addr, uint8_t *dst, size_t len, bool nostop, uint timeout_us)
Attempt to read specified number of bytes from address, with timeout.
Definition i2c.h:331
static void i2c_write_byte_raw(i2c_inst_t *i2c, uint8_t value)
Push a byte into I2C Tx FIFO.
Definition i2c.h:478
#define I2C_INSTANCE(num)
Returns the I2C instance with the given I2C number.
Definition i2c.h:185
static uint i2c_get_index(i2c_inst_t *i2c)
Convert I2C instance to hardware instance number.
Definition i2c.h:236
static uint8_t i2c_read_byte_raw(i2c_inst_t *i2c)
Pop a byte from I2C Rx FIFO.
Definition i2c.h:463
int i2c_read_blocking(i2c_inst_t *i2c, uint8_t addr, uint8_t *dst, size_t len, bool nostop)
Attempt to read specified number of bytes from address, blocking.
Definition i2c.c:338
static void i2c_read_raw_blocking(i2c_inst_t *i2c, uint8_t *dst, size_t len)
Read direct from RX FIFO.
Definition i2c.h:446
static uint i2c_get_dreq(i2c_inst_t *i2c, bool is_tx)
Return the DREQ to use for pacing transfers to/from a particular I2C instance.
Definition i2c.h:490
uint i2c_init(i2c_inst_t *i2c, uint baudrate)
Initialise the I2C HW block.
Definition i2c.c:32
static void i2c_write_raw_blocking(i2c_inst_t *i2c, const uint8_t *src, size_t len)
Write direct to TX FIFO.
Definition i2c.h:427
int i2c_read_burst_blocking(i2c_inst_t *i2c, uint8_t addr, uint8_t *dst, size_t len)
Attempt to read specified number of bytes from address, blocking in burst mode.
Definition i2c.c:354
static i2c_hw_t * i2c_get_hw(i2c_inst_t *i2c)
Return pointer to structure containing i2c hardware registers.
Definition i2c.h:250
int i2c_write_blocking_until(i2c_inst_t *i2c, uint8_t addr, const uint8_t *src, size_t len, bool nostop, absolute_time_t until)
Attempt to write specified number of bytes to address, blocking until the specified absolute time is ...
Definition i2c.c:249
static absolute_time_t make_timeout_time_us(uint64_t us)
Convenience method to get the timestamp a number of microseconds from the current time.
Definition time.h:148
uint64_t absolute_time_t
An opaque 64 bit timestamp in microseconds.
Definition types.h:43
I2C controller instance.
Definition i2c.h:157
i2c_hw_t * hw
Pointer to the I2C hardware registers.
Definition i2c.h:158
bool restart_on_next
If true, the next transfer will begin with a Restart rather than a Start.
Definition i2c.h:159