EPCS器件,此处主要是EPCS1、EPCS4,EPCS1、EPCS4其实是一种特殊的Flash,Altera称之为稳定性比较高的SPI FLASH。

如果我们使用一些万能编程器测试EPCS的话,会被认为是M25PXX系列的,比如说EPCS1被认为M25P10A的器件。

此处使用了STM32,两路SPI,SPI1和SPI2来分别进行读和进行写。

初始化函数如下

void ReadSPIInit()       //SPI1
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_SPI1, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           //NCSGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE); /* Configure SPI1 pins: SCK, MISO and MOSI */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* SPI1 configuration */SPI_Cmd(SPI1, DISABLE); SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode=SPI_Mode_Master;SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16;SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;SPI_Init(SPI1,&SPI_InitStructure);/* Enable SPI1  */SPI_Cmd(SPI1, ENABLE);}
void WriteSPIInit() //SPI2
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            //NCS           PB12接1,PB13接6,PB14接2,PB15接5,GND接4,VCC接3 7 8GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//GPIO_PinRemapConfig(GPIO_Remap_SPI1,ENABLE); /* Configure SPI1 pins: SCK, MISO and MOSI */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;           //adsi接mosi,data接misoGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/* SPI1 configuration */SPI_Cmd(SPI2, DISABLE); SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode=SPI_Mode_Master;SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_32;SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;SPI_Init(SPI2,&SPI_InitStructure);/* Enable SPI1  */SPI_Cmd(SPI2, ENABLE);
}

之后是底层操作函数,使用库函数的SPI读写进行的封装的:

unsigned char SPI1_ReadWriteByte(unsigned char TxData)
{       unsigned char retry=0;              while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET){retry++;if(retry>200)return 0;}             SPI_I2S_SendData(SPI1,TxData);retry=0;while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET){retry++;if(retry>200)return 0;}                               return SPI_I2S_ReceiveData(SPI1);
}
unsigned char SPI2_ReadWriteByte(unsigned char TxData)
{       unsigned char retry=0;              while (SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE) == RESET) {retry++;if(retry>200)return 0;}            SPI_I2S_SendData(SPI2,TxData);retry=0;while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE) == RESET){retry++;if(retry>200)return 0;}                               return SPI_I2S_ReceiveData(SPI2);
}

第一部是读id,epcs1的id是0x10,epcs2的是0x12

u8 ReadID1()
{u8 id;CL_CS1;SPI1_ReadWriteByte(0xab);     //读id指令SPI1_ReadWriteByte(0xff);        //三个虚拟字节SPI1_ReadWriteByte(0xff);       SPI1_ReadWriteByte(0xff);id=SPI1_ReadWriteByte(0xff);      //读出idSE_CS1;if(id==0x12)return 1;elsereturn 0;}

之后是检查忙函数,读status函数,去除写保护以及写使能函数

u8 Whilebusy()//检查是否忙
{CL_CS2;SPI2_ReadWriteByte(0x5);        //读状态指令while(SPI2_ReadWriteByte(0xff)&0x01)     //wip=1的时候正在工作,=0的时候完成工作SE_CS2;
}
u8 ReadStatus()//检查是否忙
{u8 sta;CL_CS2;SPI2_ReadWriteByte(0x5);     //读状态指令sta=SPI2_ReadWriteByte(0xff);       //wip=1的时候正在工作,=0的时候完成工作SE_CS2;return sta;
}
void DisableProt2()//写操作和擦出操作前执行WEL置1,同时清除写保护
{CL_CS2;SPI2_ReadWriteByte(0x1);        //写状态指令SPI2_ReadWriteByte(0x02);        //WEL置1,其他置0;SE_CS2; delay_ms(30);
}
void EnalbeProt1()  //开启写保护,防止误写
{CL_CS1;SPI1_ReadWriteByte(0x1);        //写状态指令SPI1_ReadWriteByte(0x1c);        //WEL置1,其他置0;SE_CS1;
}
void WriteE()
{CL_CS2;SPI2_ReadWriteByte(0x6);        //写状态指令SE_CS2;  delay_ms(30);
}

之后是读函数和写函数,注意写函数一次写的不能超过256

void Readbytes2(u32 add,u8 * data,u16 len)
{u16 i;CL_CS2;SPI2_ReadWriteByte(0x3);      //读字节指令SPI2_ReadWriteByte(add>>16);       //地址SPI2_ReadWriteByte(add>>8);       //地址    SPI2_ReadWriteByte(add);        //地址for(i=0;i<len;i++){data[i]=SPI2_ReadWriteByte(0xff);}SE_CS2;
}
void Writebytes2(u32 add,u8 * data,u16 len)
{u16 i;CL_CS2;SPI2_ReadWriteByte(0x2);      //写字节指令SPI2_ReadWriteByte(add>>16);       //地址SPI2_ReadWriteByte(add>>8);       //地址    SPI2_ReadWriteByte(add);        //地址for(i=0;i<len;i++){SPI2_ReadWriteByte(data[i]);}SE_CS2;
}

STM32读写FPGA存储器EPCS器件(EPCS1、EPCS4)相关推荐

  1. FPGA配置芯片EPCS读写操作--STM32读写

    注意事项: (1)首先STM32需要设置nCE和nConfig信号,即nCE置高,nConfig拉低,获得EPCS的控制权,而后对EPCS操作,操作完成后需要释放这两个管脚,即nCE拉低,nConfi ...

  2. stm32采集脉冲信号_基于STM32+FPGA的数据采集系统的设计与实现

    引言 由于火控系统工作环境特殊,所需采集信号复杂多样,传统的以微控制器或PC为主的采集系统往往难以胜任.针对上述问题,提出了一种基于STM32+FPGA的数据采集系统的设计方案,该方案不仅能够完成对多 ...

  3. 使用Flash Loader(JTAG模式)下载EPCS器件

    一般来说Altera公司Cyclone或者CycloneII系列FPGA相应的配置器件会选择EPCS系列串行FLASH.一般使用AS模式下载EPCS系列器件.但有时候可能遇到AS模式不能成功下载的案例 ...

  4. FPGA的EPCS 配置的2种方法 FPGA下载程序的方法(EPCS)

    使用主动串行配置模式对Cyclone FPGA进行配置前,必须将配置文件写入串行配置器件EPCS.将配置文件写入EPCS的方法有三种: (1)在Quartus II的Programmer中,通过专门与 ...

  5. 基于STM32 ARM+ FPGA 的软体机器人的 CAN总线运动控制器的设计

    针对在软体机器人控制时 , 多电机协同控制过程中难度大 . 通用性差 . 协同性差等缺点 , 设计了基于 ARM 和 FPGA 的软体机器人的控制器局域网络 ( controller area net ...

  6. FPGA存储器DDR5简介

    1.1 FPGA存储器DDR5简介 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA存储器DDR5简介: 5)结束语. 1.1.2 本节引言 "不积跬步 ...

  7. QII中,用JTAG接口配置EPCS器件

    用JTAG接口配置EPCS器件,具体操作步骤如下: 1.在QuartusII中打开工程,然后编译链接,生成JTAG配置文件.sof: 2.选择File->Convert Programming ...

  8. 基于STM32 ARM+FPGA的电能质量分析仪方案(二)软件设计

    本部分主要介绍 FPGA+ARM 控制部分的软件设计. FPGA+ARM 控制部分包括 Verilog HDL 硬件描述语言和 C 语言的开发. FPGA 部分主要控制 AD7606 模数转换.数字三 ...

  9. chipsel语言_用VHDL语言对FPGA和CPLD器件进行开发时应注意的事项

    第25卷第4期苏 州 大 学 学 报(工 科 版)Vol.25No.4 2005年8月JOURNA L OF SOOCH OW UNIVERSIT Y(ENGINEERING SCIENCE E DI ...

  10. UPP协议转AXI4协议的burst读写FPGA实现

    UPP协议转AXI4协议的burst读写FPGA实现 名字是按标准协议命名的,细节都在图里,有兴趣的朋友自己看下,或者私信我,欢迎批评指正! Burst 读和写 写数据 读数据

最新文章

  1. 对物联网操作系统特征和定位的思考
  2. Java的回调机制--学习笔记
  3. JAVA复习( StringBuffer 和 StringBuilder)
  4. mysql storage_mySQL__storage课堂笔记和练习
  5. 基于SSM + Redis的Shiro权限管理项目
  6. matplotlib动态图和视频保存
  7. Scala基础 - 函数和方法的区别
  8. cisco4503端口镜像配置
  9. python:使用requests,bs4爬取mmjpg上的图片
  10. 经验:OrCAD Capture卡顿问题的解决方法
  11. 项目管理之敏捷开发之道
  12. mysqldump 使用 --set-gtid-purged
  13. [异能程序员]第二章 上头条(第二更)
  14. discuz仿163k_discuz仿163K四色地方门户模板,仿163K地方模板,地方门户模板
  15. boost - 智能指针介绍
  16. Python入门习题(64)——OpenJudge百练习题:最长单词
  17. win7系统计算机文件夹缓慢,win7系统搜索文件很慢的两种解决方法
  18. 风场可视化:绘制轨迹
  19. MATLAB创建音乐《光年之外》
  20. C语言:用贪心策略计算活动安排问题的最优解

热门文章

  1. 怎么让模糊的数字变清楚_用ps怎么把模糊的字变清晰
  2. 新版 OPPO Enco Free 2 固件工具 (仅供交流学习使用)
  3. python re group()
  4. 魔兽8.0最新服务器人口普查,魔兽世界8.2最新人口普查 2019各服务器人口普查信息汇总...
  5. hen Content must be served over https解决方案
  6. 手把手教你学会用C语言编写井字棋小游戏
  7. python中的def是什么意思啊_python中的def是什么意思
  8. golang单线程对比map与bigCache小对象存取性能差别
  9. wps比对两列数据重复_“两个wps表格,怎么比对重复的数据?“两个表格对照核对...
  10. bzoj1984 月下“毛景树”