|
楼主 |
发表于 2009-8-15 17:18:10
|
显示全部楼层
for(i=0;i<FPGA_Data_Count;i++)
{
/*
按下列步骤操作I/O口线,即可完成对FPGA的配置:
1. nCONFIG="0"、DCLK="0",保持2μS以上。
2. 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错。正常情况下,nCONFIG="0"后1μS内nSTATUS将为"0"。
3. nCONFIG="1",并等待5μS。
4. Data0上放置数据(LSB first),DCLK="1",延时。
5. DCLK="0",并检测nSTATUS,若为"0",则报错并重新开始。
6. 准备下一位数据,并重复执行步骤4、5,直到所有数据送出为止。
7. 此时Conf_done应变成"1",表明FPGA的配置已完成。如果所有数据送出后,Conf_done不为"1",必须重新配置(从步骤1开始)。
8. 配置完成后,再送出10个周期的DCLK,以使FPGA完成初始化。
*/
for(j=0;j<8;j++)
{
DCLK_0;//DATA0 pin at each rising edge of DCLK.
if(Con_Data&0x1)//从低位开始
FPGA_D0_1;
else
FPGA_D0_0;
DCLK_1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
Con_Data>>=1;//从低位开始
}
asm("WDR");//喂狗
j=0;
while(1)
{
if((PINB&0x40)==0)//nSTATUS=0 FPGA需要重新配置。
{
j++;
if(j>100)
{
ACK_Master(CONFIGURE_FPGA,'&',0,&Con_Data[0]);//应答主控失败
return;
}
}
else//nSTATUS=1
break;
}
}
ACK_Master(CONFIGURE_FPGA,'!',0,&Con_Data[0]);//应答主控OK
}while(1);
if(Rec_Con_Data_Flag)
{
for(i=0;i<100;i++)
{
asm("nop");
DCLK_1;
asm("nop");
DCLK_0;
}
if(PINB&0x20)//Conf_done应变成"1",表明FPGA的配置已完成。
{
for(i=0;i<100;i++)//8. 配置完成后,再送出10个周期的DCLK,以使FPGA完成初始化。
{
asm("nop");
DCLK_1;
asm("nop");
DCLK_0;
}
//Configure_flag=1;
asm("WDR");
ACK_Master(CONFIGURE_FPGA,'!',0,&Con_Data[0]);
return;
}
}
这是我的程序 |
|