|
LPC2000内部FLASH比较大,在应用程序中定义一个比较大的数组,数据为RBF文件转换,可以在编译时用数据压缩使数组更小一些。利用SPI端口PS方式配置FPGA可以使应用板更简单些,成本更低一些。此程序在LPC2294和Cyclone II EP2C8中测试完成。稍加更改可以使用在其他的较大FLASH的MCU中。
void SPI1_INIT(void)
{
S1SPCCR = 8; //分配SPI时钟为VPB总线的N分频
S1SPCR |= ((0 << 7) | (1 << 6) | (1 << 5) | (0 << 4) | (0 << 3));//SPI 0模式 FPGA
nCONFIG_DDR |= nCONFIG_PIN; //指定START CONFIG脚为输出
nCONFIG_HIGH; //恒定高电平,数据暂不传输
}
const unsigned char FPGA_CONFIG_DATA[] = //FPGA_CONIG_DATA数组
{
//数据省略
};
unsigned char FPGA_Config(void)
{
unsigned long data_size,error_fpga,error_spi,out_time,i;
unsigned long FPGA_CONFIG_DATA_SIZE;
FPGA_CONFIG_DATA_SIZE = sizeof(FPGA_CONFIG_DATA);//获取FPGA_CONIG_DATA数组的长度(数组长度不定)
data_size = 0; //FPGA数据指针初始化
error_fpga = 10; //设置FPGA配置错误次数
error_spi = 0; //SPI传输错误标志
if (FPGA_MSEL==0)
{
return 1; //外部跳线为低电平,JTAG模式,不用CPU来配置。
}
nCONFIG_LOW; //置nCONFIG引脚为低,准备开始配置
out_time = 0xfff;
while (nSTATUS==1)//等待器件nSTATUS引脚低电平响应(最长可能要等800nS)
{
out_time--;
if (out_time==0)
{
return 0; //没有FPGA器件或FPGA器件损坏
}
}
Delay_FPGA_2us(); //FPGA配置初始化最少要等2uS
nCONFIG_HIGH; //FPGA配置初始化完成,nCONIG引脚置高,准备传输配置数据
out_time = 0xfff;
while (nSTATUS==0)//等待FPGA器件nSTATUS引脚高电平响应(最长可能要等40uS)
{
out_time--;
if (out_time==0)
{
return 0; //FPGA配置失败或FPGA器件损坏
}
}
Delay_FPGA_2us(); //器件响应后最少要1uS后才能发送第1个字节的数据
while ((data_size!=FPGA_CONFIG_DATA_SIZE)&&(error_fpga!=0))//等待配置数据传送完毕或错误计数太多
{
S1SPDR= FPGA_CONFIG_DATA[data_size]; //发送FPGA配置数据
if (Wait_SPI1()==1) //等待SPI传输完毕
{
error_spi=1; //SPI传输错误
}
data_size++; //FPGA数据指针++
if (data_size==FPGA_CONFIG_DATA_SIZE)
{
Delay_FPGA_2us(); //FPGA配置完成后等待一下CONF_DONE为高电平
}
if ((nSTATUS==0)||((data_size==FPGA_CONFIG_DATA_SIZE)&&(CONF_DONE==0))||(error_spi==1))
{//如果发现nSTATE引脚为低 或发完数据但CONF_DONE没有高 或SPI传输错误,则进行FPGA重新配置
error_spi = 0;
nCONFIG_LOW;
Delay_FPGA_2us();
nCONFIG_HIGH; //配置引脚初始化
while (nSTATUS==0); //等待器件响应(最长可能要等40uS)
Delay_FPGA_2us(); //器件响应后最少要1uS后才能发送第1个字节的数据
data_size = 0; //数据指针复位
error_fpga--; //错误计数器
}
}
if (error_fpga==0)
{
return 0; //fpga配置失败
}
else
{
for (i=0; i<255; i++)//配置完成,输入空脉冲时钟,等待最多40uS后进入用户模式
{
S1SPDR = 0x00;
while(!(S1SPSR &0x80));
}
return 2; //fpga配置成功
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|