Files
2026-06-06 16:49:48 +08:00

230 lines
6.6 KiB
C

/*!
* \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");
}