📄 fpgaloading.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 + -