FM25L16B铁电存储SPI操作例程
- 格式:pdf
- 大小:28.25 KB
- 文档页数:3
铁电存储器工作原理及应用摘要:介绍铁电存储器(FRAM)的一般要领和基本原理,详细分析其读写操作过程及时序。
将FRAM与其它存储器进行比较,分析在不同场合中各自的优缺点。
最后以FM1808为例说明并行FPGA与8051系列单片机的实际接口,着重分析与使用一般SRAM的不同之处。
关键词:铁电存储器 FRAM原理 8051 存储技术1 背景铁电存储技术最在1921年提出,直到1993年美国Ramtron国际公司成功开发出第一个4Kb 的铁电存储器FRAM产品,目前所有的FRAM产品均由Ramtron公司制造或授权。
最近几年,FRAM又有新的发展,采用了0.35μm工艺,推出了3V产品,开发出“单管单容”存储单元的FRAM,最大密度可在256Kb。
2 FRAM原理FRAM利用铁电晶体的铁电效应实现数据存储,铁电晶体的结构如图1所示。
铁电效应是指在铁电晶体上施加一定的电场时,晶体中心原子在电场的作用下运动,并达到一种稳定状态;当电场从晶体移走后,中心原子会保持在原来的位置。
这是由于晶体的中间层是一个高能阶,中心原子在没有获得外部能量时不能越过高能阶到达另一稳定位置,因此FRAM保持数据不需要电压,也不需要像DRAM一样周期性刷新。
由于铁电效应是铁电晶体所固有的一种偏振极化特性,与电磁作用无关,所以FRAM存储器的内容不会受到外界条件(诸如磁场因素)的影响,能够同普通ROM存储器一样使用,具有非易失性的存储特性。
FRAM的特点是速度快,能够像RAM一样操作,读写功耗极低,不存在如E2PROM的最大写入次数的问题;但受铁电晶体特性制约,FRAM仍有最大访问(读)次数的限制。
2.1 FRAM存储单元结构FRAM的存储单元主要由电容和场效应管构成,但这个电容不是一般的电容,在它的两个电极板中间沉淀了一层晶态的铁电晶体薄膜。
前期的FRAM的每个存储单元使用2个场效应管和2个电容,称为“双管双容”(2T2C),每个存储单元包括数据位和各自的参考位,简化的2T2C存储单元结构如图2(a)所示。
SPI接⼝的FLASHSPI flash W25Qxx:W25Q系列的spiflash。
每页(Page)256B,每16个page为⼀个sector(扇区=4KB),每16个扇区为⼀个block(块=64KB)W25Q16=16Mb=2MB=2048KB=32block=512sector=8192page;操作:SPI flash写操作必须确保为0XFF才能写⼊,否则需要檫除操作,檫除的最⼩单位为Sector即4KB,所以有的会在单⽚机内部开⼀个4K的缓存(有点奢侈),写之前先读出来,檫除数据,合并数据(在檫除数据的同时进⾏操作,合并完了在检查檫除是否完成,不闲着;操作系统级的将因此进⼊挂起。
要么设定⼀个合适的超时时间,要么有⼀个专门的轮训这些标志完成则发信号量),再写⼊。
SPI SPI flash驱动规范:1 硬件SPI/软件SPI涉及的MOSI/MISO/SCK的IO设置、SPI设置读写⼀个字节。
2 存储器件IC涉及的⽚选、调⽤SPI读写⼀个字节操作在某个指定地址读写⼀个字节/多个字节,檫除等操作。
3业务层次的读写记录,APP升级等。
⼀主多从可以通过不同⽚选来发送(都⽚选则都会收到),但对接收,如果关闭某个⽚选则可能得不到及时相应;如果都打开则同时来时的处理。
IO模拟SPI⼀主多从如右图,先操作译码器(速度要快)再操作SPI的其它三根⼝线即可。
GPIO模拟的SPI操作灵活,但效率不⾼。
同时这种⽅法不适⽤于SPI的DMA传输,仅适合数据量少、对传输速度要求不同的场合。
硬件SPI的⽚选可以软件控制也能硬件控制(DMA传输时必须)关于IO模拟SPI驱动的另⼀种编程⽅法:SCLK⽤PWM输出⽅波(脉宽周期按⼿册),其它的4线配置SCLK进⾏操作,通过读SCLK引脚GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)来配合时序,不满⾜就等,满⾜就进⾏其它IO的置⾼置低(配置SYSTICK或NOP进⾏延时)关于如何根据时序图⽤IO模拟写驱动/上升沿采样下降沿发送数据的含义,以TM7705为例:上图表⽰对主机MCU⽽⾔:写的时候:MOSI上上升沿采样,上升沿前低电平时就要发送bit数据即:SCLK=0延时⼀⼩段时间就将send_data的MSB发出,然后SCLK=1再延时⼀段时间,接着进⾏下⼀个bit的操作。
Ramtron推出首款2兆位串行F-RAM存储器FM25H20类别:新品推荐发布时间:2008-4-17 阅读:879Ramtron推出首款2兆位串行F-RAM存储器,采用8脚TDFN (5.0 x 6.0 mm) 封装。
FM25H20采用先进的130纳米CMOS工艺生产,是高密度的非易失性F-RAM存储器,以低功耗操作,并备有高速串行外设接口(SPI)。
该3V、2Mb串行F-RAM器件以最大的总线速度写入,具有几乎无限的耐用性,通过微型封装提供更大的数据采集能力,使系统设计人员能够在计量和打印机等高级应用中减少成本和板卡空间。
FM25H20是串行闪存的理想替代产品,用于要求低功耗和最小板卡空间的精密电子系统中,包括便携式医疗设备如助听器等,它们实际上是微型数据处理器,但受到空间有限及功耗低的限制。
与闪存相比,F-RAM的优势包括大幅降低工作电流、写入速度更快、写入耐用性更比闪存高出多个数量级。
Ramtron 战略市场拓展经理Duncan Bennett 解释道:“对于那些需要在其新一代应用中提高数据采集能力,却不增加板卡空间的计量和打印机客户而言,这款2Mb 串行F-RAM 是自然的产品延伸。
FM25H20以相同的小占位面积,为半兆位串行F-RAM 客户提供高达四倍的存储能力。
除提升现有系统外,这种技术发展还推动F-RAM 进入多个需要低功耗存储器而空间严重受限的新兴市场,如便携式医疗设备。
”FM25H20是256K x 8位非易失性存储器,以高达40MHz的总线速度进行读写操作,具有几乎无限的耐用性、10年的数据保存能力,以及低工作电流。
该器件设有工业标准SPI接口,优化了F-RAM的高速写入能力。
FM25H20还备有软件和硬件写保护功能,能避免意外的写入与数据损坏。
该2Mb串行F-RAM以低功耗工作,在40MHz下读/写操作的耗电低于10mA,待机状态下耗电为80μA (典型值),超低电流睡眠模式下耗电为3μA (典型值)。
如题,用菜农老师的助学板写的。
以前俺都习惯用模拟的SPI去解决问题,用这个板子试了下自带的SPI 控制器。
板子上是用W25Q16BV这款SPI接口的FLASH,这块片子是华邦出的,去DataSheet网上找居然没有,后来去华邦的官网下载了。
他由8192个可编程的页组成,每页有256bytes。
一次可写256bytes,可以sector、BLOCK、whole chip擦除。
具体擦除的指令可以参照其Datasheet,我就不说了。
下面附上程序,整个工程见附件:/*---------------------------------------------------------------------------------------------------------*//* *//* Copyrightp; *//*---------------------------------------------------------------------------------------------------------*//******************************************************************************文件名:W25Q16BV_Function.c说明:本文件为“NUC120RE3AN用SPI总线主机模式读写W25Q16BV的主函数。
UART的波特率为115200。
申明:本程序参考三心的spi程序和板子自带的BSP例程,运用中断模式。
谢谢。
开始:2011.8.23修改:V1.0******************************************************************************/#include <stdio.h>#include "NUC1xx.h"#include "DrvUART.h"#include "DrvSYS.h"#include "DrvSPI.h"#include "global.h"int main(){SYSTEM_Config();UART_Config();GPIO_Config();W25Q16BV_SPI_Init();printf("\n\n");printf("+----------------------------------------------------------------------+\n");printf("| 菜农老师助学板之SPI操作W25Q16BV |\n");printf("| |\n");printf("+----------------------------------------------------------------------+\n");printf("\n");printf("配置SPI1为主机模式.\n");printf("SPI1 时钟为: %d Hz\n", DrvSPI_GetClock1Freq(eDRVSPI_PORT1));while(1){if(SPI_Start_Flag==TRUE){SPI_Start_Flag=FALSE;printf("开始操作SPI\n");switch(UART_Buffer_Rx){case 'R':case 'r':printf("Read data from W25Q16BV ...\n");W25Q16BV_SPI_ReadFlash();break;case 'W':case 'w':printf("Write data to W25Q16BV ...\n");DrvSYS_Delay(1000);W25Q16BV_SPI_PageProgram();printf("Write Flash Over!\n");break;default:printf("您输入的指令有误!\n");}}}}#include <stdio.h>#include "NUC1xx.h"#include "DrvUART.h"#include "DrvSYS.h"#include "DrvSPI.h"#include "DrvGPIO.h"#include "Drive_Function.h"#define Enable_SPI1_W25Q16BV DrvGPIO_ClrBit(E_GPA, 14)#define Disable_SPI1_W25Q16BV DrvGPIO_SetBit(E_GPA, 14)//extern uint32_t SPI_TX_DATA_Buffer[256];//extern uint32_t SPI_RX_DATA_Buffer[256];extern uint32_t SPI_RX_DATA;extern uint32_t Write_Enable;extern uint32_t Write_Disable;extern uint32_t Read_Status_Register1;extern uint32_t Read_DATA;extern uint32_t Page_Program;extern uint32_t Sector_Erase;extern uint32_t Chip_Erase;extern uint32_t Read_ID;extern uint32_t Addr;extern uint8_t SPI_DATA_Buffer[256];extern volatile uint8_t count;extern volatile uint32_t g_Spi1IntFlag;extern volatile uint8_t W25Q16BV_BUSY_Flag;extern uint32_t u32Tmp;void W25Q16BV_SPI_Init(){/*开SPI1总线设置为主机模式,波形1*/DrvSPI_Open(eDRVSPI_PORT1, eDRVSPI_MASTER, eDRVSPI_TYPE1, 32,FALSE);/*设置为MSP优先传输MSB*/DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST);/*从机选择线低电平或者下降沿激活*/DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);/*SPI总线的速率设置为1MHZ*/DrvSPI_SetClockFreq(eDRVSPI_PORT1, 1000000, 0);/*使能W25Q16BV 的片选信号*/Enable_SPI1_W25Q16BV;/*开启SPI1总线中断,并且与回调函数SPI1_Callback挂钩*/ DrvSPI_EnableInt(eDRVSPI_PORT1, SPI1_Callback, 1);}void W25Q16BV_SPI_PageProgram(){uint16_t i;uint32_t au32SourceData;/*使能SPI1中断,且SPI1_Callback为其回调函数*/DrvSPI_EnableInt(eDRVSPI_PORT1, SPI1_Callback, 0);/*中断标志清0*/g_Spi1IntFlag=0;/*使能W25Q16BV*/Enable_SPI1_W25Q16BV;/* Set the bit length of SPI transfer. */DrvSPI_SetBitLength(eDRVSPI_PORT1,8);/*写使能*/au32SourceData=0x06;printf("发送写能W25Q16BV\n");DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;printf("写能W25Q16BV指令发送完毕\n");/*关闭CS*/Disable_SPI1_W25Q16BV;/*打开CS*/Enable_SPI1_W25Q16BV;printf("Page_Program指令开始发送\n");au32SourceData=0x02;DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;DrvSPI_SetBitLength(eDRVSPI_PORT1,24);au32SourceData=0x0000;DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;printf("Page_Program指令已经发送完毕\n");DrvSPI_SetBitLength(eDRVSPI_PORT1,8);for(i=0;i<256;i++){SPI_DATA_Buffer[i]=0x02;au32SourceData=SPI_DATA_Buffer[i];DrvSPI_SingleWrite(eDRVSPI_PORT1,&au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;printf("写入的值为: %d\n", SPI_DATA_Buffer[i]);}Disable_SPI1_W25Q16BV;}void W25Q16BV_SPI_ReadFlash(){uint32_t au32SourceData;uint16_t i;/*中断标志清0*/g_Spi1IntFlag=0;/*使能SPI1中断,且SPI1_Callback为其回调函数*/ DrvSPI_EnableInt(eDRVSPI_PORT1, SPI1_Callback, 0);/*设置传输的长度*/DrvSPI_SetBitLength(eDRVSPI_PORT1,8);/*使能W25Q16BV*/Enable_SPI1_W25Q16BV;/*读操作指令*/au32SourceData=0X03;/*写入指令*/DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/printf("开始写读命令字和地址\n");while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;printf("写完读命令字和地址\n");/*设置传送长度为24位*/DrvSPI_SetBitLength(eDRVSPI_PORT1,24);/*传送地址*/au32SourceData=0X0000;DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;DrvSPI_SetBitLength(eDRVSPI_PORT1,8);for(i =0; i<256; i++){au32SourceData=0x0;/*开始接收数据*/DrvSPI_SingleWrite(eDRVSPI_PORT1, &au32SourceData); /*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;/*读取收到的数据*,并且不触发下一次传送*/DrvSPI_DumpRxRegister(eDRVSPI_PORT1, &SPI_RX_DATA, 1);/*打印收到的数据*/SPI_DATA_Buffer[i]=(uint8_t)SPI_RX_DATA;printf("0x%X ",SPI_DATA_Buffer[i]);if ((i%10)==6)printf("\n");}printf("所有数据接收完毕\n");Disable_SPI1_W25Q16BV;}void W25Q16BV_SPI_ChipErase(){/*使能SPI1中断,且SPI1_Callback为其回调函数*/DrvSPI_EnableInt(eDRVSPI_PORT1, SPI1_Callback, 0);/*中断标志清0*/g_Spi1IntFlag=0;/*使能W25Q16BV*/Enable_SPI1_W25Q16BV;/* Set the bit length of SPI transfer. */DrvSPI_SetBitLength(eDRVSPI_PORT1,8);/* write the first data of source buffer to Tx register of SPI0. And start transmission. */ DrvSPI_SingleWrite(eDRVSPI_PORT1, &Write_Enable);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;/*关闭CS*/Disable_SPI1_W25Q16BV;DrvSPI_SetBitLength(eDRVSPI_PORT1,8);/*打开CS*/Enable_SPI1_W25Q16BV;DrvSPI_SingleWrite(eDRVSPI_PORT1, &Chip_Erase);/*等待传输完毕*/while(g_Spi1IntFlag==0);g_Spi1IntFlag=0;Disable_SPI1_W25Q16BV;}void SPI1_Callback(uint32_t u32UserData) {g_Spi1IntFlag = 1;}。
FM25L256与C8051F020单片机的SPI接口设计
周欣
【期刊名称】《自动化与仪器仪表》
【年(卷),期】2009(0)4
【摘要】介绍一种具有SPI接口的铁电存储器FM25L256,以及其与C8051F020
单片机的接口电路,并给出了操作的软件流程。
这种方式具有非易失性、高速读写、超低功耗、几乎无限次擦写,并且占用极少单片机引脚数的优点。
以后必将成为MCU外扩数据存储器的主要方式。
【总页数】2页(P30-31)
【关键词】铁电存储器;SPI;C8051F020;操作码;非易失性
【作者】周欣
【作者单位】南京信息工程大学电子与信息工程学院
【正文语种】中文
【中图分类】TP334
【相关文献】
1.带按键的旋转编码开关与C8051F020单片机的接口设计 [J], 岳巍;李杰;文方哲;马让奎
2.基于SPI的CAN总线控制器与MCS-51单片机的接口设计 [J], 谢桂波
3.基于AVR单片机的SPI接口设计与实现 [J], 孙佳
4.基于AVR单片机的SPI接口设计与实现 [J], 杨启帆;赵腊才
5.C8051F020高速单片机与VPG19264-SC液晶显示模块的接口设计 [J], 陈晓静;熊晓东;荣峰
因版权原因,仅展示原文概要,查看原文内容请购买。
Flash存储W25Q16芯片1 一般描述W25Q16BV(16M-bit)是为有限的空间、引脚和功耗的系统提供一个存储解决方案。
25Q系列比普通的串行Flash存储器更灵活,性能更优越。
基于双倍/四倍的SPI,它们能够可以立即完成提供数据给RAM,包括存储声音、文本和数据。
芯片支持的工作电压2.7V到3.6V,正常工作时电流小于4mA,掉电时低于1uA。
工作温度为-40℃到85℃。
所有芯片提供标准的封装。
W25Q16BV由8192个编程页组成,每个编程页256-bytes。
每页的256字节用一次页编程指令即可完成。
每次擦除16页(扇区擦除)、128页(32KB块擦除)、256页(64KB块擦除)和全片擦除。
W25Q16BV有512个可擦除扇区或32个可擦除块。
最小4KB扇区允许更灵活的应用去要求数据和参数保存(见图2)。
W25Q16BV支持标准串行外围接口(SPI),和高速的双倍/四倍输出,双倍/四倍用的引脚:串行时钟、片选端、串行数据I/O0(DI)、I/O1(DO)、I/O2(WP)和I/O3(HOLD)。
SPI最高支持104MHz,双倍速是208MHz,四倍速是416MHz。
这个传输速率比得上8位和16位的并行Flash存储器。
连续读模式允许利用少至8-clocks指令去读取24-bit 地址来实现高效的存储访问,允许真正的XIP(execute in place)操作。
HOLD引脚和写保护引脚可编程写保护。
此外,芯片支持JEDEC标准,具有唯一的64位识别序列号。
2 特性l SPI串行存储器系列●灵活的4KB扇区结构-W25Q80:8M位/1M字节(1,048,576) -统一的扇区擦除(4K字节)-W25Q16:16M位/2M字节(2,097,152) -块擦除(32K和64K字节)-W25Q32:32M位/4M字节(4,194,304) -一次编程256字节-每256字节可编程页 -至少100,000写/擦除周期-数据保存20年●标准、双倍和四倍SPI-标准SPI:CLK、CS、DI、DO、WP、HOLD ●高级的安全特点-双倍SPI:CLK、CS、IO0、IO1、WP、HOLD -软件和硬件写保护-四倍SPI:CLK、CS、IO0、IO1、IO2、IO3 -选择扇区和块保护-一次性编程保护(1)●高性能串行Flash存储器 -每个设备具有唯一的64位ID(1)-比普通串行Flash性能高8倍注1:-104MHz时钟频率这些特点在特殊订单中。
也许,昨晚你刚看完前面的四讲,学到了VHDL编程的基本功。
结果,第二天一早“老板”需要你接手某项目上的CPLD编程,其中就包括今天要讲解的AT93C46存储芯片的VHDL驱动。
首先,这个芯片采用的是“三线串行接口”,兼容SPI接口。
所谓的SPI就是Serial Peripheral interface的缩写,即串行外围设备接口,是Motorola公司推出的三线同步接口,一种高速的,全双工,同步的通信总线。
该总线广泛应用于EEPROM,FLASH,实时时钟,AD转换器,数字信号处理器(DSP)、数字信号解码器、单片机和诸如ARM 等高端的微处理器中。
所以,这个接口的用处很广,掌握了这类接口操作的操作方法对我们以后的学习有很大的帮助。
我们先了解一下SPI的一些基本知识点。
SPI以主从方式工作,这种模式通常有一个主设备和一个或多个从设备。
进行数据传输时需要如下的信号线:MOSI,MISO,SCK,SS(多个从设备时需要)。
(1)MOSI–主设备数据输出,从设备数据输入(2)MISO–主设备数据输入,从设备数据输出(3)SCK–时钟信号,只能由主设备产生,也就是说谁产生SCLK,谁就是主设备(4)SS–从设备使能信号,由主设备控制如下图是一对一的硬件连接框图:SPI接口在内部硬件实现上就是两个简单的移位寄存器:在主器件产生的SS信号和SCK脉冲下,按位传输,高位在前,低位在后(具体器件应用时的时序可能会变化,这也就是所谓的兼容SPI)。
如在下图中,数据在SCLK的下降沿改变,在SCLK上升沿被采样。
简单了解SPI后,我们再看详细的看其手册,获取对我们有用的信息。
ATMEL公司生产的93C46芯片有1K bit的存储空间,有8位和16位数据模式可选择,即1K bit的存储可分为128×8或64×16,它的电压范围是2.7V到5.5V和1.8V到5.5V,在5V的电压下最高时钟频率可以达到2M,芯片可以进行一百万次的擦写,数据可以保存一百年。