//эта функция читает из фрам через SPI в буфер flashBuffIn не более SIZE_BUF_FLASH байт //после чтения из буфера flashBuffIn копируется в destination void flashMx25Read(void *destination, uint32_t adrSource, uint16_t size) { xSemaphoreTake(mutexFlash, portMAX_DELAY); if( !isInitial ) initSpi2(); uint16_t status; do { status = spiRDSR(); } while(status & 1); if( size > SIZE_BUF_FLASH ) { xSemaphoreGive(mutexFlash); return; } DMA_MemoryTargetConfig(DMA1_Stream3, (uint32_t)flashBuffIn, 0); flashBuffOut[0] = 3; //Command Read flashBuffOut[1] = adrSource >> 16; flashBuffOut[2] = adrSource >> 8; flashBuffOut[3] = adrSource; startSpi(size + 4); spiWait(); memcpy(destination, (void*)(flashBuffIn + 4), size); xSemaphoreGive(mutexFlash); }
void spiChipErase() { xSemaphoreTake(mutexFlash, portMAX_DELAY); if( !isInitial ) initSpi2(); uint16_t status; do { status = spiRDSR(); } while(status & 1); spiWREN(); flashBuffOut[0] = 0x60; startSpi(1); spiWait(); xSemaphoreGive(mutexFlash); }
bool spiInit(SPI_TypeDef *instance) { #if (!(defined(USE_SPI_DEVICE_1) && defined(USE_SPI_DEVICE_2))) UNUSED(instance); #endif #ifdef USE_SPI_DEVICE_1 if (instance == SPI1) { initSpi1(); return true; } #endif #ifdef USE_SPI_DEVICE_2 if (instance == SPI2) { initSpi2(); return true; } #endif return false; }
void flashMx25Write(uint8_t *source, uint32_t adrDestination) //пишет во флешку 256 байт { xSemaphoreTake(mutexFlash, portMAX_DELAY); if( !isInitial ) initSpi2(); uint16_t status; do { status = spiRDSR(); } while(status & 1); spiWREN(); flashBuffOut[0] = 2; //Command Page Programm flashBuffOut[1] = adrDestination >> 16; flashBuffOut[2] = adrDestination >> 8; flashBuffOut[3] = adrDestination; memcpy((void*)(flashBuffOut + 4), (void*)source, 256); startSpi(SIZE_BUF_FLASH); spiWait(); xSemaphoreGive(mutexFlash); }
void spiSector4kErase(uint32_t numSector) { xSemaphoreTake(mutexFlash, portMAX_DELAY); if( !isInitial ) initSpi2(); uint16_t status; do { status = spiRDSR(); } while(status & 1); spiWREN(); flashBuffOut[0] = 0x20; flashBuffOut[1] = numSector >> 16; flashBuffOut[2] = numSector >> 8; flashBuffOut[3] = numSector; startSpi(4); spiWait(); xSemaphoreGive(mutexFlash); }