nrf-rs / nrf-hal

A Rust HAL for the nRF family of devices
Apache License 2.0
499 stars 139 forks source link

I2C not working on P0_09 and P0_10 #418

Open arnobert opened 1 year ago

arnobert commented 1 year ago

Found that using those two pins for I2C lead to an infinite loop in twim / fn wait(). Both pins do not toggle and stay high, on nRF52840 dongle.

Is this related to their secondary function (NFC antenna)? Or have I overlooked something? Thanks!

eflukx commented 1 year ago

Yep, you have to "unlock" the pins for normal IO functionality. You may try the code below :)

/// "Unprotect" NFC pins and enable as GPIO pins (stored in FLASH, needs reset after change)
/// Returns `true` if setting was changed

pub fn nfc_pins_as_gpio(periphs: &pac::Peripherals) -> bool {
    if periphs.UICR.nfcpins.read().protect().bit_is_set() {
        let nvmc = &periphs.NVMC;
        assert!(!nvmc.config.read().wen().is_een()); // write + erase is forbidden!

        nvmc.config.write(|w| w.wen().wen());
        unsafe { periphs.UICR.nfcpins.write(|w| w.bits(0)) };
        nvmc.config.reset();

        true
    } else {
        false
    }
}