搜索
bottom↓
回复: 11

使用LPC2000的SPI端口PS方式配置FPGA程序(测试完成)

[复制链接]

出0入0汤圆

发表于 2009-12-25 21:07:34 | 显示全部楼层 |阅读模式
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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-12-25 21:16:06 | 显示全部楼层
使用自编的这个程序可以把文件转换为文本文件,用于大的数组创建。

(原文件名:bin2txt.JPG)

点击此处下载 ourdev_518800.rar(文件大小:297K) (原文件名:Bin2Txt.rar)

出0入0汤圆

发表于 2009-12-25 21:24:08 | 显示全部楼层
THANKS!

出0入0汤圆

发表于 2009-12-30 15:47:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-30 16:25:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-1 20:25:26 | 显示全部楼层
xilinx

出0入0汤圆

发表于 2012-8-3 16:15:30 | 显示全部楼层
好工具!谢谢!

出0入0汤圆

发表于 2014-11-3 12:52:14 | 显示全部楼层
正在做类似方案,谢谢楼主分享!

出0入0汤圆

发表于 2015-11-17 10:18:36 | 显示全部楼层
非常感谢。正在考虑使用这个功能配置FPGA。
谢谢您的程序

出0入0汤圆

发表于 2016-1-16 13:19:03 | 显示全部楼层
感谢,Mark。

出0入0汤圆

发表于 2016-1-17 17:30:09 来自手机 | 显示全部楼层
不知道是否适用cyclone4系列,QII的输出文件格式有什么要求吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 06:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表