⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpgaloading.c

📁 利用ARM的GPIO和SPI总线进行FPGA的被动串行配置
💻 C
字号:
/*******************************************************************************
** Filename:    FPGALoading.c
** Author:      Zhoudan
** Description: Use GPIO or SPI to Loading FPGA Program
** Data/Time:   2007-06-05
** Environment: LPC2214/RVDSv2.2
*******************************************************************************/

#include "config.h"

#define LOAD_USE_IO     0

#if LOAD_USE_IO
void Init_IO(void)
{
    IO0DIR |= (DCLK | DATA);
    
    DCLK_LOW();
    DATA_LOW();
}
#else
void Init_SPI(void)
{
    PINSEL0 |= (SPI0_SCK | SPI0_MOSI | SPI0_SSEL);
    
    S0PCCR = 8;
    S0PCR = MSTR | LSBF;
}
#endif

void FPGA_LoadInit(void)
{
#if LOAD_USE_IO
    Init_IO();
#else
    Init_SPI();
#endif
    
    PINSEL1 &= ~(P019_CONF_DONE);
    IO0DIR &= ~(CONF_DONE | n_STATUS);
    
    IO1DIR |= nCONFIG;
    CONFIG_HIGH();
    DelayNS(1000);
}

/*******************************************************************************
* Function:     FPGALoading()
* Description:  Network Management Protocol Initialize
* Called By:    TaskNMPInput()
* Input:        None
* Return:       None
*******************************************************************************/
bool FPGA_LoadProg(uint8 *data_buf, uint32 len)	//入口:加载数据,数据长度
{
    uint8 i, j;
#if LOAD_USE_IO
    uint8 ConfData;
#endif
    
    FPGA_LoadInit();

    //判断nSTATUS信号是否一开始就为低,为低说明FPGA上电不正常,还处于POR状态
    if(!nSTATUS())
    {
        SendStr("\n\rnSTATUS is LOW before config!");
        return FALSE;
    }

    //////FPGA 配置启动时序
        //拉低nCONFIG信号,然后判断nSTATUS信号是否为低,为低后拉高nCONFIG信号
    nCONFIG_LOW();
    for(j = 0; j < 100 && nSTATUS(); j++);
    if(j == 100)	//nSTATUS信号一直为高,没能进入配置状态
    {
        SendStr("\n\rnSTATUS always LOW.");
        return FALSE;
    }
    nCONFIG_HIGH();
    
    //等待nSTATUS信号变高
    for(j = 0; j < 100 && !nSTATUS(); j++);
    if(j == 100)
    {
        SendStr("\n\rnSTATUS always LOW.");
        return FALSE;
    }
    
    for(j = 0; j < 20; j++);    //nSTATUS信号变高后延时1uS
    //////FPGA 配置启动时序结束
    
    for (i = 0; i < len; i++)
    {
#if LOAD_USE_IO
        ConfData = data_buf[i];

        for(j = 0; j < 8; j++)
        {
            if(ConfData & 0x01)	//根据数据内容,翻转I/O电平
                DATA_HIGH();
            else
                DATA_LOW();
            
            DCLK_HIGH();		//输出时钟信号
            ConfData >>= 1;		//数据右移1位
            DCLK_LOW();
        }
#else
        S0PDR = data_buf[i];		//将数据送到SPI发送寄存器
        while (!(S0PSR & SPIF));	//等待发送成功标志
#endif
    }

    if (!CONF_DOWN())	//加载完后判断CONF_DONE信号是否为高
    {
        return FALSE;
    }
    
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -