Skip to content

Commit

Permalink
Merge pull request #10880 from fedepell/sam0_write_intflag
Browse files Browse the repository at this point in the history
sam0 flashpage: wait for READY bit in INTFLAG after write command
  • Loading branch information
dylad committed Feb 1, 2019
2 parents 72df5b2 + 318f0cf commit 3995fd8
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions cpu/sam0_common/periph/flashpage.c
Expand Up @@ -41,6 +41,16 @@
#define _NVMCTRL NVMCTRL
#endif

static inline void wait_nvm_is_ready(void) __attribute__((always_inline));
static inline void wait_nvm_is_ready(void)
{
#ifdef CPU_SAML1X
while (!_NVMCTRL->STATUS.bit.READY) {}
#else
while (!_NVMCTRL->INTFLAG.bit.READY) {}
#endif
}

static void _unlock(void)
{
/* remove peripheral access lock for the NVMCTRL peripheral */
Expand Down Expand Up @@ -89,11 +99,12 @@ void flashpage_write_raw(void *target_addr, const void *data, size_t len)
_unlock();

_NVMCTRL->CTRLA.reg = (NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC);
wait_nvm_is_ready();
for (unsigned i = 0; i < len; i++) {
*dst++ = *data_addr++;
}
_NVMCTRL->CTRLA.reg = (NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_WP);

wait_nvm_is_ready();
_lock();
}

Expand All @@ -112,11 +123,7 @@ void flashpage_write(int page, const void *data)
_NVMCTRL->ADDR.reg = (((uint32_t)page_addr) >> 1);
#endif
_NVMCTRL->CTRLA.reg = (NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_ER);
#ifdef CPU_SAML1X
while(!_NVMCTRL->STATUS.bit.READY) {}
#else
while (!_NVMCTRL->INTFLAG.bit.READY) {}
#endif
wait_nvm_is_ready();
_lock();

/* write data to page */
Expand Down

0 comments on commit 3995fd8

Please sign in to comment.