21 #include "common_util.h"    24 #include "isr_manager.h"    32     bool transfer_finished;
    40 #define TWIM_ID               CONCAT_2(NRF_TWIM,TWIM_USED)    41 #define TWIM_IRQN             TWIM_IRQN_a(TWIM_USED)    42 #define TWIM_IRQ_Handler      TWIM_IRQ_Handler_a(TWIM_USED)    44 #define TWIM_IRQN_a(n)        TWIM_IRQN_b(n)    45 #define TWIM_IRQN_b(n)        SPIM##n##_SPIS##n##_TWIM##n##_TWIS##n##_SPI##n##_TWI##n##_IRQn    47 #define TWIM_IRQ_Handler_a(n) TWIM_IRQ_Handler_b(n)    48 #define TWIM_IRQ_Handler_b(n) SPIM##n##_SPIS##n##_TWIM##n##_TWIS##n##_SPI##n##_TWI##n##_IRQHandler    51 #define TWIM_EVENT_CLEAR(x)       do{ \    59     if(twim_status.evt_mask | (1 << txfr))
    61         twim_status.handler(
TWIM_ERR_NONE, twim_status.current_transfer);
    65 static void clear_all_events(
void)
    67     TWIM_ID->EVENTS_ERROR = 0;
    68     TWIM_ID->EVENTS_LASTRX = 0;
    69     TWIM_ID->EVENTS_LASTTX = 0;
    70     TWIM_ID->EVENTS_RXSTARTED = 0;
    71     TWIM_ID->EVENTS_STOPPED = 0;
    72     TWIM_ID->EVENTS_SUSPENDED = 0;
    73     TWIM_ID->EVENTS_TXSTARTED = 0;
    76 static void handle_error(
void)
    79     TWIM_ID->INTENCLR = TWIM_INTENCLR_STOPPED_Msk;
    80     (void)TWIM_ID->INTENCLR;
    83     if((TWIM_ID->ERRORSRC & TWIM_ERRORSRC_ANACK_Msk))
    85         TWIM_ID->ERRORSRC = TWIM_ERRORSRC_ANACK_Msk;
    89     if((TWIM_ID->ERRORSRC & TWIM_ERRORSRC_DNACK_Msk))
    91         TWIM_ID->ERRORSRC = TWIM_ERRORSRC_DNACK_Msk;
    94     twim_status.handler(err, twim_status.current_transfer);
    97     TWIM_ID->TASKS_STOP = 1;
   103     NRF_GPIO->PIN_CNF[config->
scl] =
   104             ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
   105             | (GPIO_PIN_CNF_DRIVE_H0D1     << GPIO_PIN_CNF_DRIVE_Pos)
   106             | (GPIO_PIN_CNF_PULL_Pullup    << GPIO_PIN_CNF_PULL_Pos)
   107             | (GPIO_PIN_CNF_INPUT_Connect  << GPIO_PIN_CNF_INPUT_Pos)
   108             | (GPIO_PIN_CNF_DIR_Input      << GPIO_PIN_CNF_DIR_Pos));
   109     NRF_GPIO->PIN_CNF[config->
sda] =
   110             ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
   111             | (GPIO_PIN_CNF_DRIVE_H0D1     << GPIO_PIN_CNF_DRIVE_Pos)
   112             | (GPIO_PIN_CNF_PULL_Pullup    << GPIO_PIN_CNF_PULL_Pos)
   113             | (GPIO_PIN_CNF_INPUT_Connect  << GPIO_PIN_CNF_INPUT_Pos)
   114             | (GPIO_PIN_CNF_DIR_Input      << GPIO_PIN_CNF_DIR_Pos));
   116     twim_status.scl = TWIM_ID->PSEL.SCL = config->
scl;
   117     twim_status.sda = TWIM_ID->PSEL.SDA = config->
sda;
   120     TWIM_ID->ADDRESS = config->
address;
   122     TWIM_ID->TXD.LIST = TWIM_TXD_LIST_LIST_Msk;
   125     NVIC_ClearPendingIRQ(TWIM_IRQN);
   127     NVIC_EnableIRQ(TWIM_IRQN);
   129     TWIM_ID->ENABLE = TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos;
   130     twim_status.evt_mask = config->
evt_mask;
   132     twim_status.transfer_finished = 
true;
   133     twim_status.on = 
true;
   138     if(twim_status.on == 
false){
   141     twim_status.on = 
false;
   142     TWIM_ID->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWIM_ENABLE_ENABLE_Pos;
   144     NVIC_ClearPendingIRQ(TWIM_IRQN);
   145     NVIC_DisableIRQ(TWIM_IRQN);
   148     NRF_GPIO->PIN_CNF[twim_status.scl] =
   149             ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
   150             | (GPIO_PIN_CNF_DRIVE_S0S1     << GPIO_PIN_CNF_DRIVE_Pos)
   151             | (GPIO_PIN_CNF_PULL_Disabled    << GPIO_PIN_CNF_PULL_Pos)
   152             | (GPIO_PIN_CNF_INPUT_Disconnect  << GPIO_PIN_CNF_INPUT_Pos)
   153             | (GPIO_PIN_CNF_DIR_Input      << GPIO_PIN_CNF_DIR_Pos));
   154     NRF_GPIO->PIN_CNF[twim_status.sda] =
   155             ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
   156             | (GPIO_PIN_CNF_DRIVE_S0S1     << GPIO_PIN_CNF_DRIVE_Pos)
   157             | (GPIO_PIN_CNF_PULL_Disabled    << GPIO_PIN_CNF_PULL_Pos)
   158             | (GPIO_PIN_CNF_INPUT_Disconnect  << GPIO_PIN_CNF_INPUT_Pos)
   159             | (GPIO_PIN_CNF_DIR_Input      << GPIO_PIN_CNF_DIR_Pos));
   161     TWIM_ID->ADDRESS = 0;
   165     if(twim_status.on == 
false)
   171     if(TWIM_ID->EVENTS_STOPPED)
   173         twim_status.transfer_finished = 
true;
   177     if(twim_status.transfer_finished == 
false)
   193     TWIM_ID->TXD.PTR = (uint32_t) tx_ptr;
   194     TWIM_ID->TXD.MAXCNT = tx_len;
   195     TWIM_ID->SHORTS = TWIM_SHORTS_LASTTX_STOP_Msk;
   196     TWIM_ID->TASKS_STARTTX = 1;
   198     twim_status.current_transfer = 
TWIM_TX;
   199     twim_status.transfer_finished = 
false;
   202     TWIM_ID->INTEN = TWIM_INTENSET_ERROR_Msk;
   203     (void)TWIM_ID->INTEN;
   204     TWIM_ID->INTENSET = (twim_status.evt_mask & TWIM_TX_DONE_MSK)?
   205             (TWIM_INTENSET_STOPPED_Msk) : 0 ;
   219     TWIM_ID->RXD.PTR = (uint32_t) rx_ptr;
   220     TWIM_ID->RXD.MAXCNT = rx_len;
   221     TWIM_ID->SHORTS = TWIM_SHORTS_LASTRX_STOP_Msk;
   222     TWIM_ID->TASKS_STARTRX = 1;
   224     twim_status.current_transfer = 
TWIM_RX;
   225     twim_status.transfer_finished = 
false;
   228     TWIM_ID->INTEN = TWIM_INTENSET_ERROR_Msk;
   229     (void)TWIM_ID->INTEN;
   230     TWIM_ID->INTENSET = (twim_status.evt_mask & TWIM_RX_DONE_MSK)?
   231             (TWIM_INTENSET_STOPPED_Msk) : 0 ;
   237         uint8_t * rx_ptr, uint32_t rx_len)
   246     TWIM_ID->TXD.PTR = (uint32_t) tx_ptr;
   247     TWIM_ID->TXD.MAXCNT = tx_len;
   248     TWIM_ID->RXD.PTR = (uint32_t) rx_ptr;
   249     TWIM_ID->RXD.MAXCNT = rx_len;
   250     TWIM_ID->SHORTS = TWIM_SHORTS_LASTTX_STARTRX_Msk |
   251             TWIM_SHORTS_LASTRX_STOP_Msk;
   252     TWIM_ID->TASKS_STARTTX = 1;
   255     twim_status.transfer_finished = 
false;
   258     TWIM_ID->INTEN = TWIM_INTENSET_ERROR_Msk;
   259     (void)TWIM_ID->INTEN;
   260     TWIM_ID->INTENSET = (twim_status.evt_mask & TWIM_TX_RX_DONE_MSK)?
   261             (TWIM_INTENSET_STOPPED_Msk) : 0 ;
   268     return TWIM_ID->ADDRESS;
   271 void hal_twim_Handler (
void)
   273 void TWIM_IRQ_Handler(
void)
   276     if(TWIM_ID->EVENTS_ERROR == 1){
   278         TWIM_EVENT_CLEAR(TWIM_ID->EVENTS_ERROR);
   283     if(TWIM_ID->EVENTS_STOPPED == 1){
   285         TWIM_EVENT_CLEAR(TWIM_ID->EVENTS_STOPPED);
   287         twim_status.transfer_finished = 
true;
   289         send_event(twim_status.current_transfer);
 uint32_t irq_priority
Interrupt priority.
 
uint32_t evt_mask
Event Mask for specifying which successful transfer type calls the handler.
 
hal_twim_freq_t frequency
TWI frequency.
 
twim_ret_status hal_twim_rx(uint8_t *rx_ptr, uint32_t rx_len)
Start a Rx only TWI transfer.
 
The TWIM peripheral is not initialized.
 
The slave device generated an error on the data bytes.
 
twim_transfer_t
Defines for the types of transfers possible.
 
uint32_t hal_twim_get_current_adrs(void)
Get the current specified address of the I2C slave.
 
void(* evt_handler)(twim_err_t evt, twim_transfer_t transfer)
 
The slave device generated an error on the address bytes.
 
void hal_twim_uninit(void)
Function for uninitializing and disabling one of the TWIM peripheral.
 
twim_err_t
Defines for the types of errors possible during TWI transactions.
 
A Tx transfer followed by Rx with a repeated start.
 
twim_ret_status
Defines for the return values for the transfer calls.
 
No error for this transfer.
 
twim_ret_status hal_twim_tx_rx(uint8_t *tx_ptr, uint32_t tx_len, uint8_t *rx_ptr, uint32_t rx_len)
Start a Tx TWI transfer followed by a Rx by repeated start.
 
A transfer is already happening.
 
Transfer successfully started.
 
Structure for the TWI master driver initialization.
 
uint32_t scl
SCL pin number.
 
uint32_t sda
SDA pin number.
 
void hal_twim_init(hal_twim_init_config_t *config)
Function for initializing and enabling one of the TWIM peripheral.
 
twim_ret_status hal_twim_tx(uint8_t *tx_ptr, uint32_t tx_len)
Start a Tx only TWI transfer.