/*! * \file fmc_spi.c * * \brief Target fmc spi implementation * * \copyright Revised BSD License, see section \ref LICENSE. * * \code * * _ __ _ ________ _ * | |/ /(_)___ / ____/ /_ (_)___ * | // / __ \/ / / __ \/ / __ \ * / |/ / / / / /___/ / / / / /_/ / * /_/|_/_/_/ /_/\____/_/ /_/_/ .___/ * /_/ * (C) 2022-2025 XinChip * * \endcode * * \author ( XinChip ) Alex-J * * \author ( XinChip ) */ /*----------------------------------------------------------------------------------- INCLUDE HEADE FILES ------------------------------------------------------------------------------------*/ #include "fmc_spi.h" #include "xc6xxx_fmc_spi.h" #include "xc6xxx_fmc_spi_dma.h" /*------------------------------------------------------------------------------------ Macros -------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------ Global Variables -------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------ Functions -------------------------------------------------------------------------------------*/ /** **************************************************************************************** * @brief * * @param[in] * @param[in] **************************************************************************************** */ __RAM_CODE void fmc_spi_demo(void) { FMC_SPI_Init_Oprt(); FMC_SPI_Flash_WakeUp(); uint32_t mid = 0; FMC_SPI_Flash_RDID((uint8_t *)&mid); DEBUG("Flash RDID: 0x%08x\n", mid); uint8_t ruid[16]; FMC_SPI_Flash_RUID(ruid); DEBUG("Flash RUID: "); for (int i = 0; i < 16; i++) { DEBUG("%02x ", ruid[i]); } DEBUG("\n"); #if 1 uint8_t data[FLASH_PAGE_SIZE]; FMC_SPI_Flash_Erase_Sector(0x19000); DEBUG("Flash_Erase\n"); FMC_SPI_Flash_ReadPage(0x19000, data, FLASH_PAGE_SIZE); DEBUG("Flash Read data: \n"); for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++) { DEBUG("%02x ", data[i]); } DEBUG("\n"); for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++) { data[i] = i; } data[0] = 88; for (uint8_t i = 0; i < 16; i++) { FMC_SPI_Flash_WritePage(0x19000 + i * FLASH_PAGE_SIZE, data, FLASH_PAGE_SIZE); data[0]++; } DEBUG("Flash Write finished!\n"); for (uint8_t i = 0; i < 16; i++) { for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++) { data[i] = 0xff; } FMC_SPI_Flash_ReadPage(0x19000 + i * FLASH_PAGE_SIZE, data, FLASH_PAGE_SIZE); DEBUG("Flash Read finished%d: \n", i); for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++) { DEBUG("%02x ", data[i]); } DEBUG("\n"); } uint8_t w_buff[716]; FMC_SPI_Flash_Erase_Sector(0x19000); for (uint16_t i = 0; i < sizeof(w_buff); i++) w_buff[i] = 0x33; FMC_SPI_FlashWrite(0x19000 + 57, w_buff, sizeof(w_buff)); DEBUG("Flash Write Any finish\n"); uint8_t r_buff[1024]; FMC_SPI_FlashRead(0x19000, r_buff, sizeof(r_buff)); DEBUG("Flash Read Any addr: \n"); for (uint16_t i = 0; i < sizeof(r_buff); i++) DEBUG("%02x ", r_buff[i]); DEBUG("\n"); FMC_SPI_Flash_Erase_Sector(0x19000); for (uint16_t i = 0; i < sizeof(w_buff); i++) w_buff[i] = 0x66; FMC_SPI_FlashWrite(0x19000 + 176, w_buff, 120); DEBUG("Flash Write Any finish2\n"); FMC_SPI_FlashRead(0x19000 + 176, r_buff, sizeof(r_buff)); DEBUG("Flash Read Any addr2: \n"); for (uint16_t i = 0; i < sizeof(r_buff); i++) DEBUG("%02x ", r_buff[i]); DEBUG("\n"); #endif } /** **************************************************************************************** * @brief * * @param[in] * @param[in] * @return[out] * **************************************************************************************** */ __RAM_CODE void fmc_spi_dma_demo(void) { DEBUG("__FMC_SPI_DEMO__\n"); FMC_SPI_Init(); // DEBUG("__FMC_SPI_Init_End__\n"); #if (DMAC_NVIC_ENABLE == 1) NVIC_EnableIRQ(DMA_IRQn); #endif // DEBUG("__DMA_IRQ_Enable__\n"); FMC_SPI_DMA_Flash_WakeUp(XC_FMC); // DEBUG("__FMC_SPI_FLash_Wakeup__\n"); uint32_t mid = 0; // FMC_SPI_Flash_Read_RDID(XC_FMC, (uint8_t*)&mid); FMC_SPI_DMA_Flash_RDID(XC_FMC, (uint8_t *)&mid); // FMC_QSPI_DMA_Flash_QREMS(XC_FMC, (uint8_t*)&mid); DEBUG("Flash RDID: 0x%08x\n", mid); uint8_t ruid[16]; FMC_SPI_DMA_Flash_RUID(XC_FMC, ruid); DEBUG("Flash RUID: "); for (int i = 0; i < 16; i++) { PRINT("%02x ", ruid[i]); } PRINT("\n"); uint8_t data[FLASH_PAGE_SIZE]; FMC_SPI_DMA_Flash_Erase_Sector(XC_FMC, 0x19000); DEBUG("Flash_Erase\n"); FMC_SPI_DMA_Flash_ReadPage(XC_FMC, 0x19000, data, FLASH_PAGE_SIZE); DEBUG("Flash Read data: \n"); for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++) { PRINT("%02x ", data[i]); } PRINT("\n"); for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++) { data[i] = i; } data[0] = 88; for (uint8_t i = 0; i < 16; i++) { FMC_SPI_DMA_Flash_WritePage(XC_FMC, 0x19000 + i * FLASH_PAGE_SIZE, data, FLASH_PAGE_SIZE); data[0]++; } DEBUG("Flash Write finished!\n"); for (uint8_t i = 0; i < 16; i++) { #if (USE_XIP == 1) for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++) { data[i] = 0xff; } #else memset(data, 0xff, FLASH_PAGE_SIZE); #endif FMC_SPI_DMA_Flash_ReadPage(XC_FMC, 0x19000 + i * FLASH_PAGE_SIZE, data, FLASH_PAGE_SIZE); DEBUG("Flash Read finished%d: \n", i); for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++) { PRINT("%02x ", data[i]); } PRINT("\n"); } uint8_t w_buff[716]; memset(w_buff, 0x33, sizeof(w_buff)); FMC_SPI_DMA_FlashWrite(XC_FMC, 0x19000 + 57, w_buff, sizeof(w_buff)); DEBUG("Flash Write Any finish\n"); uint8_t r_buff[1024]; FMC_SPI_DMA_FlashRead(XC_FMC, 0x19000, r_buff, sizeof(r_buff)); DEBUG("Flash Read Any addr: \n"); for (uint16_t i = 0; i < sizeof(r_buff); i++) PRINT("%02x ", r_buff[i]); PRINT("\n"); memset(w_buff, 0x66, sizeof(w_buff)); FMC_SPI_DMA_FlashWrite(XC_FMC, 0x19000 + 176, w_buff, 120); DEBUG("Flash Write Any finish2\n"); FMC_SPI_DMA_FlashRead(XC_FMC, 0x19000, r_buff, sizeof(r_buff)); DEBUG("Flash Read Any addr2: \n"); for (uint16_t i = 0; i < sizeof(r_buff); i++) PRINT("%02x ", r_buff[i]); PRINT("\n"); }