/********************************************************************** name : function : **********************************************************************/ void UARTClass::begin(const uint32_t BaudRate, uint32_t rx_pin, uint32_t tx_pin) { uint32_t t_pin, r_pin; t_pin = Pin_nRF51822_to_Arduino(tx_pin); r_pin = Pin_nRF51822_to_Arduino(rx_pin); UART0_Start( BaudRate, r_pin, t_pin ); }
/********************************************************************** name : function : **********************************************************************/ void TwoWire::begin() { PinName nrf_sda, nrf_scl; nrf_scl = Pin_nRF51822_to_Arduino(SCL); nrf_sda = Pin_nRF51822_to_Arduino(SDA); /* Initialize i2c, default 100KHz */ i2c_init(&i2c, nrf_sda, nrf_scl); twi_status = UNINITIALIZED; }
/********************************************************************** name : function : **********************************************************************/ void TwoWire::begin(uint32_t scl, uint32_t sda, uint32_t speed) { PinName nrf_sda, nrf_scl; nrf_scl = Pin_nRF51822_to_Arduino(scl); nrf_sda = Pin_nRF51822_to_Arduino(sda); /* Initialize i2c */ i2c_init(&i2c, nrf_sda, nrf_scl); i2c_frequency(&i2c, speed); twi_status = UNINITIALIZED; }
void noTone(uint8_t pin) { uint8_t nrf_pin; nrf_pin = Pin_nRF51822_to_Arduino(pin); if(nrf_pin >= 31) return; if(nrf_pin != tone_pin) return; // Stop TIMER TONE_USED_TIMER->TASKS_STOP = 1; NVIC_DisableIRQ(TONE_USED_TIMER_IRQn); #if defined(SOFTDEVICE_PRESENT) uint8_t softdevice_enabled; sd_softdevice_is_enabled(&softdevice_enabled); if(softdevice_enabled == 0) { NRF_PPI->CHEN &= (1 << TONE_USED_PPI_CHANNAL); } else { sd_ppi_channel_enable_clr(1 << TONE_USED_PPI_CHANNAL); } #else NRF_PPI->CHEN &= (1 << TONE_USED_PPI_CHANNAL); #endif // Disable GPIOTE NRF_GPIOTE->CONFIG[TONE_USED_GPIOTE_NUM] &= ~( GPIOTE_CONFIG_MODE_Msk | GPIOTE_CONFIG_POLARITY_Msk); // Reset variables tone_pin = 0xFF; finish_flag = 0; inter_count = 0; }
void UARTClass::begin(const uint32_t BaudRate, uint32_t rx_pin, uint32_t tx_pin) { PinName pin_rx, pin_tx; UARTName uart = UART_0; serial_t obj; pin_rx = Pin_nRF51822_to_Arduino(rx_pin); pin_tx = Pin_nRF51822_to_Arduino(tx_pin); obj.uart = (NRF_UART_Type *)uart; serial_init(&obj, pin_tx, pin_rx); serial_set_flow_control(&obj, FlowControlNone, (PinName)NC, (PinName)NC); serial_baud(&obj, BaudRate); /* TXIrq has a error, don't use it */ serial_irq_set(&obj, RxIrq, 1); //serial_irq_set(&obj, TxIrq, 1); }
/********************************************************************** name : function : **********************************************************************/ int digitalRead( uint32_t ulPin ) { uint32_t pin; pin = Pin_nRF51822_to_Arduino(ulPin); if(pin < 31) { PPI_Off_FROM_GPIO(pin); return ((NRF_GPIO->IN >> pin) & 1UL); }
/********************************************************************** name : function : **********************************************************************/ void digitalWrite( uint32_t ulPin, uint32_t ulVal ) { uint32_t pin; pin = Pin_nRF51822_to_Arduino(ulPin); if(pin < 31) { PPI_Off_FROM_GPIO(pin); if (ulVal) NRF_GPIO->OUTSET = (1 << pin); else NRF_GPIO->OUTCLR = (1 << pin); } }
/********************************************************************** name : function : **********************************************************************/ uint32_t analogRead(uint32_t pin) { uint32_t value = 0; uint32_t pValue = 0; uint32_t nrf_pin = 0; //PIN transform to nRF51822 nrf_pin = Pin_nRF51822_to_Arduino(pin); if( nrf_pin > 0 && nrf_pin < 7) { pValue = (1 << (nrf_pin + 1)); NRF_ADC->CONFIG = ( ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) | ( analogReference_inpsel_type << ADC_CONFIG_INPSEL_Pos) | ( analogReference_type << ADC_CONFIG_REFSEL_Pos) | ( pValue << ADC_CONFIG_PSEL_Pos) | ( analogReference_ext_type << ADC_CONFIG_EXTREFSEL_Pos); NRF_ADC->INTENCLR = 0xFFFFFFFF; NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled << ADC_ENABLE_ENABLE_Pos; NRF_ADC->TASKS_START = 1; while( (NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) == (ADC_BUSY_BUSY_Busy << ADC_BUSY_BUSY_Pos) ); value = NRF_ADC->RESULT; value = conversion_Resolution(value, ADC_RESOLUTION, analogReadResolution_bit); NRF_ADC->ENABLE = (ADC_ENABLE_ENABLE_Disabled << ADC_ENABLE_ENABLE_Pos); NRF_ADC->CONFIG = (ADC_CONFIG_RES_8bit << ADC_CONFIG_RES_Pos) | (ADC_CONFIG_INPSEL_SupplyTwoThirdsPrescaling << ADC_CONFIG_INPSEL_Pos) | (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) | (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) | (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos); } return value; }
/**************************************************** * Function Definitions ****************************************************/ void tone(uint8_t pin, uint16_t freq, uint32_t duration) { uint8_t nrf_pin; uint32_t compare, prescaler; nrf_pin = Pin_nRF51822_to_Arduino(pin); if(nrf_pin >= 31) return; log_info("TONE : Start a tone \r\n"); // Find appropriate values for PRESCALER and COMPARE registers uint8_t index; for (index=0; index<= 9; index++) { prescaler = index; compare = 16000000UL / freq; compare = compare >> (prescaler+1); compare = compare - 1; if ((compare >= 2) && (compare <= 65535)) break; } log_info("TONE : The prescaler is %d \r\n", prescaler); log_info("TONE : The compare is %d \r\n", compare); // Check duration if(duration > 0) { finish_flag = 1; inter_count = ((freq * duration) / 1000) * 2; } else { finish_flag = 0; inter_count = 0xFFFFFFFF; } // Config GPIOTE task out. NRF_GPIOTE->CONFIG[TONE_USED_GPIOTE_NUM] &= ~( GPIOTE_CONFIG_MODE_Msk | GPIOTE_CONFIG_POLARITY_Msk); NRF_GPIOTE->CONFIG[TONE_USED_GPIOTE_NUM] = ( (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) | (nrf_pin << GPIOTE_CONFIG_PSEL_Pos) | (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos) | //Task toggle (GPIOTE_CONFIG_OUTINIT_Low << GPIOTE_CONFIG_OUTINIT_Pos) //Inital value LOW ); #if defined(SOFTDEVICE_PRESENT) // Check whether softdevice is enbale. uint8_t softdevice_enabled; uint32_t error_code; sd_softdevice_is_enabled(&softdevice_enabled); if(softdevice_enabled == 0) { log_info("TONE : Softdevice is disable, config PPI \r\n"); NRF_PPI->CH[TONE_USED_PPI_CHANNAL].EEP = (uint32_t)(&TONE_USED_TIMER->EVENTS_COMPARE[0]); NRF_PPI->CH[TONE_USED_PPI_CHANNAL].TEP = (uint32_t)(&NRF_GPIOTE->TASKS_OUT[TONE_USED_GPIOTE_NUM]); NRF_PPI->CHEN |= (1 << TONE_USED_PPI_CHANNAL); } else { log_info("TONE : Softdevice is enable, config PPI \r\n"); error_code = sd_ppi_channel_assign(TONE_USED_PPI_CHANNAL, &TONE_USED_TIMER->EVENTS_COMPARE[0], &NRF_GPIOTE->TASKS_OUT[TONE_USED_GPIOTE_NUM]); APP_ERROR_CHECK(error_code); error_code = sd_ppi_channel_enable_set(1 << TONE_USED_PPI_CHANNAL); APP_ERROR_CHECK(error_code); } #else log_info("TONE : Softdevice is not used, config PPI \r\n"); NRF_PPI->CH[TONE_USED_PPI_CHANNAL].EEP = (uint32_t)(&TONE_USED_TIMER->EVENTS_COMPARE[0]); NRF_PPI->CH[TONE_USED_PPI_CHANNAL].TEP = (uint32_t)(&NRF_GPIOTE->TASKS_OUT[TONE_USED_GPIOTE_NUM]); NRF_PPI->CHEN |= (1 << TONE_USED_PPI_CHANNAL); #endif log_info("TONE : Init TIMIERx \r\n"); // Configure TIMERx TONE_USED_TIMER->TASKS_STOP = 1; TONE_USED_TIMER->TASKS_CLEAR = 1; TONE_USED_TIMER->MODE = TIMER_MODE_MODE_Timer; TONE_USED_TIMER->PRESCALER = prescaler; TONE_USED_TIMER->BITMODE = TIMER_BITMODE_BITMODE_16Bit; TONE_USED_TIMER->SHORTS = (TIMER_SHORTS_COMPARE0_CLEAR_Enabled << TIMER_SHORTS_COMPARE0_CLEAR_Pos); TONE_USED_TIMER->CC[0] = (uint16_t)(compare); TONE_USED_TIMER->EVENTS_COMPARE[0] = 0; TONE_USED_TIMER->INTENCLR = 0xFFFFFFFF; TONE_USED_TIMER->INTENSET = (TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos); // Enable IRQn NVIC_SetPriority(TONE_USED_TIMER_IRQn, APP_IRQ_PRIORITY_LOW); NVIC_ClearPendingIRQ(TONE_USED_TIMER_IRQn); NVIC_EnableIRQ(TONE_USED_TIMER_IRQn); // Start TIMER log_info("TONE : Start TIMIERx \r\n"); TONE_USED_TIMER->TASKS_START = 1; }
/********************************************************************** name : function : **********************************************************************/ void analogWrite(uint32_t ulPin, uint32_t ulValue) { uint32_t nrf_pin, max_value, err_code = NRF_SUCCESS , crystal_is_running=0; uint8_t gpiote_channel; nrf_pin = Pin_nRF51822_to_Arduino(ulPin); if( nrf_pin < 31) { //if vaule 0 or >255, set LOW or HIGH if(ulValue <= 0) { PPI_Off_FROM_GPIO(nrf_pin); NRF_GPIO->OUTCLR = (1 << nrf_pin); return; } max_value = (uint32_t)( pow(2, analogWriteResolution_bit) - 1 ); if(ulValue >= max_value ) { ulValue = max_value - 1; } //if exist, update the value if (Timer1_Occupied_Pin[0] == nrf_pin) { update_PWM_value(nrf_pin, ulValue, 0); } else if (Timer1_Occupied_Pin[1] == nrf_pin) { update_PWM_value(nrf_pin, ulValue, 1); } else if (Timer1_Occupied_Pin[2] == nrf_pin) { update_PWM_value(nrf_pin, ulValue, 2); } else { if ((Timer1_Occupied_Pin[0] == 255) && (Timer1_Occupied_Pin[1] == 255) && (Timer1_Occupied_Pin[2] == 255)) { // Configure ulPin as output NRF_GPIO->PIN_CNF[nrf_pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); NRF_GPIO->OUTCLR = (1 << nrf_pin); //fine a free gpiote channel gpiote_channel = GPIOTE_Channel_Find(); if( gpiote_channel == 255 ) { return; } //configure TIMER1 NRF_TIMER1->TASKS_STOP = 1; NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer; NRF_TIMER1->PRESCALER = 0; // Source clock frequency is divided by 2^6 = 64 //NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_08Bit; NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_16Bit; // Clears the timer, sets it to 0 NRF_TIMER1->TASKS_CLEAR = 1; NRF_TIMER1->CC[0] = ((2^PWM_RESOLUTION) - 1); NRF_TIMER1->CC[1] = ((2^PWM_RESOLUTION) - 1); NRF_TIMER1->CC[2] = ((2^PWM_RESOLUTION) - 1); NRF_TIMER1->CC[3] = 0; NRF_TIMER1->EVENTS_COMPARE[0] = 0; NRF_TIMER1->EVENTS_COMPARE[1] = 0; NRF_TIMER1->EVENTS_COMPARE[2] = 0; NRF_TIMER1->EVENTS_COMPARE[3] = 0; //Interrupt setup NRF_TIMER1->INTENSET = (TIMER_INTENSET_COMPARE3_Enabled << TIMER_INTENSET_COMPARE3_Pos); LinkInterrupt( TIMER1_IRQn, TIMER1_handler ); //can't set low priority, else the GPIO polarity will change //NVIC_SetPriority(TIMER1_IRQn, 3); //NVIC_ClearPendingIRQ(TIMER1_IRQn); NVIC_EnableIRQ(TIMER1_IRQn); NRF_TIMER1->TASKS_START = 1; // PPI for TIMER1 and IO TASK nrf_gpiote_task_config(gpiote_channel, nrf_pin, NRF_GPIOTE_POLARITY_TOGGLE, NRF_GPIOTE_INITIAL_VALUE_LOW); GPIOTE_Channel_Set(gpiote_channel); PPI_ON_TIMER_GPIO(gpiote_channel, NRF_TIMER1, 0); //Save pin , channel and value GPIOTE_Channel_for_Analog[0] = gpiote_channel; PWM_Channels_Value[0] = ((2^PWM_RESOLUTION) - 1) - conversion_Resolution(ulValue, analogWriteResolution_bit, PWM_RESOLUTION); Timer1_Occupied_Pin[0] = nrf_pin; } else { if (Timer1_Occupied_Pin[0] == 255) { NRF_GPIO->PIN_CNF[nrf_pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); NRF_GPIO->OUTCLR = (1 << nrf_pin); //fine a free gpiote channel and configure the channel gpiote_channel = GPIOTE_Channel_Find(); if( gpiote_channel == 255 ) { return; } nrf_gpiote_task_config(gpiote_channel, nrf_pin, NRF_GPIOTE_POLARITY_TOGGLE, NRF_GPIOTE_INITIAL_VALUE_LOW); GPIOTE_Channel_Set(gpiote_channel); PPI_ON_TIMER_GPIO(gpiote_channel, NRF_TIMER1, 0); //save the pin and value GPIOTE_Channel_for_Analog[0] = gpiote_channel; PWM_Channels_Value[0] = ((2^PWM_RESOLUTION) - 1) - conversion_Resolution(ulValue, analogWriteResolution_bit, PWM_RESOLUTION); Timer1_Occupied_Pin[0] = nrf_pin; NRF_TIMER1->EVENTS_COMPARE[0] = 0; } else if (Timer1_Occupied_Pin[1] == 255) { NRF_GPIO->PIN_CNF[nrf_pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); NRF_GPIO->OUTCLR = (1 << nrf_pin); //find a free gpiote channel gpiote_channel = GPIOTE_Channel_Find(); if( gpiote_channel == 255 ) { return; } nrf_gpiote_task_config(gpiote_channel, nrf_pin, NRF_GPIOTE_POLARITY_TOGGLE, NRF_GPIOTE_INITIAL_VALUE_LOW); GPIOTE_Channel_Set(gpiote_channel); PPI_ON_TIMER_GPIO(gpiote_channel, NRF_TIMER1, 1); //save the pin and value GPIOTE_Channel_for_Analog[1] = gpiote_channel; PWM_Channels_Value[1] = ((2^PWM_RESOLUTION) - 1) - conversion_Resolution(ulValue, analogWriteResolution_bit, PWM_RESOLUTION); Timer1_Occupied_Pin[1] = nrf_pin; NRF_TIMER1->EVENTS_COMPARE[1] = 0; } else if (Timer1_Occupied_Pin[2] == 255) { NRF_GPIO->PIN_CNF[nrf_pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); NRF_GPIO->OUTCLR = (1 << nrf_pin); //find a free gpiote channel gpiote_channel = GPIOTE_Channel_Find(); if( gpiote_channel == 255 ) { return; } nrf_gpiote_task_config(gpiote_channel, nrf_pin, NRF_GPIOTE_POLARITY_TOGGLE, NRF_GPIOTE_INITIAL_VALUE_LOW); GPIOTE_Channel_Set(gpiote_channel); PPI_ON_TIMER_GPIO(gpiote_channel, NRF_TIMER1, 2); //save the pin and value GPIOTE_Channel_for_Analog[2] = gpiote_channel; PWM_Channels_Value[2] = ((2^PWM_RESOLUTION) - 1) - conversion_Resolution(ulValue, analogWriteResolution_bit, PWM_RESOLUTION); Timer1_Occupied_Pin[2] = nrf_pin; NRF_TIMER1->EVENTS_COMPARE[2] = 0; } else { //no more } } } } }
/********************************************************************** name : function : **********************************************************************/ void pinMode( uint32_t ulPin, uint32_t ulMode ) { uint32_t pin; pin = Pin_nRF51822_to_Arduino(ulPin); if(pin < 31) { switch ( ulMode ) { case INPUT: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); break ; case INPUT_NOPULL: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); break ; case INPUT_PULLDOWN: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Pulldown << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); break ; case INPUT_PULLUP: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT_S0S1: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT_H0S1: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_H0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT_S0H1: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT_H0H1: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT_D0S1: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_D0S1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT_D0H1: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_D0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT_S0D1: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; case OUTPUT_H0D1: NRF_GPIO->PIN_CNF[pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) | (GPIO_PIN_CNF_DRIVE_H0D1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); break ; } } }