void HalSPIRead(uint32 addr, uint8 *pBuf, uint16 len) { uint8 shdw = P1DIR; P1DIR |= BV(3); XNV_SPI_BEGIN(); do { xnvSPIWrite(XNV_STAT_CMD); } while (XNV_SPI_RX() & XNV_STAT_WIP); XNV_SPI_END(); asm("NOP"); asm("NOP"); XNV_SPI_BEGIN(); xnvSPIWrite(XNV_READ_CMD); xnvSPIWrite(addr >> 16); xnvSPIWrite(addr >> 8); xnvSPIWrite(addr); xnvSPIWrite(0); while (len--) { xnvSPIWrite(0); *pBuf++ = XNV_SPI_RX(); } XNV_SPI_END(); P1DIR = shdw; }
/********************************************************************* * @fn HalSPIRead * * @brief Read from the external NV storage via SPI. * * @param addr - Offset into the external NV. * @param pBuf - Pointer to the buffer in which to copy the bytes read from external NV. * @param len - Number of bytes to read from external NV. * * @return None. *********************************************************************/ static void HalSPIRead(uint32 addr, uint8 *pBuf, uint16 len) { #if !HAL_OAD_BOOT_CODE uint8 shdw = P1DIR; halIntState_t his; HAL_ENTER_CRITICAL_SECTION(his); P1DIR |= BV(3); #endif XNV_SPI_BEGIN(); do { xnvSPIWrite(XNV_STAT_CMD); } while (XNV_SPI_RX() & XNV_STAT_WIP); XNV_SPI_END(); asm("NOP"); asm("NOP"); XNV_SPI_BEGIN(); xnvSPIWrite(XNV_READ_CMD); xnvSPIWrite(addr >> 16); xnvSPIWrite(addr >> 8); xnvSPIWrite(addr); xnvSPIWrite(0); while (len--) { xnvSPIWrite(0); *pBuf++ = XNV_SPI_RX(); } XNV_SPI_END(); #if !HAL_OAD_BOOT_CODE P1DIR = shdw; HAL_EXIT_CRITICAL_SECTION(his); #endif }
/****************************************************************************** * @fn HalSPIWrite * * @brief Write to the external NV storage via SPI. * * @param addr - Offset into the external NV. * @param pBuf - Pointer to the buffer in from which to write bytes to external NV. * @param len - Number of bytes to write to external NV. * * @return None. *****************************************************************************/ static void HalSPIWrite(uint32 addr, uint8 *pBuf, uint16 len) { uint8 cnt; #if !HAL_OTA_BOOT_CODE uint8 shdw = P1DIR; halIntState_t his; HAL_ENTER_CRITICAL_SECTION(his); P1DIR |= BV(3); #endif while (len) { XNV_SPI_BEGIN(); do { xnvSPIWrite(XNV_STAT_CMD); } while (XNV_SPI_RX() & XNV_STAT_WIP); XNV_SPI_END(); asm("NOP"); asm("NOP"); XNV_SPI_BEGIN(); xnvSPIWrite(XNV_WREN_CMD); XNV_SPI_END(); asm("NOP"); asm("NOP"); XNV_SPI_BEGIN(); xnvSPIWrite(XNV_WRPG_CMD); xnvSPIWrite(addr >> 16); xnvSPIWrite(addr >> 8); xnvSPIWrite(addr); // Can only write within any one page boundary, so prepare for next page write if bytes remain. cnt = 0 - (uint8)addr; if (cnt) { addr += cnt; } else { addr += 256; } do { xnvSPIWrite(*pBuf++); cnt--; len--; } while (len && cnt); XNV_SPI_END(); } #if !HAL_OTA_BOOT_CODE P1DIR = shdw; HAL_EXIT_CRITICAL_SECTION(his); #endif }
void HalSPIWrite(uint32 addr, uint8 *pBuf, uint16 len) { uint8 cnt; uint8 shdw = P1DIR; P1DIR |= BV(3); while (len) { XNV_SPI_BEGIN(); do { xnvSPIWrite(XNV_STAT_CMD); } while (XNV_SPI_RX() & XNV_STAT_WIP); XNV_SPI_END(); asm("NOP"); asm("NOP"); XNV_SPI_BEGIN(); xnvSPIWrite(XNV_WREN_CMD); XNV_SPI_END(); asm("NOP"); asm("NOP"); XNV_SPI_BEGIN(); xnvSPIWrite(XNV_WRPG_CMD); xnvSPIWrite(addr >> 16); xnvSPIWrite(addr >> 8); xnvSPIWrite(addr); // Can only write within any one page boundary, so prepare for next page write if bytes remain. cnt = 0 - (uint8)addr; if (cnt) { addr += cnt; } else { addr += 256; } do { xnvSPIWrite(*pBuf++); cnt--; len--; } while (len && cnt); XNV_SPI_END(); } P1DIR = shdw; }
void HalSPIErase() { XNV_SPI_BEGIN(); do { xnvSPIWrite(XNV_STAT_CMD); } while (XNV_SPI_RX() & XNV_STAT_WIP); XNV_SPI_END(); asm("NOP"); asm("NOP"); XNV_SPI_BEGIN(); xnvSPIWrite(XNV_WREN_CMD); XNV_SPI_END(); asm("NOP"); asm("NOP"); XNV_SPI_BEGIN(); xnvSPIWrite(XNV_ERASE_CMD); XNV_SPI_END(); asm("NOP"); asm("NOP"); }