コード例 #1
0
/**********************************************************************
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 );
}
コード例 #2
0
ファイル: Wire.cpp プロジェクト: movuino/Firmware
/**********************************************************************
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;
}
コード例 #3
0
ファイル: Wire.cpp プロジェクト: movuino/Firmware
/**********************************************************************
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;
}
コード例 #4
0
ファイル: tone.cpp プロジェクト: zoujixing/nRF52-Arduino
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;
}
コード例 #5
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);
}
コード例 #6
0
/**********************************************************************
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);
	}
コード例 #7
0
/**********************************************************************
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);
	}
}
コード例 #8
0
/**********************************************************************
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;
}
コード例 #9
0
ファイル: tone.cpp プロジェクト: zoujixing/nRF52-Arduino
/****************************************************
*                 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;
}
コード例 #10
0
/**********************************************************************
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
				}
			}
		}	
	}
}
コード例 #11
0
/**********************************************************************
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 ;
		}
	}
}