This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

unable to use reset pin as gpio

Hi,

I am trying to use the p21 reset pin as gpio but it is not working as expected. it is showing a 3.3v even when i am trying to toggle the pin. I have removed the CONFIGURE GPIO PI AS RESET definition  from the makefile and the reset function is disabled. also tried disabling the reset configuration in systemnrf_52.c file.

nrfjprog --memrd 0x10001200 and 1204 gives 0xffffffff.

what else should i do other than disabling the CONFIGUREGPIOPIN AS RESETdefinition ?

I am using nrf52832(bc832 module) with sdk14.00, softdevice s132

Parents
  • I haven't used that pin for SPI. Two things you might try: set the drive strength to high on both high and low after the spi has been set in case it is just too weak

        nrf_gpio_cfg(21,
                     NRF_GPIO_PIN_DIR_OUTPUT,
                     NRF_GPIO_PIN_INPUT_DISCONNECT,
                     NRF_GPIO_PIN_NOPULL,
                     NRF_GPIO_PIN_H0H1,       // Require High Drive both levels
                     NRF_GPIO_PIN_NOSENSE);
    

    and do a run-time check on the pin (not with the command line nrfprog), something similar to this code which I wrote when pins were misbehaving on one of my projects.

    const char * FindPinMap(uint16_t PinId)
    {
        // 32kHz Osc pins can be used as GPIOs or 32kHz Oscillator, special case
        if ( (PinId == RCC_OSC_OUT_PIN) && (NRF_CLOCK->LFCLKSRC & 0x000001) ) return "RTC-OSC-OUT";
        if ( (PinId == RCC_OSC_IN_PIN)  && (NRF_CLOCK->LFCLKSRC & 0x000001) ) return "RTC-OSC-IN";
    
        // NFC pins can be used as GPIOs or NFC, special case
        if ( (PinId == NFC1_PIN) && ((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)) ) return "NFC 1";
        if ( (PinId == NFC2_PIN) && ((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)) ) return "NFC 2";
    
        // Reset pin can be used as GPIOs or nReset, special case
        if ( (PinId == NRESET_PIN)                          // 21
         && (((NRF_UICR->PSELRESET[0] & UICR_PSELRESET_CONNECT_Msk) == (UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos))
         &&  ((NRF_UICR->PSELRESET[1] & UICR_PSELRESET_CONNECT_Msk) == (UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos))) ) return "nRESET";
    
        // TRACE pins can be used as GPIOs or Trace, special case
        if ( (CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) == CoreDebug_DEMCR_TRCENA_Msk )
        {
            if (PinId == TRACE_D0_PIN)  return "TRACE D0";  // 18
            if (PinId == TRACE_D1_PIN)  return "TRACE D1";  // 16
            if (PinId == TRACE_D2_PIN)  return "TRACE D2";  // 15
            if (PinId == TRACE_D3_PIN)  return "TRACE D3";  // 14
            if (PinId == TRACE_CLK_PIN) return "TRACE CLK"; // 20
        }
    
      //if (NRF_SPI0->PSEL.CSN  == PinId) return "SPI0 nCS";
        if (NRF_SPI0->PSEL.SCK  == PinId) return "SPI0 SCK";
        if (NRF_SPI0->PSEL.MOSI == PinId) return "SPI0 MOSI";
        if (NRF_SPI0->PSEL.MISO == PinId) return "SPI0 MISO";
    
        if (NRF_SPI1->PSEL.SCK  == PinId) return "SPI1 SCK";
        if (NRF_SPI1->PSEL.MOSI == PinId) return "SPI1 MOSI";
        if (NRF_SPI1->PSEL.MISO == PinId) return "SPI1 MISO";
    
        if (NRF_SPI2->PSEL.SCK  == PinId) return "SPI2 SCK";
        if (NRF_SPI2->PSEL.MOSI == PinId) return "SPI2 MOSI";
        if (NRF_SPI2->PSEL.MISO == PinId) return "SPI2 MISO";
    
        if (NRF_UARTE0->PSEL.RTS == PinId) return "UartE0 RTS";
        if (NRF_UARTE0->PSEL.CTS == PinId) return "UartE0 CTS";
        if (NRF_UARTE0->PSEL.TXD == PinId) return "UartE0 Tx";
        if (NRF_UARTE0->PSEL.RXD == PinId) return "UartE0 Rx";
    
        if (NRF_SAADC->CH[0].PSELP == PinId) return "ADC 0+";
        if (NRF_SAADC->CH[0].PSELN == PinId) return "ADC 0-";
        if (NRF_SAADC->CH[1].PSELP == PinId) return "ADC 1+";
        if (NRF_SAADC->CH[1].PSELN == PinId) return "ADC 1-";
        if (NRF_SAADC->CH[2].PSELP == PinId) return "ADC 2+";
        if (NRF_SAADC->CH[2].PSELN == PinId) return "ADC 2-";
        if (NRF_SAADC->CH[3].PSELP == PinId) return "ADC 3+";
        if (NRF_SAADC->CH[3].PSELN == PinId) return "ADC 3-";
        if (NRF_SAADC->CH[4].PSELP == PinId) return "ADC 4+";
        if (NRF_SAADC->CH[4].PSELN == PinId) return "ADC 4-";
        if (NRF_SAADC->CH[5].PSELP == PinId) return "ADC 5+";
        if (NRF_SAADC->CH[5].PSELN == PinId) return "ADC 5-";
        if (NRF_SAADC->CH[6].PSELP == PinId) return "ADC 6+";
        if (NRF_SAADC->CH[6].PSELN == PinId) return "ADC 6-";
        if (NRF_SAADC->CH[7].PSELP == PinId) return "ADC 7+";
        if (NRF_SAADC->CH[7].PSELN == PinId) return "ADC 7-";
    
        if (NRF_PWM0->PSEL.OUT[0] == PinId) return "PWM0 0";
        if (NRF_PWM0->PSEL.OUT[1] == PinId) return "PWM0 1";
        if (NRF_PWM0->PSEL.OUT[2] == PinId) return "PWM0 2";
        if (NRF_PWM0->PSEL.OUT[3] == PinId) return "PWM0 3";
    
        if (NRF_PWM1->PSEL.OUT[0] == PinId) return "PWM1 0";
        if (NRF_PWM1->PSEL.OUT[1] == PinId) return "PWM1 1";
        if (NRF_PWM1->PSEL.OUT[2] == PinId) return "PWM1 2";
        if (NRF_PWM1->PSEL.OUT[3] == PinId) return "PWM1 3";
    
        if (NRF_PWM2->PSEL.OUT[0] == PinId) return "PWM2 0";
        if (NRF_PWM2->PSEL.OUT[1] == PinId) return "PWM2 1";
        if (NRF_PWM2->PSEL.OUT[2] == PinId) return "PWM2 2";
        if (NRF_PWM2->PSEL.OUT[3] == PinId) return "PWM2 3";
    
        if (NRF_I2S->PSEL.SDOUT == PinId) return "I2S SDOUT";
        if (NRF_I2S->PSEL.SDIN  == PinId) return "I2S SDIN";
        if (NRF_I2S->PSEL.SCK   == PinId) return "I2S SCK";
        if (NRF_I2S->PSEL.MCK   == PinId) return "I2S MCK";
        if (NRF_I2S->PSEL.LRCK  == PinId) return "I2S LRCK";
    
        // No hardware pins available with these peripherals:
        // NRF_TIMER0                      ((NRF_TIMER_Type          *) NRF_TIMER0_BASE)
        // NRF_TIMER1                      ((NRF_TIMER_Type          *) NRF_TIMER1_BASE)
        // NRF_TIMER2                      ((NRF_TIMER_Type          *) NRF_TIMER2_BASE)
        // NRF_RTC0                        ((NRF_RTC_Type            *) NRF_RTC0_BASE)
        // NRF_RTC1                        ((NRF_RTC_Type            *) NRF_RTC1_BASE)
        // NRF_RTC2                        ((NRF_RTC_Type            *) NRF_RTC2_BASE)
    
        // Default, no map found
        return "no map";
    }
    

Reply
  • I haven't used that pin for SPI. Two things you might try: set the drive strength to high on both high and low after the spi has been set in case it is just too weak

        nrf_gpio_cfg(21,
                     NRF_GPIO_PIN_DIR_OUTPUT,
                     NRF_GPIO_PIN_INPUT_DISCONNECT,
                     NRF_GPIO_PIN_NOPULL,
                     NRF_GPIO_PIN_H0H1,       // Require High Drive both levels
                     NRF_GPIO_PIN_NOSENSE);
    

    and do a run-time check on the pin (not with the command line nrfprog), something similar to this code which I wrote when pins were misbehaving on one of my projects.

    const char * FindPinMap(uint16_t PinId)
    {
        // 32kHz Osc pins can be used as GPIOs or 32kHz Oscillator, special case
        if ( (PinId == RCC_OSC_OUT_PIN) && (NRF_CLOCK->LFCLKSRC & 0x000001) ) return "RTC-OSC-OUT";
        if ( (PinId == RCC_OSC_IN_PIN)  && (NRF_CLOCK->LFCLKSRC & 0x000001) ) return "RTC-OSC-IN";
    
        // NFC pins can be used as GPIOs or NFC, special case
        if ( (PinId == NFC1_PIN) && ((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)) ) return "NFC 1";
        if ( (PinId == NFC2_PIN) && ((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)) ) return "NFC 2";
    
        // Reset pin can be used as GPIOs or nReset, special case
        if ( (PinId == NRESET_PIN)                          // 21
         && (((NRF_UICR->PSELRESET[0] & UICR_PSELRESET_CONNECT_Msk) == (UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos))
         &&  ((NRF_UICR->PSELRESET[1] & UICR_PSELRESET_CONNECT_Msk) == (UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos))) ) return "nRESET";
    
        // TRACE pins can be used as GPIOs or Trace, special case
        if ( (CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) == CoreDebug_DEMCR_TRCENA_Msk )
        {
            if (PinId == TRACE_D0_PIN)  return "TRACE D0";  // 18
            if (PinId == TRACE_D1_PIN)  return "TRACE D1";  // 16
            if (PinId == TRACE_D2_PIN)  return "TRACE D2";  // 15
            if (PinId == TRACE_D3_PIN)  return "TRACE D3";  // 14
            if (PinId == TRACE_CLK_PIN) return "TRACE CLK"; // 20
        }
    
      //if (NRF_SPI0->PSEL.CSN  == PinId) return "SPI0 nCS";
        if (NRF_SPI0->PSEL.SCK  == PinId) return "SPI0 SCK";
        if (NRF_SPI0->PSEL.MOSI == PinId) return "SPI0 MOSI";
        if (NRF_SPI0->PSEL.MISO == PinId) return "SPI0 MISO";
    
        if (NRF_SPI1->PSEL.SCK  == PinId) return "SPI1 SCK";
        if (NRF_SPI1->PSEL.MOSI == PinId) return "SPI1 MOSI";
        if (NRF_SPI1->PSEL.MISO == PinId) return "SPI1 MISO";
    
        if (NRF_SPI2->PSEL.SCK  == PinId) return "SPI2 SCK";
        if (NRF_SPI2->PSEL.MOSI == PinId) return "SPI2 MOSI";
        if (NRF_SPI2->PSEL.MISO == PinId) return "SPI2 MISO";
    
        if (NRF_UARTE0->PSEL.RTS == PinId) return "UartE0 RTS";
        if (NRF_UARTE0->PSEL.CTS == PinId) return "UartE0 CTS";
        if (NRF_UARTE0->PSEL.TXD == PinId) return "UartE0 Tx";
        if (NRF_UARTE0->PSEL.RXD == PinId) return "UartE0 Rx";
    
        if (NRF_SAADC->CH[0].PSELP == PinId) return "ADC 0+";
        if (NRF_SAADC->CH[0].PSELN == PinId) return "ADC 0-";
        if (NRF_SAADC->CH[1].PSELP == PinId) return "ADC 1+";
        if (NRF_SAADC->CH[1].PSELN == PinId) return "ADC 1-";
        if (NRF_SAADC->CH[2].PSELP == PinId) return "ADC 2+";
        if (NRF_SAADC->CH[2].PSELN == PinId) return "ADC 2-";
        if (NRF_SAADC->CH[3].PSELP == PinId) return "ADC 3+";
        if (NRF_SAADC->CH[3].PSELN == PinId) return "ADC 3-";
        if (NRF_SAADC->CH[4].PSELP == PinId) return "ADC 4+";
        if (NRF_SAADC->CH[4].PSELN == PinId) return "ADC 4-";
        if (NRF_SAADC->CH[5].PSELP == PinId) return "ADC 5+";
        if (NRF_SAADC->CH[5].PSELN == PinId) return "ADC 5-";
        if (NRF_SAADC->CH[6].PSELP == PinId) return "ADC 6+";
        if (NRF_SAADC->CH[6].PSELN == PinId) return "ADC 6-";
        if (NRF_SAADC->CH[7].PSELP == PinId) return "ADC 7+";
        if (NRF_SAADC->CH[7].PSELN == PinId) return "ADC 7-";
    
        if (NRF_PWM0->PSEL.OUT[0] == PinId) return "PWM0 0";
        if (NRF_PWM0->PSEL.OUT[1] == PinId) return "PWM0 1";
        if (NRF_PWM0->PSEL.OUT[2] == PinId) return "PWM0 2";
        if (NRF_PWM0->PSEL.OUT[3] == PinId) return "PWM0 3";
    
        if (NRF_PWM1->PSEL.OUT[0] == PinId) return "PWM1 0";
        if (NRF_PWM1->PSEL.OUT[1] == PinId) return "PWM1 1";
        if (NRF_PWM1->PSEL.OUT[2] == PinId) return "PWM1 2";
        if (NRF_PWM1->PSEL.OUT[3] == PinId) return "PWM1 3";
    
        if (NRF_PWM2->PSEL.OUT[0] == PinId) return "PWM2 0";
        if (NRF_PWM2->PSEL.OUT[1] == PinId) return "PWM2 1";
        if (NRF_PWM2->PSEL.OUT[2] == PinId) return "PWM2 2";
        if (NRF_PWM2->PSEL.OUT[3] == PinId) return "PWM2 3";
    
        if (NRF_I2S->PSEL.SDOUT == PinId) return "I2S SDOUT";
        if (NRF_I2S->PSEL.SDIN  == PinId) return "I2S SDIN";
        if (NRF_I2S->PSEL.SCK   == PinId) return "I2S SCK";
        if (NRF_I2S->PSEL.MCK   == PinId) return "I2S MCK";
        if (NRF_I2S->PSEL.LRCK  == PinId) return "I2S LRCK";
    
        // No hardware pins available with these peripherals:
        // NRF_TIMER0                      ((NRF_TIMER_Type          *) NRF_TIMER0_BASE)
        // NRF_TIMER1                      ((NRF_TIMER_Type          *) NRF_TIMER1_BASE)
        // NRF_TIMER2                      ((NRF_TIMER_Type          *) NRF_TIMER2_BASE)
        // NRF_RTC0                        ((NRF_RTC_Type            *) NRF_RTC0_BASE)
        // NRF_RTC1                        ((NRF_RTC_Type            *) NRF_RTC1_BASE)
        // NRF_RTC2                        ((NRF_RTC_Type            *) NRF_RTC2_BASE)
    
        // Default, no map found
        return "no map";
    }
    

Children
No Data
Related