TWI driver

nRF5 SDK v17.0.2

Two Wire Interface master (TWI) peripheral driver. More...

Data Structures

struct nrfx_twi_t
Structure for the TWI master driver instance. More...
struct nrfx_twi_config_t
Structure for the configuration of the TWI master driver instance. More...
struct nrfx_twi_xfer_desc_t
Structure for a TWI transfer descriptor. More...
struct nrfx_twi_evt_t
Structure for a TWI event. More...

Macros

#define NRFX_TWI_INSTANCE (id)
Macro for creating a TWI master driver instance. More...
#define NRFX_TWI_DEFAULT_CONFIG
The default configuration of the TWI master driver instance. More...
#define NRFX_TWI_FLAG_NO_XFER_EVT_HANDLER (1UL << 2)
Flag indicating that the interrupt after each transfer will be suppressed, and the event handler will not be called.
#define NRFX_TWI_FLAG_TX_NO_STOP (1UL << 5)
Flag indicating that the TX transfer will not end with a stop condition.
#define NRFX_TWI_FLAG_SUSPEND (1UL << 6)
Flag indicating that the transfer will be suspended.
#define NRFX_TWI_XFER_DESC_TX (addr, p_data, length)
Macro for setting the TX transfer descriptor. More...
#define NRFX_TWI_XFER_DESC_RX (addr, p_data, length)
Macro for setting the RX transfer descriptor. More...
#define NRFX_TWI_XFER_DESC_TXRX (addr, p_tx, tx_len, p_rx, rx_len)
Macro for setting the TX-RX transfer descriptor. More...
#define NRFX_TWI_XFER_DESC_TXTX (addr, p_tx, tx_len, p_tx2, tx_len2)
Macro for setting the TX-TX transfer descriptor. More...

Typedefs

typedef void(* nrfx_twi_evt_handler_t )( nrfx_twi_evt_t const *p_event, void *p_context)
TWI event handler prototype.

Functions

nrfx_err_t nrfx_twi_init ( nrfx_twi_t const *p_instance, nrfx_twi_config_t const *p_config, nrfx_twi_evt_handler_t event_handler, void *p_context)
Function for initializing the TWI driver instance. More...
void nrfx_twi_uninit ( nrfx_twi_t const *p_instance)
Function for uninitializing the TWI instance. More...
void nrfx_twi_enable ( nrfx_twi_t const *p_instance)
Function for enabling the TWI instance. More...
void nrfx_twi_disable ( nrfx_twi_t const *p_instance)
Function for disabling the TWI instance. More...
nrfx_err_t nrfx_twi_tx ( nrfx_twi_t const *p_instance, uint8_t address, uint8_t const *p_data, size_t length, bool no_stop)
Function for sending data to a TWI slave. More...
nrfx_err_t nrfx_twi_rx ( nrfx_twi_t const *p_instance, uint8_t address, uint8_t *p_data, size_t length)
Function for reading data from a TWI slave. More...
nrfx_err_t nrfx_twi_xfer ( nrfx_twi_t const *p_instance, nrfx_twi_xfer_desc_t const *p_xfer_desc, uint32_t flags)
Function for performing a TWI transfer. More...
bool nrfx_twi_is_busy ( nrfx_twi_t const *p_instance)
Function for checking the TWI driver state. More...
size_t nrfx_twi_data_count_get ( nrfx_twi_t const *const p_instance)
Function for getting the transferred data count. More...
uint32_t nrfx_twi_stopped_event_get ( nrfx_twi_t const *p_instance)
Function for returning the address of a STOPPED TWI event. More...
__STATIC_INLINE nrfx_err_t nrfx_twi_bus_recover (uint32_t scl_pin, uint32_t sda_pin)
Function for recovering the bus. More...

Detailed Description

Two Wire Interface master (TWI) peripheral driver.

Macro Definition Documentation

#define NRFX_TWI_DEFAULT_CONFIG
Value:
{ \
.scl = 31, \
.sda = 31, \
.interrupt_priority = NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY , \
}

The default configuration of the TWI master driver instance.

#define NRFX_TWI_INSTANCE ( id )
Value:
{ \
.p_twi = NRFX_CONCAT_2 (NRF_TWI, id ), \
.drv_inst_idx = NRFX_CONCAT_3 (NRFX_TWI, id , _INST_IDX), \
}

Macro for creating a TWI master driver instance.

#define NRFX_TWI_XFER_DESC_RX ( addr,
p_data,
length
)
Value:
{ \
.type = NRFX_TWI_XFER_RX , \
.address = (addr), \
.primary_length = (length), \
.secondary_length = 0, \
.p_primary_buf = (p_data), \
.p_secondary_buf = NULL, \
}

Macro for setting the RX transfer descriptor.

#define NRFX_TWI_XFER_DESC_TX ( addr,
p_data,
length
)
Value:
{ \
.type = NRFX_TWI_XFER_TX , \
.address = (addr), \
.primary_length = (length), \
.secondary_length = 0, \
.p_primary_buf = (p_data), \
.p_secondary_buf = NULL, \
}

Macro for setting the TX transfer descriptor.

#define NRFX_TWI_XFER_DESC_TXRX ( addr,
p_tx,
tx_len,
p_rx,
rx_len
)
Value:
{ \
.address = (addr), \
.primary_length = (tx_len), \
.secondary_length = (rx_len), \
.p_primary_buf = (p_tx), \
.p_secondary_buf = (p_rx), \
}

Macro for setting the TX-RX transfer descriptor.

#define NRFX_TWI_XFER_DESC_TXTX ( addr,
p_tx,
tx_len,
p_tx2,
tx_len2
)
Value:
{ \
.address = (addr), \
.primary_length = (tx_len), \
.secondary_length = (tx_len2), \
.p_primary_buf = (p_tx), \
.p_secondary_buf = (p_tx2), \
}

Macro for setting the TX-TX transfer descriptor.

Enumeration Type Documentation

TWI master driver event types.

Enumerator
NRFX_TWI_EVT_DONE

Transfer completed event.

NRFX_TWI_EVT_ADDRESS_NACK

Error event: NACK received after sending the address.

NRFX_TWI_EVT_DATA_NACK

Error event: NACK received after sending a data byte.

NRFX_TWI_EVT_OVERRUN

Error event: The unread data is replaced by new data.

NRFX_TWI_EVT_BUS_ERROR

Error event: An unexpected transition occurred on the bus.

TWI master driver transfer types.

Enumerator
NRFX_TWI_XFER_TX

TX transfer.

NRFX_TWI_XFER_RX

RX transfer.

NRFX_TWI_XFER_TXRX

TX transfer followed by RX transfer with repeated start.

NRFX_TWI_XFER_TXTX

TX transfer followed by TX transfer with repeated start.

Function Documentation

__STATIC_INLINE nrfx_err_t nrfx_twi_bus_recover ( uint32_t scl_pin ,
uint32_t sda_pin
)

Function for recovering the bus.

This function checks if the bus is not stuck because of a slave holding the SDA line in the low state, and if needed it performs required number of pulses on the SCL line to make the slave release the SDA line. Finally, the function generates a STOP condition on the bus to put it into a known state.

Note
This function can be used only if the TWI driver is uninitialized.
Parameters
[in] scl_pin SCL pin number.
[in] sda_pin SDA pin number.
Return values
NRFX_SUCCESS Bus recovery was successful.
NRFX_ERROR_INTERNAL Bus recovery failed.
size_t nrfx_twi_data_count_get ( nrfx_twi_t const *const p_instance )

Function for getting the transferred data count.

Parameters
[in] p_instance Pointer to the driver instance structure.
Returns
Data count.
void nrfx_twi_disable ( nrfx_twi_t const * p_instance )

Function for disabling the TWI instance.

Parameters
[in] p_instance Pointer to the driver instance structure.
void nrfx_twi_enable ( nrfx_twi_t const * p_instance )

Function for enabling the TWI instance.

Parameters
[in] p_instance Pointer to the driver instance structure.
nrfx_err_t nrfx_twi_init ( nrfx_twi_t const * p_instance ,
nrfx_twi_config_t const * p_config ,
nrfx_twi_evt_handler_t event_handler ,
void * p_context
)

Function for initializing the TWI driver instance.

Parameters
[in] p_instance Pointer to the driver instance structure.
[in] p_config Pointer to the structure with the initial configuration.
[in] event_handler Event handler provided by the user. If NULL, blocking mode is enabled.
[in] p_context Context passed to event handler.
Return values
NRFX_SUCCESS Initialization is successful.
NRFX_ERROR_INVALID_STATE The driver is in invalid state.
NRFX_ERROR_BUSY Some other peripheral with the same instance ID is already in use. This is possible only if Peripheral Resource Sharing (PRS) module is enabled.
bool nrfx_twi_is_busy ( nrfx_twi_t const * p_instance )

Function for checking the TWI driver state.

Parameters
[in] p_instance TWI instance.
Return values
true The TWI driver is currently busy performing a transfer.
false The TWI driver is ready for a new transfer.
nrfx_err_t nrfx_twi_rx ( nrfx_twi_t const * p_instance ,
uint8_t address ,
uint8_t * p_data ,
size_t length
)

Function for reading data from a TWI slave.

The transmission will be stopped when an error occurs. If a transfer is ongoing, the function returns the error code NRFX_ERROR_BUSY .

Note
This function is deprecated. Use nrfx_twi_xfer instead.
Parameters
[in] p_instance Pointer to the driver instance structure.
[in] address Address of a specific slave device (only 7 LSB).
[in] p_data Pointer to a receive buffer.
[in] length Number of bytes to be received.
Return values
NRFX_SUCCESS The procedure is successful.
NRFX_ERROR_BUSY The driver is not ready for a new transfer.
NRFX_ERROR_INTERNAL An error is detected by hardware.
NRFX_ERROR_INVALID_STATE TX transaction is suspended on bus.
NRFX_ERROR_DRV_TWI_ERR_OVERRUN The unread data is replaced by new data.
NRFX_ERROR_DRV_TWI_ERR_ANACK Negative acknowledgement (NACK) is received after sending the address in polling mode.
NRFX_ERROR_DRV_TWI_ERR_DNACK Negative acknowledgement (NACK) is received after sending a data byte in polling mode.
uint32_t nrfx_twi_stopped_event_get ( nrfx_twi_t const * p_instance )

Function for returning the address of a STOPPED TWI event.

A STOPPED event can be used to detect the end of a transfer if the NRFX_TWI_FLAG_NO_XFER_EVT_HANDLER option is used.

Parameters
[in] p_instance Pointer to the driver instance structure.
Returns
STOPPED event address.
nrfx_err_t nrfx_twi_tx ( nrfx_twi_t const * p_instance ,
uint8_t address ,
uint8_t const * p_data ,
size_t length ,
bool no_stop
)

Function for sending data to a TWI slave.

The transmission will be stopped when an error occurs. If a transfer is ongoing, the function returns the error code NRFX_ERROR_BUSY .

Note
This function is deprecated. Use nrfx_twi_xfer instead.
Parameters
[in] p_instance Pointer to the driver instance structure.
[in] address Address of a specific slave device (only 7 LSB).
[in] p_data Pointer to a transmit buffer.
[in] length Number of bytes to send.
[in] no_stop If set, the stop condition is not generated on the bus after the transfer has completed successfully (allowing for a repeated start in the next transfer).
Return values
NRFX_SUCCESS The procedure is successful.
NRFX_ERROR_BUSY The driver is not ready for a new transfer.
NRFX_ERROR_INTERNAL An error is detected by hardware.
NRFX_ERROR_INVALID_STATE RX transaction is suspended on bus.
NRFX_ERROR_DRV_TWI_ERR_ANACK Negative acknowledgement (NACK) is received after sending the address in polling mode.
NRFX_ERROR_DRV_TWI_ERR_DNACK Negative acknowledgement (NACK) is received after sending a data byte in polling mode.
void nrfx_twi_uninit ( nrfx_twi_t const * p_instance )

Function for uninitializing the TWI instance.

Parameters
[in] p_instance Pointer to the driver instance structure.
nrfx_err_t nrfx_twi_xfer ( nrfx_twi_t const * p_instance ,
nrfx_twi_xfer_desc_t const * p_xfer_desc ,
uint32_t flags
)

Function for performing a TWI transfer.

The following transfer types can be configured ( nrfx_twi_xfer_desc_t::type ):

Note
TX-RX and TX-TX transfers are supported only in non-blocking mode.

Additional options are provided using the flags parameter:

  • NRFX_TWI_FLAG_NO_XFER_EVT_HANDLER - No user event handler after transfer completion. In most cases, this also means no interrupt at the end of the transfer.
  • NRFX_TWI_FLAG_TX_NO_STOP - No stop condition after TX transfer.
  • NRFX_TWI_FLAG_SUSPEND - Transfer will be suspended. This allows for combining multiple transfers into one transaction. Only transactions with the same direction can be combined. To finish the transaction, call the function without this flag.
Note
Some flag combinations are invalid:
Parameters
[in] p_instance Pointer to the driver instance structure.
[in] p_xfer_desc Pointer to the transfer descriptor.
[in] flags Transfer options (0 for default settings).
Return values
NRFX_SUCCESS The procedure is successful.
NRFX_ERROR_BUSY The driver is not ready for a new transfer.
NRFX_ERROR_NOT_SUPPORTED The provided parameters are not supported.
NRFX_ERROR_INTERNAL An unexpected transition occurred on the bus.
NRFX_ERROR_INVALID_STATE Other direction of transaction is suspended on the bus.
NRFX_ERROR_DRV_TWI_ERR_OVERRUN The unread data is replaced by new data (TXRX and RX)
NRFX_ERROR_DRV_TWI_ERR_ANACK Negative acknowledgement (NACK) is received after sending the address in polling mode.
NRFX_ERROR_DRV_TWI_ERR_DNACK Negative acknowledgement (NACK) is received after sending a data byte in polling mode.