123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686 |
- #ifndef NRF_DRV_TWI_H__
- #define NRF_DRV_TWI_H__
- #include <nrfx.h>
- #ifdef TWIM_PRESENT
- #include <nrfx_twim.h>
- #else
-
-
-
- #define nrfx_twim_init(...) 0
- #define nrfx_twim_uninit(...)
- #define nrfx_twim_enable(...)
- #define nrfx_twim_disable(...)
- #define nrfx_twim_tx(...) 0
- #define nrfx_twim_rx(...) 0
- #define nrfx_twim_is_busy(...) 0
- #define nrfx_twim_start_task_get(...) 0
- #define nrfx_twim_stopped_event_get(...) 0
- #endif
- #ifdef TWI_PRESENT
- #include <nrfx_twi.h>
- #else
-
-
-
- #define nrfx_twi_init(...) 0
- #define nrfx_twi_uninit(...)
- #define nrfx_twi_enable(...)
- #define nrfx_twi_disable(...)
- #define nrfx_twi_tx(...) 0
- #define nrfx_twi_rx(...) 0
- #define nrfx_twi_is_busy(...) 0
- #define nrfx_twi_data_count_get(...) 0
- #define nrfx_twi_stopped_event_get(...) 0
-
-
- #define NRF_TWI_ERROR_ADDRESS_NACK NRF_TWIM_ERROR_ADDRESS_NACK
- #define NRF_TWI_ERROR_DATA_NACK NRF_TWIM_ERROR_DATA_NACK
- #define NRF_TWI_FREQ_100K NRF_TWIM_FREQ_100K
- #define NRF_TWI_FREQ_250K NRF_TWIM_FREQ_250K
- #define NRF_TWI_FREQ_400K NRF_TWIM_FREQ_400K
- #endif
- #ifdef __cplusplus
- extern "C" {
- #endif
- typedef struct
- {
- uint8_t inst_idx;
- union
- {
- #ifdef TWIM_PRESENT
- nrfx_twim_t twim;
- #endif
- #ifdef TWI_PRESENT
- nrfx_twi_t twi;
- #endif
- } u;
- bool use_easy_dma;
- } nrf_drv_twi_t;
- #define NRF_DRV_TWI_INSTANCE(id) NRF_DRV_TWI_INSTANCE_(id)
- #define NRF_DRV_TWI_INSTANCE_(id) NRF_DRV_TWI_INSTANCE_ ## id
- #if NRFX_CHECK(NRFX_TWIM0_ENABLED)
- #define NRF_DRV_TWI_INSTANCE_0 \
- { 0, { .twim = NRFX_TWIM_INSTANCE(0) }, true }
- #elif NRFX_CHECK(NRFX_TWI0_ENABLED)
- #define NRF_DRV_TWI_INSTANCE_0 \
- { 0, { .twi = NRFX_TWI_INSTANCE(0) }, false }
- #endif
- #if NRFX_CHECK(NRFX_TWIM1_ENABLED)
- #define NRF_DRV_TWI_INSTANCE_1 \
- { 1, { .twim = NRFX_TWIM_INSTANCE(1) }, true }
- #elif NRFX_CHECK(NRFX_TWI1_ENABLED)
- #define NRF_DRV_TWI_INSTANCE_1 \
- { 1, { .twi = NRFX_TWI_INSTANCE(1) }, false }
- #endif
- typedef enum
- {
- NRF_DRV_TWI_FREQ_100K = NRF_TWI_FREQ_100K ,
- NRF_DRV_TWI_FREQ_250K = NRF_TWI_FREQ_250K ,
- NRF_DRV_TWI_FREQ_400K = NRF_TWI_FREQ_400K
- } nrf_drv_twi_frequency_t;
- typedef struct
- {
- uint32_t scl;
- uint32_t sda;
- nrf_drv_twi_frequency_t frequency;
- uint8_t interrupt_priority;
- bool clear_bus_init;
- bool hold_bus_uninit;
- } nrf_drv_twi_config_t;
- #define NRF_DRV_TWI_DEFAULT_CONFIG \
- { \
- .frequency = (nrf_drv_twi_frequency_t)TWI_DEFAULT_CONFIG_FREQUENCY, \
- .scl = 31, \
- .sda = 31, \
- .interrupt_priority = TWI_DEFAULT_CONFIG_IRQ_PRIORITY, \
- .clear_bus_init = TWI_DEFAULT_CONFIG_CLR_BUS_INIT, \
- .hold_bus_uninit = TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT, \
- }
- #define NRF_DRV_TWI_FLAG_TX_POSTINC (1UL << 0)
- #define NRF_DRV_TWI_FLAG_RX_POSTINC (1UL << 1)
- #define NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER (1UL << 2)
- #define NRF_DRV_TWI_FLAG_HOLD_XFER (1UL << 3)
- #define NRF_DRV_TWI_FLAG_REPEATED_XFER (1UL << 4)
- #define NRF_DRV_TWI_FLAG_TX_NO_STOP (1UL << 5)
- typedef enum
- {
- NRF_DRV_TWI_EVT_DONE,
- NRF_DRV_TWI_EVT_ADDRESS_NACK,
- NRF_DRV_TWI_EVT_DATA_NACK
- } nrf_drv_twi_evt_type_t;
- typedef enum
- {
- NRF_DRV_TWI_XFER_TX,
- NRF_DRV_TWI_XFER_RX,
- NRF_DRV_TWI_XFER_TXRX,
- NRF_DRV_TWI_XFER_TXTX
- } nrf_drv_twi_xfer_type_t;
- typedef struct
- {
- nrf_drv_twi_xfer_type_t type;
- uint8_t address;
- uint8_t primary_length;
- uint8_t secondary_length;
- uint8_t * p_primary_buf;
- uint8_t * p_secondary_buf;
- } nrf_drv_twi_xfer_desc_t;
- #define NRF_DRV_TWI_XFER_DESC_TX(addr, p_data, length) \
- { \
- .type = NRF_DRV_TWI_XFER_TX, \
- .address = addr, \
- .primary_length = length, \
- .p_primary_buf = p_data, \
- }
- #define NRF_DRV_TWI_XFER_DESC_RX(addr, p_data, length) \
- { \
- .type = NRF_DRV_TWI_XFER_RX, \
- .address = addr, \
- .primary_length = length, \
- .p_primary_buf = p_data, \
- }
- #define NRF_DRV_TWI_XFER_DESC_TXRX(addr, p_tx, tx_len, p_rx, rx_len) \
- { \
- .type = NRF_DRV_TWI_XFER_TXRX, \
- .address = addr, \
- .primary_length = tx_len, \
- .secondary_length = rx_len, \
- .p_primary_buf = p_tx, \
- .p_secondary_buf = p_rx, \
- }
- #define NRF_DRV_TWI_XFER_DESC_TXTX(addr, p_tx, tx_len, p_tx2, tx_len2) \
- { \
- .type = NRF_DRV_TWI_XFER_TXTX, \
- .address = addr, \
- .primary_length = tx_len, \
- .secondary_length = tx_len2, \
- .p_primary_buf = p_tx, \
- .p_secondary_buf = p_tx2, \
- }
- typedef struct
- {
- nrf_drv_twi_evt_type_t type;
- nrf_drv_twi_xfer_desc_t xfer_desc;
- } nrf_drv_twi_evt_t;
- typedef void (* nrf_drv_twi_evt_handler_t)(nrf_drv_twi_evt_t const * p_event,
- void * p_context);
- ret_code_t nrf_drv_twi_init(nrf_drv_twi_t const * p_instance,
- nrf_drv_twi_config_t const * p_config,
- nrf_drv_twi_evt_handler_t event_handler,
- void * p_context);
- __STATIC_INLINE
- void nrf_drv_twi_uninit(nrf_drv_twi_t const * p_instance);
- __STATIC_INLINE
- void nrf_drv_twi_enable(nrf_drv_twi_t const * p_instance);
- __STATIC_INLINE
- void nrf_drv_twi_disable(nrf_drv_twi_t const * p_instance);
- __STATIC_INLINE
- ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance,
- uint8_t address,
- uint8_t const * p_data,
- uint8_t length,
- bool no_stop);
- __STATIC_INLINE
- ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * p_instance,
- uint8_t address,
- uint8_t * p_data,
- uint8_t length);
- __STATIC_INLINE
- ret_code_t nrf_drv_twi_xfer(nrf_drv_twi_t const * p_instance,
- nrf_drv_twi_xfer_desc_t const * p_xfer_desc,
- uint32_t flags);
- __STATIC_INLINE
- bool nrf_drv_twi_is_busy(nrf_drv_twi_t const * p_instance);
- __STATIC_INLINE
- uint32_t nrf_drv_twi_data_count_get(nrf_drv_twi_t const * const p_instance);
- __STATIC_INLINE
- uint32_t nrf_drv_twi_start_task_get(nrf_drv_twi_t const * p_instance, nrf_drv_twi_xfer_type_t xfer_type);
- __STATIC_INLINE
- uint32_t nrf_drv_twi_stopped_event_get(nrf_drv_twi_t const * p_instance);
- #ifndef SUPPRESS_INLINE_IMPLEMENTATION
- #if defined(TWI_PRESENT) && !defined(TWIM_PRESENT)
- #define NRF_DRV_TWI_WITH_TWI
- #elif !defined(TWI_PRESENT) && defined(TWIM_PRESENT)
- #define NRF_DRV_TWI_WITH_TWIM
- #else
- #if (NRFX_CHECK(TWI0_ENABLED) && NRFX_CHECK(TWI0_USE_EASY_DMA)) || \
- (NRFX_CHECK(TWI1_ENABLED) && NRFX_CHECK(TWI1_USE_EASY_DMA))
- #define NRF_DRV_TWI_WITH_TWIM
- #endif
- #if (NRFX_CHECK(TWI0_ENABLED) && !NRFX_CHECK(TWI0_USE_EASY_DMA)) || \
- (NRFX_CHECK(TWI1_ENABLED) && !NRFX_CHECK(TWI1_USE_EASY_DMA))
- #define NRF_DRV_TWI_WITH_TWI
- #endif
- #endif
- #if defined(NRF_DRV_TWI_WITH_TWIM) && defined(NRF_DRV_TWI_WITH_TWI)
- #define NRF_DRV_TWI_USE_TWIM (p_instance->use_easy_dma)
- #elif defined(NRF_DRV_TWI_WITH_TWIM)
- #define NRF_DRV_TWI_USE_TWIM true
- #else
- #define NRF_DRV_TWI_USE_TWIM false
- #endif
- #define NRF_DRV_TWI_USE_TWI (!NRF_DRV_TWI_USE_TWIM)
- __STATIC_INLINE
- void nrf_drv_twi_uninit(nrf_drv_twi_t const * p_instance)
- {
- if (NRF_DRV_TWI_USE_TWIM)
- {
- nrfx_twim_uninit(&p_instance->u.twim);
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- nrfx_twi_uninit(&p_instance->u.twi);
- }
- }
- __STATIC_INLINE
- void nrf_drv_twi_enable(nrf_drv_twi_t const * p_instance)
- {
- if (NRF_DRV_TWI_USE_TWIM)
- {
- nrfx_twim_enable(&p_instance->u.twim);
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- nrfx_twi_enable(&p_instance->u.twi);
- }
- }
- __STATIC_INLINE
- void nrf_drv_twi_disable(nrf_drv_twi_t const * p_instance)
- {
- if (NRF_DRV_TWI_USE_TWIM)
- {
- nrfx_twim_disable(&p_instance->u.twim);
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- nrfx_twi_disable(&p_instance->u.twi);
- }
- }
- __STATIC_INLINE
- ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance,
- uint8_t address,
- uint8_t const * p_data,
- uint8_t length,
- bool no_stop)
- {
- ret_code_t result = 0;
- if (NRF_DRV_TWI_USE_TWIM)
- {
- result = nrfx_twim_tx(&p_instance->u.twim,
- address, p_data, length, no_stop);
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- result = nrfx_twi_tx(&p_instance->u.twi,
- address, p_data, length, no_stop);
- }
- return result;
- }
- __STATIC_INLINE
- ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * p_instance,
- uint8_t address,
- uint8_t * p_data,
- uint8_t length)
- {
- ret_code_t result = 0;
- if (NRF_DRV_TWI_USE_TWIM)
- {
- result = nrfx_twim_rx(&p_instance->u.twim,
- address, p_data, length);
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- result = nrfx_twi_rx(&p_instance->u.twi,
- address, p_data, length);
- }
- return result;
- }
- __STATIC_INLINE
- ret_code_t nrf_drv_twi_xfer(nrf_drv_twi_t const * p_instance,
- nrf_drv_twi_xfer_desc_t const * p_xfer_desc,
- uint32_t flags)
- {
- ret_code_t result = 0;
- if (NRF_DRV_TWI_USE_TWIM)
- {
- #ifdef TWIM_PRESENT
- nrfx_twim_xfer_desc_t const twim_xfer_desc =
- {
- .type = (nrfx_twim_xfer_type_t)p_xfer_desc->type,
- .address = p_xfer_desc->address,
- .primary_length = p_xfer_desc->primary_length,
- .secondary_length = p_xfer_desc->secondary_length,
- .p_primary_buf = p_xfer_desc->p_primary_buf,
- .p_secondary_buf = p_xfer_desc->p_secondary_buf,
- };
- result = nrfx_twim_xfer(&p_instance->u.twim, &twim_xfer_desc, flags);
- #endif
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- #ifdef TWI_PRESENT
- nrfx_twi_xfer_desc_t const twi_xfer_desc =
- {
- .type = (nrfx_twi_xfer_type_t)p_xfer_desc->type,
- .address = p_xfer_desc->address,
- .primary_length = p_xfer_desc->primary_length,
- .secondary_length = p_xfer_desc->secondary_length,
- .p_primary_buf = p_xfer_desc->p_primary_buf,
- .p_secondary_buf = p_xfer_desc->p_secondary_buf,
- };
- result = nrfx_twi_xfer(&p_instance->u.twi, &twi_xfer_desc, flags);
- #endif
- }
- return result;
- }
- __STATIC_INLINE
- bool nrf_drv_twi_is_busy(nrf_drv_twi_t const * p_instance)
- {
- bool result = 0;
- if (NRF_DRV_TWI_USE_TWIM)
- {
- result = nrfx_twim_is_busy(&p_instance->u.twim);
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- result = nrfx_twi_is_busy(&p_instance->u.twi);
- }
- return result;
- }
- __STATIC_INLINE
- uint32_t nrf_drv_twi_data_count_get(nrf_drv_twi_t const * const p_instance)
- {
- uint32_t result = 0;
- if (NRF_DRV_TWI_USE_TWIM)
- {
- NRFX_ASSERT(false);
- result = 0;
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- result = nrfx_twi_data_count_get(&p_instance->u.twi);
- }
- return result;
- }
- __STATIC_INLINE
- uint32_t nrf_drv_twi_start_task_get(nrf_drv_twi_t const * p_instance,
- nrf_drv_twi_xfer_type_t xfer_type)
- {
- uint32_t result = 0;
- if (NRF_DRV_TWI_USE_TWIM)
- {
- result = nrfx_twim_start_task_get(&p_instance->u.twim,
- (nrfx_twim_xfer_type_t)xfer_type);
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- NRFX_ASSERT(false);
- result = 0;
- }
- return result;
- }
- __STATIC_INLINE
- uint32_t nrf_drv_twi_stopped_event_get(nrf_drv_twi_t const * p_instance)
- {
- uint32_t result = 0;
- if (NRF_DRV_TWI_USE_TWIM)
- {
- result = nrfx_twim_stopped_event_get(&p_instance->u.twim);
- }
- else if (NRF_DRV_TWI_USE_TWI)
- {
- result = nrfx_twi_stopped_event_get(&p_instance->u.twi);
- }
- return result;
- }
- #endif
- #ifdef __cplusplus
- }
- #endif
- #endif
|