嵌入式开发--赛普拉斯cypress的铁电存储器FM25CL64B

嵌入式开发–赛普拉斯cypress的铁电存储器FM25CL64B

简介

FM25CL64B是赛普拉斯cypress出品的一款铁电存储器,这种存储器最大的优势是可以像RAM一样随机存储,和按字节写入,也可以像ROM一样掉电仍然可以保存数据,是一种相当优秀的新型存储器,但是容量不能做得很大,只适合保存一些重要数据。

重要参数及解读如下:

64K位,即8K字节
100T的读写次数,这意味着即使对于同一单元,每毫秒读取或写入一次,也需要3170年才能消耗完这个次数,而我们对存储器的访问几乎不可能达到这样的频率,也不可能只访问一个数据单元,所以它的读写次数寿命虽然有限,但可以不在考虑之列。
151年的数据保存周期,除了极其特殊用途,基本上是足够的了,毕竟我们之前用的光盘和现在FLASH,数据保存周期也才10年而已。
SPI接口,频率支持到20M,可直接硬件替换SPI口的EEPROM,SPI支持MODO_0 (CPOL = 0, CPHA = 0)即时钟空闲时为低,第1个跳变沿采样数据;和MODO_3(CPOL = 1, CPHA = 1)即时钟空闲时为高,第2个跳变沿采样数据。看手册是自动识别,但我没有测试。
受保护以避免写入的区域为:1/4或1/2或全片保护可选
8脚的SOP或DFN封装
-40~85度温度

芯片框图

封装
在这里插入图片描述

内部工作框图:
在这里插入图片描述

硬件电路图

在这里插入图片描述
我接的是MCU的SP1口,如下:
在这里插入图片描述

CubeMX初始化设置

PA15设置为GPIO输出,速度设为High,由软件控制这个片选引脚。
在这里插入图片描述
Motorola格式,16位数据,MSB,CPOL和CPHA参照之前的说明,CRC校验关闭,软件片选。
软件片选的原因是ST的SPI接口中,NSS不是通常意义上的片选, 一旦开启SPI,这个引脚就只能为低,不能为高。而且,如果SPI总线上还有其他设备,也只能用软件片选。
需要注意的是Baud Rate这里,不能超过20M

芯片操作

控制码

控制码共有6个,如下图
在这里插入图片描述
分别对应的是
WREN 写使能
WRDI 写禁止
RDSR 读状态寄存器
WRSR 写状态寄存器
READ 读操作
WRITE 写操作

其他操作无意义或者说不开放,后面会讲到。

写使能

这是8位命令。
在写入数据之前需要先进行写使能操作,否则无法写入
同时,在SO数据线上,无数据响应,也就是说写使能是单向操作,芯片没有回应。
具体时序如下:
在这里插入图片描述

写禁止WRDI

这是8位命令。
执行本命令后,对芯片的写操作无效。
同样的,在执行本命令时,SO无回应。
在这里插入图片描述

8位操作码

对于前面2个8位操作码,由于我们在CubeMX中,将SPI设置为16位数据,那么无法完成对8位操作码,即1字节的操作。
例如:当发送WRDI(0x04)时,解决方案有3个:
1 发送重复的操作指令,发送0x0404来实现,即2次同样的操作。
2 发送0x0004,或0x0400,由于0x00不是操作码,芯片不会对其响应。
3 发送8位操作码时,修改SPI的寄存器,以实现8位操作。发送完成后再改为16位模式。
我用的是方案1,实测工作正常,就不再折腾寄存器了。

读状态寄存器

16位操作命令
前8位是操作码RDSR(0x05),后8位SI可以没有任何数据,有也不影响。
同时,在后8位时,SO会有数据输出,结束后在SPI的DR寄存器可以看到结果,也就是状态寄存器SR的数据。
如果此时SO上没有观察到波形,说明配置有错误。
在这里插入图片描述

写状态寄存器

16位操作命令,前8位是操作码0x01,后8位是需要写入状态寄存器的值。
SO线没有波形输出。
在这里插入图片描述

写保护

需要注意的是,向SR写入数据时,读取的不一定和写入相同。这与写保护的相关设置有关联,而且只有BIT1,2,3,7位是有效位,其他的位读出来永远是0。
具体请查看写保护的相关部分,我是向状态寄存器写0,然后读到的值应该是0x02,也就是说开启写操作,而且状态寄存器和存储空间均不保护,处于可写的状态。
写入完成后,将WEL位设置为0即可,如下图是相关的位,与保护区域的表格。
在这里插入图片描述

读数据和写数据

这两个操作类似,就放到一块说了。
这是32位操作码,
开始的8位,是操作码
接下来的8位,是地址码的高8位,由于本芯片是64K位,即8K字节,也就是说,地址码的有效位是3+8=11位,所以本区段 只有3个数据位是有效位。当然对于不同容量的芯片来说,有效位数是不一样的。
第3个8位,是地址码的低8位
最后8位,是数据位,写数据时,在SI线上有波形,读数据时,在SO上有波形。
在这里插入图片描述

HOLD引脚

HOLD引脚是用来暂停当前操作的,必须在时钟信号为低期间,HOLD引脚才能为低,
此时时钟,SI这两根线可以任意变化
需要退出HOLD状态前,时钟必须为低,SO可任意。
当HOLD拉高后,继续之前的操作。
个人感觉这个功能不太实用,只有当软件模拟SPI时才用得上。硬件SPI时,有折腾时序的时间,SPI的活都干完了
不用这个功能的话,本引脚接高即可。

WP引脚

硬件写保护,提供对状态寄存器的保护。
该引脚为高时,禁止对状态寄存器写入。可防止误操作。
不用这个功能的话,本引脚接高即可。

写入次数分析

以下是对同一个数据单元进行重复读写的寿命评估。
第1列是SPI时钟频率
第2列是每秒可以访问的次数
第3列是每年的访问次数
第4列是可以不间断写入多少年
在这里插入图片描述
可以看出,即使以本芯片所能支持的最高速度20MHz,来不间断的对同一数据单元进行读写访问,仍然可以维持85年,这个寿命是妥妥的够了。
更何况我们不可能总是读写同一个数据单元,而且不可能以如此高的频率进行数据访问。
所以芯片的寿命是可以放心的。

相关代码

LL_FRAM.h文件的代码

#ifndef __LL_FRAM_H__
#define __LL_FRAM_H__#include "LL_define.h"
#include "spi.h"//状态寄存器   X表示无意义,默认值是0
//  BIT7      BIT6      BIT5      BIT4      BIT3      BIT2      BIT1      BIT0
//  WPEN      X(0)      X(0)      X(0)      BP1       BP0       WEL       X(0)
//  WEL:      1为写使能,0为禁止写
//  BP0,BP1:  块保护
//  WPEN:     #define FRAM_WREN   0x06    //写入使能,即设置WEL位       在写操作(WRSR和WRITE)之前,必须先发本命令
#define FRAM_WRDI   0x04    //写入禁止,即清除WEL位       本操作会禁止写操作(WRSR和WRITE),此后即使发送(WRSR和WRITE)也无效
#define FRAM_RDSR   0x05    //读状态寄存器
#define FRAM_WRSR   0x01    //写状态寄存器,前序操作为FRAM_WREN
#define FRAM_READ   0x03    //读
#define FRAM_WRITE  0x02    //写,前序操作为FRAM_WREN#define SPI1_NSS(n)  (n?HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET):HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET))extern u8 spi_read_data;  //spi读取的数值u8 LL_fram_read_sr(void);
u8 LL_fram_write_sr(u8 value);
u8 LL_fram_read(u16 addr, u8 ret_data);
u8 LL_fram_write(u16 addr, u8 value);#endif

LL_FRAM.c文件的代码

#include "LL_FRAM.h"u8 spi_read_data=0;
u8 spi_tx_data[10] = {0x06};u8 LL_fram_read_sr(void)  //读状态寄存器,其返回值是状态寄存器的内容
{u8 data[4];u8 ret;//写使能data[0] = FRAM_WREN;data[1] = FRAM_WREN;SPI1_NSS(0);HAL_SPI_Transmit(&hspi1, data, 1, 100);SPI1_NSS(1);//读状态寄存器,必须先有写使能操作FRAM_WREN  0x05data[0] = 0;data[1] = FRAM_RDSR;SPI1_NSS(0);HAL_SPI_TransmitReceive(&hspi1, data, &ret, 1, 10);SPI1_NSS(1);return ret;
}u8 LL_fram_write_sr(u8 value)   //写状态寄存器,其函数的参数是向状态寄存器写入的内容
{u8 data[4];u8 ret;//写使能data[0] = FRAM_WREN;data[1] = FRAM_WREN;SPI1_NSS(0);HAL_SPI_Transmit(&hspi1, data, 1, 100);SPI1_NSS(1);//写状态寄存器    0x01data[0] = value;data[1] = FRAM_WRSR;SPI1_NSS(0);HAL_SPI_TransmitReceive(&hspi1, data, &spi_read_data, 1, 10);SPI1_NSS(1);return 0;
}//读操作
//addr:读取地址
//ret_data: 读取的数据保存在此处
u8 LL_fram_read(u16 addr, u8 ret_data)
{u8 data[4];u8 ret;u8 state;//读存储器    0x02data[0] = addr>>8;data[1] = FRAM_READ;data[2] = 0x00;data[3] = (u8)(addr&0x00ff);SPI1_NSS(0);state = HAL_SPI_TransmitReceive(&hspi1, data, &spi_read_data, 2, 20);   //(&hspi1, data, &ret, 2, 10);SPI1_NSS(1);if(state == 0){spi_read_data = (u8)hspi1.Instance->DR;ret = 0;}else{ret = state;}return ret;
}//写操作
//addr:写入地址
//ret_data: 写入的数据
u8 LL_fram_write(u16 addr, u8 value)
{u8 data[4];u8 ret;//写使能data[0] = FRAM_WREN;data[1] = FRAM_WREN;SPI1_NSS(0);HAL_SPI_Transmit(&hspi1, data, 1, 100);SPI1_NSS(1);//写存储器    0x02data[0] = addr>>8;data[1] = FRAM_WRITE;data[2] = value;data[3] = addr&0xff;SPI1_NSS(0);HAL_SPI_TransmitReceive(&hspi1, data, &ret, 2, 10);SPI1_NSS(1);return ret;}

测试读写

  while(1){LL_fram_write_sr(0x000);    //取消保护,以准备写入if(LL_fram_read_sr() == 0x02)         //读取状态寄存器,应该是0x02{for(i=0; i<8*1024; i++){LL_fram_write(i,(u8)i);j++;temp = LL_fram_read(i, spi_read_data);if(temp == 0){if(spi_read_data != (u8)i){//读出的数据与写入的数据不相等LED_ERR(1);goto begin;}}else{//LL_fram_read()函数返回值不是0,表示运行出错,DR寄存器内的数据不能保证正确性LED_RUN(1);goto begin;j++;}}}}begin: 

这一段函数不停的执行写入和读取操作,并进行比对。
如果SPI操作异常,则亮起LED_RUN灯,并跳转到begin处,
如果读取的结果,和写入的数据比对错误,则亮起LED_ERR灯,并跳转到begin处。
经长时间运行(截止发文,已6小时以上),发现正常运行时工作正常,未出现错误跳转。
带上仿真器全速运行时,会不时跳转到LED_RUN(1)处,也就是说SPI函数的运行不正确,显然是由于连接了仿真器造成的。但是不会跳转到LED_ERR(1)处,也就是说不会出现读取的数据不正确的情况。

总结

为了保证数据正确,应当判断LL_fram_read()函数的返回值,应当是0,此时再去读取数据才是正确的,否则会有错误的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/162297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 持久化机制

client Redis[内存] --> 内存数据、磁盘数据----> 磁盘&#xff0c;Redis官方提供了两种不同的持久化方案将内存中的数据存储在硬盘中&#xff1a; 快照&#xff08;Snapshot&#xff09; AOF只追加日志文件。 1、快照&#xff08;Snapshot&#xff09; 1、快照的特点…

如何用CHAT解释文章含义?

问CHAT&#xff1a;解释“ 本身乐善好施&#xff0c;令名远近共钦&#xff0c;待等二十左右&#xff0c;定有高亲可攀&#xff1b;而且四德俱备&#xff0c;帮夫之缘亦有。主持家事不紊&#xff0c;上下亦无闲言。但四十交进&#xff0c;家内谨防口舌&#xff0c;须安家堂&…

分布式篇---第一篇

系列文章目录 文章目录 系列文章目录前言一、分布式幂等性如何设计?二、简单一次完整的 HTTP 请求所经历的步骤?三、说说你对分布式事务的了解前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

非遗之光:十八数藏柏松数字保护的璀璨之路

随着数字技术的崛起&#xff0c;非物质文化遗产的保护进入了一个新的纪元。在这个时代的先锋中&#xff0c;十八数藏以其对传统工艺的数字保护而独领风骚。这是一条璀璨之路&#xff0c;通过数字技术的应用&#xff0c;为传统工艺注入了新的活力。 十八数藏柏松将数字创新融入传…

软件包管理器yum和git

目录 一、Linux软件包管理器yum 1、Linux下的软件安装方法 2、了解yum 1、实际例子引入 2、yum 3、查找软件包 4、安装软件包 5、卸载软件 二、git 一、Linux软件包管理器yum 1、Linux下的软件安装方法 1、在Linux下安装软件&#xff0c;一个通常的办法是下载到程序的源…

经典百搭女童加绒卫衣,看的见的时尚

经典版型套头卫衣 宽松百搭不挑人穿 单穿内搭都可以 胸口处有精美的小熊印花 面料是复合柔软奥利绒 暖和又不显臃肿哦&#xff01;&#xff01;

Jenkins+Maven+Gitlab+Tomcat 自动化构建打包、部署

JenkinsMavenGitlabTomcat 自动化构建打包、部署 1、环境需求 本帖针对的是Linux环境&#xff0c;Windows或其他系统也可借鉴。具体只讲述Jenkins配置以及整个流程的实现。 1.JDK&#xff08;或JRE&#xff09;及Java环境变量配置&#xff0c;我用的是JDK1.8.0_144&#xff0…

排序算法--快速排序

实现逻辑 ① 从数列中挑出一个元素&#xff0c;称为 “基准”&#xff08;pivot&#xff09;&#xff0c; ② 重新排序数列&#xff0c;所有元素比基准值小的摆放在基准前面&#xff0c;所有元素比基准值大的摆在基准的后面&#xff08;相同的数可以到任一边&#xff09;。在这…

2023年度openGauss标杆应用实践案例征集

标杆应用实践案例征集 2023 openGauss 数据库作为企业IT系统的核心组成部分&#xff0c;是数字基础设施建设的关键&#xff0c;是实现数据安全稳定的保障。openGauss顺应开源发展趋势&#xff0c;强化核心技术突破&#xff0c;着力打造自主根社区&#xff0c;携手产业伙伴共同…

【开源】基于JAVA的高校实验室管理系统

项目编号&#xff1a; S 015 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S015&#xff0c;文末获取源码。} 项目编号&#xff1a;S015&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

PTA-用天平找小球

三个球A、B、C&#xff0c;大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。 输入格式&#xff1a; 输入在一行中给出3个正整数&#xff0c;顺序对应球A、B、C的重量。 输出格式&#xff1a; 在一行中输出唯一的那个不一样的球。 输入样例&#xff…

内衣洗衣机哪些品牌质量好实惠?小型洗衣机全自动

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…

重磅!2023年两院院士增选名单公布

中国科学院 关于公布2023年中国科学院院士增选当选院士名单的公告 根据《中国科学院院士章程》《中国科学院院士增选工作实施办法&#xff08;试行&#xff09;》等规定&#xff0c;2023年中国科学院选举产生了59名中国科学院院士。 现予公布。 中国科学院 2023年11月22日…

设计模式——结构型模式

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更…

机器学习算法(1)——简单线性回归

一、说明 在在这篇文章中&#xff0c;我们将学习我们的第一个机器学习算法&#xff0c;称为简单线性回归。这是一个重要的算法&#xff0c;因为当您可能正在学习第一个神经网络&#xff08;称为人工神经网络&#xff09;时&#xff0c;在此算法中学习的技术也适用于深度学习。我…

毕业设计ASP.NET 1400动漫公司网站【程序源码+文档+调试运行】

摘要 本系统将实现一个动漫公司网站&#xff0c;包括前台用户模块和后台管理员模块。前台用户模块主要包括最新动漫、注册登录、公司简介、公司新闻、动漫中心、联系我们和会员中心等功能。后台管理员模块包括用户管理、公司简介管理、公司新闻管理、动漫类别管理、动漫管理、…

加工车间污水处理设备有哪些

在加工车间中&#xff0c;污水处理设备是至关重要的一部分。它们的功能是将污水进行处理&#xff0c;确保其达到符合环保标准的水质要求。以下是一些常见的加工车间污水处理设备&#xff1a; 1.初级沉淀池&#xff1a;初级沉淀池是最基本的污水处理设备之一。它通过重力作用将…

阿里云服务器ECS产品知识及购买和使用常见问题及答案汇总

本文总结了阿里云用户在购买和使用阿里云服务器中的一些常见的问题&#xff0c;包括什么是云服务器ECS&#xff0c;特性与优势&#xff0c;应用场景&#xff0c;基本概念&#xff0c;使用限制等众多问题&#xff0c;让您全方位了解阿里云服务器&#xff0c;并根据自己的需求选择…

百战python01-初识python_turtle绘图

文章目录 简介练习1.简易的进度条学习使用turtle在屏幕上绘制图形注:需要对python有基本了解,可查看本作者python基础专栏,有任何问题欢迎私信或评论(本专栏每章内容都将不定期进行内容扩充与更新) 简介 python简介及方向+pycharm安装使用请转 练习 注:尝试练习。了解…

常见树种(贵州省):010任豆、漆树、椿树、伯乐树、栾树、楸树、橡胶树、盐肤木、吴茱萸、黄柏

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、任豆 …