230 lines
6.6 KiB
C
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");
|
|
}
|