参考资料

器件规格书:https://atta.szlcsc.com/upload/public/pdf/source/20131104/1457706659695.pdf
I2C总线规范:https://community.nxp.com/pwmxy87654/attachments/pwmxy87654/nxp-designs/931/1/UM10204.pdf
第一次接触这种 FRAM 铁电随机存储芯片,发现有几点有意思的知识点,顺带记录一下,数据读写的操作就没啥记录的了。

芯片简介

FRAM 优点:
集结 RAM 的高读写速度但掉电数据丢失和 ROM 掉电仍可报错数据但读写速度很慢的优点。

FRAM 缺点:
访问次数有限(100亿次),超出后不再具有非易失性(即掉电丢失数据),但仍可作为 RAM 使用。

器件地址

高地址为表示方法

这颗芯片的容量有 512 字节,可以通过 I2C 指定地址来读写数据。由于 4KB 的内存地址超出了一个字节所能表示的范围(0-255),该器件采用 7bit 器件地址的最低位作为内存地址的高有效位,即可完整描述(0-511)。这样可以避免使用两个字节来表示内存地址,有效提升读写效率。

两个从机器件地址

但这样也带来了一个小弊端,该芯片会占用 I2C 总线的两个地址:(A2=0,A1=1,A8=0/1)
0x52 = 1010 010、0x53 = 1010 011

设备ID

通过以下方式实现区分命令与普通的数据读写操作

  1. 该芯片通过保留地址的方式来实现设备ID的获取功能.
  2. 通过将真实的器件地址作为保留器件地址的数据,来获取指定芯片的设备ID。


按上述步骤:

  1. 发起起始信号之后,发送保留从机地址 0xF8(所有设备都会给出应答信号)。
  2. 得到应答信号之后,发一次本芯片的器件地址 0x52 << 1(只有0x52设备会给出应答信号)。
  3. 得到应答信号之后,重新再发起起始信号,发送目标从机地址 0xF9(告诉 0x52 设备要读取设备ID)。
  4. 得到应答信号之后,即可连续读取三个字节的数据(0x52 设备会给出应答信号,并输出三个字节数据)。

上述 0xF8、0xF9 是包含了读写位,移除读写位得到 7bit 地址为 0x7C(1111 100),对应下方I2C标准规范(P16):

同样 I2C 标准规范也制定了读取设备 ID 的流程(P20):

实测的数据波形

下面解析的地址数据,包含了读写位:

对应的 Linux 应用层获取的代码:

bool get_pidmid(unsigned short *pid, unsigned short *mid)
{
struct i2c_msg msgs[2];
unsigned char val[3] = {0};
struct i2c_rdwr_ioctl_data i2c_data;
std::unique_lock<std::mutex> lock(mutex); memset(&msgs, 0x00, sizeof(msgs));
memset(&i2c_data, 0x00, sizeof(struct i2c_rdwr_ioctl_data)); i2c_data.nmsgs = 2;
i2c_data.msgs = msgs; char data = saddr << 1;
i2c_data.msgs[0].buf = &data;
i2c_data.msgs[0].len = 1;
i2c_data.msgs[0].addr = 0xF8 >> 1;
i2c_data.msgs[0].flags = 0; i2c_data.msgs[1].buf = (char*)val;
i2c_data.msgs[1].len = 3;
i2c_data.msgs[1].addr = 0xF9 >> 1;
i2c_data.msgs[1].flags = 1; if (ioctl(fd, I2C_RDWR, (unsigned long)&i2c_data) < 0){
return false;
} *pid = val[2] | ((val[1]&0x0F) << 8);
*mid = (val[0] << 4) | ((val[1]&0xF0) >> 4);
return true;
}

【随笔记】FRAM 铁电随机存储器(MB85RC04VPNF)的更多相关文章

  1. FRAM 铁电存储器

    铁电存储器与传统存储器的区别. 一:易失性的存储器包括静态存储器SRAM和动态存储器DRAM.           优点:读写速度快,读写寿命无次数限止.           缺点:掉电会丢失数据.  ...

  2. 用铁电存储器FRAM让穿戴式设备更省电

    可穿戴设备应用中的显示屏消耗了大部分电池电力.解决方法之一是直接提高电池容量,但是大容量电池会加大尺寸和重量,对可穿戴设备不合适,尤其是在市场不断追求更小型化的新款产品时更是如此.更具挑战性的是电池技 ...

  3. 树莓派4B-SPI读写flash-FM25CL16B(同时支持FM25CL64等其它系列Flash)

    1.树莓派SPI介绍 4B的引脚如下图所示: 其中Pin19.21.23是SPI0,接口定义如下所示: 时钟(SPI CLK, SCLK) 主机输出.从机输入(MOSI) 主机输入.从机输出(MISO ...

  4. ArduPilot存储管理 Storage EEPROM Flash

    AP_HAL::Storage 此类可以应用于所有平台.PX4v1平台支持8k的EEPROM,Pixhawk平台支持16k的FRAM铁电存储器 存储大小定义:libraries/AP_HAL/AP_H ...

  5. msp430FR5739 FRAM的学习

    FRAM,中文名称为铁电存储器..FRAM提供一种与RAM一致的性能,但又有与ROM 一样的非易失性. FRAM 克服以上二种记忆体的缺陷并合并它们的优点,它是全新创造的产品,一个非易失性随机存取储存 ...

  6. STC单片机掉电断电失电瞬间EEPROM数据保存处理办法(转)

    由于客户在请人设计开发一设备,但是设备用户处总停电,造成设备及其周边耗材损耗严重,因此请我司在现有STC为主要芯片的基础上做掉电瞬间EEPROM里的20个参数保存,上电后通过读取EEPROM中的参数回 ...

  7. 单片机(MCU)使用常用名字解释

    总线:指能为多个部件服务的信息传送线,在微机系统中各个部件通过总线相互通信. 地址总线(AB):地址总线是单向的,用于传送地址信息.地址总线的宽度为16位,因此基外部存储器直接寻址64K,16位地址总 ...

  8. 主机-配件-接口-整机-3c-1

    standby 待机 hibernate 休眠(睡眠) power-off 关机 usb端口能给外部设备充电在低压状态(standby,hibernate,power-off),如果系统运行在batt ...

  9. RFID的基本组织构成

    RFID技术由3大组件构成, 包括: 阅读器.天线.标签三大组件. 阅读器 为RFID系统最重要也是最复杂的一个组件.因其工作模式一般是主动向标签询问标识信息, 所以有时又被称为询问器(Interro ...

随机推荐

  1. ElasticSearch这些坑记得避开

    目录 一.管理方式 二.结构维护 三.数据调度 1.同步方案 2.中断和恢复 四.刷新策略 五.深度分页 六.参考源码 Index用不好,麻烦事不会少: 一.管理方式 ElasticSearch作为最 ...

  2. 快速构建页面结构的 3D Visualization

    对 Chrome 扩展功能熟悉的小伙伴,可能都有用过 Chrome 的 3D 展示页面层级关系这个功能. 可以通过 控制台 --> 右边的三个小点 --> More Tools --> ...

  3. 【Serverless】Unity快速集成认证服务实现邮件登录

    ​概述: 认证服务可以为您的应用快速构建安全可靠的用户认证系统,您只需在应用中访问认证服务的相关能力,而不需要关心云侧的设施和实现. 本次将带来如何使用Unity编辑器快速集成认证服务SDK并实现邮箱 ...

  4. 【Java EE】Day08 HTML&CSS

    一.表单 1.概述 采集数据,与服务器交互包括 form表单,需要提交则必须设置name属性,action方式主要包 get:参数会在地址栏显示(请求行),长度有限 post:参数被封装在请求体,参数 ...

  5. Guava LoadingCache本地缓存的正确使用姿势——异步加载

    1. [背景]AB实验SDK耗时过高 同事在使用我写的实验平台sdk之后,吐槽耗时太高,获取实验数据分流耗时达到700ms,严重影响了主业务流程的执行 2. [分析]缓存为何不管用 我记得之前在sdk ...

  6. 输出图形字符的命令 banner

    输出图形字符的命令 banner 有趣的 Linux 命令.来自实验楼操作系统课程 安装 sudo apt install sysvbanner 截图 其他 还有两个类似的命令toilet,figle ...

  7. 如何用 JavaScript 编写你的第一个单元测试

    前言 测试代码是使代码安全的第一步.做到这一点的最好方法之一是使用单元测试,确保应用程序中的每个小功能都能发挥其应有的作用--特别是当应用程序处于边缘情况,比如无效的输入,或有潜在危害的输入. 为什么 ...

  8. 如何使用Java获取货币符号?

    1. 前言 最近做了一个支付相关的需求,要求在收银台页面显示商品的价格时带上货币符号¥,类似下图中的格式: 最初我是用的下面这样的代码: System.out.println(Currency.get ...

  9. Go语言Golang DevOps运维开发实战

    Go语言Golang DevOps运维开发实战 提高运维意识.从下到上,从上到下的工作都要做好,对上运维工作的价值和含金量可以得到认可,对下我们的工作能够提高效率解放运维.运维意识是很重要,并不是你技 ...

  10. 正则提取器和beanshell处理器组合,将提取的所有id拼接成字符串

    1.添加正则表达式,提取所有id值 2.添加beanshell处理器将所有的id值拼接成字符串 方法一: int N = Integer.parseInt(vars.get("build_m ...