fbscici 发表于 2009-6-16 12:45:12

用AVR配置XC2S100不成功的原因

我用AVR M64对XC2S100使用从串模式配置,但DONE一直为0,想不明白原因,M64的晶振频率是16MHz
还有个想不明白的问题,不管数据是从高位开始还是低位开始或者乱发数据,INIT始终=1,但是PROGRAM=0的时候,INIT也=0,
PROGRAM=1的时候,INIT也=1.
按照数据手册上说,FPGA CRC校验错,INIT会=0,但是除了一开始PROGRAM=0,INIT也=0的时候,之后的INIT都是=1
void FPGA_Configure(void)
{
    WORD i;
    BYTE Configure_flag=0,Rec_Con_Data_Flag=0;
    BYTE Con_Data;
    BYTE FPGA_Data_Count=0xff;
    BYTE j;
   
    D0_1;//DIN=1
    for(i=0;i<10;i++)
    {
      PROGRAM_0;//PROGRAM=0
      delay_us(10);

      PROGRAM_1;
      delay_us(10);
      if(PIND&0x1)//检测INIT//FPGA_INT=1 检测INIT信号,如果为“1”,表明FPGA的Memory检测完毕,,可开始进行配置。
      {         //当INIT在4us内未置高,FPGA需要重新配置。
            Configure_flag=1;
            break;
      }   
    }
   
    ACK_Master(CONFIGURE_FPGA,'!',1,&Configure_flag);
   
    if(!Configure_flag)//配置失败
    {
      FPGA_Configure_Flag=FALSE;
      return;
    }   
   
    do
    {
      CleanRam(100,&Con_Data);      
      if(Recv_FPGA_Data(&FPGA_Data_Count,&Con_Data)==FALSE)//接收FPGA数据的个数+具体数据
      {            
            FPGA_Configure_Flag=FALSE;         
            ACK_Master(CONFIGURE_FPGA,'?',0,&Con_Data);//应答主控接收数据失败
            return;            
      }   
            
      
      if(FPGA_Data_Count==0)//数据接收完成
      {
            Rec_Con_Data_Flag=TRUE;               
            break;
      }            
            
      for(i=0;i<FPGA_Data_Count;i++)
      {
            for(j=0;j<8;j++)
            {
                CLK_0;//
                  
                                                                     //延时(45ns以上)。
                if(Con_Data&0x80)//从高位开始
                  D0_1;
                else
                  D0_0;
                Con_Data<<=1;//从高位开始
                CLK_0;
                CLK_1;
                //CLK_1;
                asm("nop");
                asm("nop");
                  
               
            }   
            if((PIND&0x1)==0)//若INIT=‘0’,FPGA需要重新配置。
            {                                       
                FPGA_Configure_Flag=FALSE;
                ACK_Master(CONFIGURE_FPGA,'&',0,&Con_Data);//应答主控失败
                return;                  
            }   
      }
      ACK_Master(CONFIGURE_FPGA,'!',0,&Con_Data);//应答主控OK
                           
      asm("WDR");//喂狗
    }while(1);
    if(Rec_Con_Data_Flag)
    {
      //delay_nms(100);
      for(i=0;i<100;i++)
      {
            CLK_0;
            //asm("nop");
            //asm("nop");
            CLK_1;
            //asm("nop");
            //asm("nop");
            if((PIND&0x1)==0)//若INIT=‘0’,FPGA需要重新配置。
            {
               Configure_flag=0;
               ACK_Master(CONFIGURE_FPGA,'*',0,&Con_Data);
               return;               
            }
      
            if(PIND&0x20)   //继续送出时钟信号,并等待DONE置高
            {
               Configure_flag=1;
               ACK_Master(CONFIGURE_FPGA,'!',0,&Con_Data);
               return;                  
            }
            asm("WDR");
      }

      
    }
   
    ACK_Master(CONFIGURE_FPGA,'#',0,&Con_Data);   
      
}
MO,M1,M2分别串4.7K电阻到3.3V,PROGRAM,INIT,DONE也分别串4.7K电阻到3.3V
因为FPGA的程序不是我编写的,所以不知道FPGA程序本身是否还要注意什么问题。因为我是第一次对FPGA进行配置,所以还请高手们多多指教!谢谢!

zkf0100007 发表于 2009-6-16 23:35:28

电阻阻值不一定全是4.7K的,具体要查一下手册

DanielDeng 发表于 2009-6-17 08:37:28

PROGRAM,INIT,DONE的上拉该是没关系的。
MO,M1,M2分别串4.7K电阻到3.3V--这似乎是主串模式。。。

fbscici 发表于 2009-6-17 12:24:34

主串是M0,M1都是0
http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_454016.jpg
(原文件名:2S100.jpg)

fbscici 发表于 2009-6-17 16:59:52

找到问题的原因了,原来是程序开了SPI功能,刚好CLK又与SPI的SCK共用,所以整个配置过程时钟信号都是不受控制的
现在关了SPI功能就OK了

mcuprogram 发表于 2013-8-28 14:39:47

{:lol:}{:lol:}{:lol:}
页: [1]
查看完整版本: 用AVR配置XC2S100不成功的原因