STM32读写FPGA存储器EPCS器件(EPCS1、EPCS4)
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)相关推荐
- FPGA配置芯片EPCS读写操作--STM32读写
注意事项: (1)首先STM32需要设置nCE和nConfig信号,即nCE置高,nConfig拉低,获得EPCS的控制权,而后对EPCS操作,操作完成后需要释放这两个管脚,即nCE拉低,nConfi ...
- stm32采集脉冲信号_基于STM32+FPGA的数据采集系统的设计与实现
引言 由于火控系统工作环境特殊,所需采集信号复杂多样,传统的以微控制器或PC为主的采集系统往往难以胜任.针对上述问题,提出了一种基于STM32+FPGA的数据采集系统的设计方案,该方案不仅能够完成对多 ...
- 使用Flash Loader(JTAG模式)下载EPCS器件
一般来说Altera公司Cyclone或者CycloneII系列FPGA相应的配置器件会选择EPCS系列串行FLASH.一般使用AS模式下载EPCS系列器件.但有时候可能遇到AS模式不能成功下载的案例 ...
- FPGA的EPCS 配置的2种方法 FPGA下载程序的方法(EPCS)
使用主动串行配置模式对Cyclone FPGA进行配置前,必须将配置文件写入串行配置器件EPCS.将配置文件写入EPCS的方法有三种: (1)在Quartus II的Programmer中,通过专门与 ...
- 基于STM32 ARM+ FPGA 的软体机器人的 CAN总线运动控制器的设计
针对在软体机器人控制时 , 多电机协同控制过程中难度大 . 通用性差 . 协同性差等缺点 , 设计了基于 ARM 和 FPGA 的软体机器人的控制器局域网络 ( controller area net ...
- FPGA存储器DDR5简介
1.1 FPGA存储器DDR5简介 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA存储器DDR5简介: 5)结束语. 1.1.2 本节引言 "不积跬步 ...
- QII中,用JTAG接口配置EPCS器件
用JTAG接口配置EPCS器件,具体操作步骤如下: 1.在QuartusII中打开工程,然后编译链接,生成JTAG配置文件.sof: 2.选择File->Convert Programming ...
- 基于STM32 ARM+FPGA的电能质量分析仪方案(二)软件设计
本部分主要介绍 FPGA+ARM 控制部分的软件设计. FPGA+ARM 控制部分包括 Verilog HDL 硬件描述语言和 C 语言的开发. FPGA 部分主要控制 AD7606 模数转换.数字三 ...
- chipsel语言_用VHDL语言对FPGA和CPLD器件进行开发时应注意的事项
第25卷第4期苏 州 大 学 学 报(工 科 版)Vol.25No.4 2005年8月JOURNA L OF SOOCH OW UNIVERSIT Y(ENGINEERING SCIENCE E DI ...
- UPP协议转AXI4协议的burst读写FPGA实现
UPP协议转AXI4协议的burst读写FPGA实现 名字是按标准协议命名的,细节都在图里,有兴趣的朋友自己看下,或者私信我,欢迎批评指正! Burst 读和写 写数据 读数据
最新文章
- 对物联网操作系统特征和定位的思考
- Java的回调机制--学习笔记
- JAVA复习( StringBuffer 和 StringBuilder)
- mysql storage_mySQL__storage课堂笔记和练习
- 基于SSM + Redis的Shiro权限管理项目
- matplotlib动态图和视频保存
- Scala基础 - 函数和方法的区别
- cisco4503端口镜像配置
- python:使用requests,bs4爬取mmjpg上的图片
- 经验:OrCAD Capture卡顿问题的解决方法
- 项目管理之敏捷开发之道
- mysqldump 使用 --set-gtid-purged
- [异能程序员]第二章 上头条(第二更)
- discuz仿163k_discuz仿163K四色地方门户模板,仿163K地方模板,地方门户模板
- boost - 智能指针介绍
- Python入门习题(64)——OpenJudge百练习题:最长单词
- win7系统计算机文件夹缓慢,win7系统搜索文件很慢的两种解决方法
- 风场可视化:绘制轨迹
- MATLAB创建音乐《光年之外》
- C语言:用贪心策略计算活动安排问题的最优解
热门文章
- 怎么让模糊的数字变清楚_用ps怎么把模糊的字变清晰
- 新版 OPPO Enco Free 2 固件工具 (仅供交流学习使用)
- python re group()
- 魔兽8.0最新服务器人口普查,魔兽世界8.2最新人口普查 2019各服务器人口普查信息汇总...
- hen Content must be served over https解决方案
- 手把手教你学会用C语言编写井字棋小游戏
- python中的def是什么意思啊_python中的def是什么意思
- golang单线程对比map与bigCache小对象存取性能差别
- wps比对两列数据重复_“两个wps表格,怎么比对重复的数据?“两个表格对照核对...
- bzoj1984 月下“毛景树”