树莓派4B-SPI读写flash-FM25CL16B(同时支持FM25CL64等其它系列Flash)
1.树莓派SPI介绍
4B的引脚如下图所示:

其中Pin19、21、23是SPI0,接口定义如下所示:
- 时钟(SPI CLK, SCLK)
- 主机输出、从机输入(MOSI)
- 主机输入、从机输出(MISO)
在使用 SPI 接口前,你需要使用 gpio 命令来加载 SPI 驱劢到内核中:
gpio load spi
如果您需要的缓冲区大于 4KB,需要在命令行迕行指定缓冲区的大小,单位是 KB:
gpio load spi 100
上述命令将会分配 100KB 的缓冲区.(您可能很少需要改变返项讴置,默认值对于绝大多数应用程序来说已经足够了). 为了使用 SPI 库,你也需要在你的程序中添加如下语句:
#include <wiringPiSPI.h>
程序在编译连接时,仍然需要添加-lwiringPi 选项
需要用到的函数如下所示:
int wiringPiSPISetup(int channel, int speed);
//使用该函数可以初始化一个 SPI 通道,树莓派有两个 SPI 通道(0 和 1)。
//speed 参数是一个整数值,其范围为 500000~32000000,代表 SPI 时钟速度,单位是 Hz。
//返回值为-1,则失败。则需要检查一下电路连接和是否开启了树莓派的SPI。 int wiringPiSPIDataRW(int channel, unsigned char* data, int len);
//该函数执行一个同时读写操作,通过选定的 SPI 总线。缓冲区中的数据,将会被 SPI总线的返回数据所覆盖。 void delay (unsigned int howLong)
//延时ms,最大传入32位无符号型整数,大约49天。 void delayMicroseconds (unsigned int howLong)
//延时微秒,最大传入32位无符号型整数,大约71分钟
2.FM25L16B芯片介绍
FM25L16是采用先进的铁电工艺制造的1024*16位的非易失性存储器(2048个字节)。铁电随机存储器(FRAM)具有非易失性,并且可以象RAM一样快速读写。FM25L16中的数据在掉电后可以保存45年。相对EEPROM或其他非易失性存储器,FM25L16具有结构更简单,系统可靠性更高等诸多优点。
与EEPROM系列不同的是,FM25L16以总线速度进行写操作,无须延时。数据发到FM25L16后直接写到具体的单元地址,下一个总线操作可以立即开始,无需数据轮询。此外,FM25L16的读/写次数几乎为无限次,比EEPROM高得多。同时,FM25L16的功耗也远比EEPROM低。
引脚定义如下所示:

- /CS: 片选,低电平为激活设备
- SCK: SPI输入时钟,频率最高支持20MHZ
- /HOLD: 输入保持,比如当我们在进行读写的时候,假如产生了一个中断,由于时序已经在进行了,这时可以给个低电平让芯片保持时序,等待中断处理完成后,再来置高,继续读写数据.
- /WP: 写保护,为低电平则不能写操作
- SI、SO: SPI输入输出数据引脚
指令如下所示:

2.1 状态寄存器(0x01)介绍
状态寄存器的每个bit位意义如下所示:

其中BP1和BP0是设置写保护区域的.如下图所示:

我们必须将BP1和BP0设置为0,才可以有写所有地址的权限.
2.2 写寄存器(0x06)介绍
所有对内存数组的写入都以WREN(0X06)操作码开头,下一个操作码是WRITE指令,这个操作码后面跟着一个双字节地址。地址的前5位将被忽略(最多存储2048字节),然后就可以一直写入数据.最后将CS置高则完成写操作.
3.最终代码
#include<stdio.h>
#include <cstring>
#include<wiringPi.h>
#include <wiringPiSPI.h> typedef unsigned char u8;
typedef unsigned short u16; #define FM25CL16_WREN 0x06 // 写使能
#define FM25CL16_WRITE 0x02 // 写寄存器
#define FM25CL16_READ 0x03 // 读寄存器
#define FM25CL64_WRSR 0x01 // 状态寄存器
#define FM25L16_CSPIN 21 // 片选引脚 void initSPI()
{
//初始化所用到的IO引脚
pinMode(FM25L16_CSPIN, OUTPUT);
digitalWrite(FM25L16_CSPIN, HIGH); //初始化SPI通道0,并设置为速度
if(wiringPiSPISetup(0,5000000)==-1) {
printf("init spi failed!\n");
}
} // 片选
void fm25l16Cs(u8 select)
{
if (select == 0) {
digitalWrite(FM25L16_CSPIN, LOW);
} else {
digitalWrite(FM25L16_CSPIN, HIGH);
}
} // 向FLASH写入一个字节数据
static u8 fm25l16WriteByte(u8 Temp)
{
return wiringPiSPIDataRW(0,&Temp,1);
} // FLASH写使能
static void fm25l16WriteEnable()
{
fm25l16Cs(0);
fm25l16WriteByte(FM25CL16_WREN);
fm25l16Cs(1); } // 写入一串数据
void fm25l16WriteBuff(u16 addr,u8* buff,u16 len)
{
u8 buffHead[3]; // 数据头 fm25l16WriteEnable();
fm25l16Cs(0);
buffHead[0] = FM25CL16_WRITE;
buffHead[1] = (addr&0xFF00)>>8;
buffHead[2] = (addr&0x00FF);
wiringPiSPIDataRW(0,buffHead,3);
wiringPiSPIDataRW(0,buff,len);
fm25l16Cs(1);
} // 读出一串数据到buff中
void fm25l16ReadBuff(u16 addr,u8* buff,u16 len)
{
u8 buffHead[3]; // 数据头 fm25l16Cs(0);
buffHead[0] = FM25CL16_READ;
buffHead[1] = (addr&0xFF00)>>8;
buffHead[2] = (addr&0x00FF);
wiringPiSPIDataRW(0,buffHead,3);
wiringPiSPIDataRW(0,buff,len);
fm25l16Cs(1);
} // 写状态
void fm25l16Status()
{
u8 buff[2] = {FM25CL64_WRSR, 0X00};
fm25l16WriteEnable();
fm25l16Cs(0);
wiringPiSPIDataRW(0,buff,2); // 取消写保护
fm25l16Cs(1);
} int main()
{
u8 data[10];
u8 i=0;
u8 beginData = 0;
//初始化wiringPI的库函数
if(wiringPiSetup()<0) {
printf("init wiringPi error\n");
}
initSPI(); //spi的初始化
fm25l16Status(); // 写状态寄存器
while(1) {
for(i=0;i<10;i++) {
data[i] = beginData++;
}
fm25l16WriteBuff(0,data,10);
printf("write ok\n");
fm25l16ReadBuff(0,data,10);
printf("read: ");
for(i=0;i<10;i++) {
printf("%d ",data[i]);
}
printf("\n");
delay(20);
}
return 0;
}
运行效果如下所示:

树莓派4B-SPI读写flash-FM25CL16B(同时支持FM25CL64等其它系列Flash)的更多相关文章
- Linux学习 - 树莓派4b的U-Boot的初识
Linux学习 - 树莓派4b的U-Boot的初识 初识U-Boot 学习书籍:<[正点原子]I.MX6U嵌入式Linux驱动开发指南V1.5.1> 章节:第三十章 学习内容: 书中介绍u ...
- 第24章 SPI—读写串行FLASH—零死角玩转STM32-F429系列
第24章 SPI—读写串行FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...
- STM32—SPI读写FLASH
目录 FLASH简介 W25Q64 W25Q64简介 FLASH控制指令 FLASH内部存储结构 代码讲解 读取芯片ID 发送写使能信号 等待FLASH不忙 擦除扇区 写入数据 读取数据 注 FLAS ...
- SD卡spi读写流程
SD卡spi读写流程 1.SD卡的命令格式: SD卡的指令由6字节(Byte)组成,如下: Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x ...
- 树莓派4B 安装CentOS
刚入手了一个树莓派4B替换掉旧的3B搭Nas.吐槽下3B的网卡和USB速度真的太慢. 虽然官方推荐的是Debina,由于习惯了CentOS不想增加学习成本,我还是决定用CentOS. 镜像下载地址:h ...
- 树莓派4B安装docker-compose(64位Linux)
准备工作 树莓派4B已装好64位Linux,并且装好了19.03.1版本的Docker,具体的安装步骤请参考<树莓派4B安装64位Linux(不用显示器键盘鼠标)> 安装docker-co ...
- 树莓派4B踩坑指南 - (1)系统简介及特性
系统简介及特性 19年双十一入坑树莓派4B,发现不是一般的坑,对于新出来的4B,从外包装壳,到接口,到内核,很多老的资料已经不再适用,又没有什么特别大的论坛可以讨论,只能自己一点点的摸索. 所以将遇到 ...
- 树莓派4B智能小车机器套件——入手组装实验记录
树莓派4B智能小车机器套件--入手组装实验记录 4WD智能小车(4WD SMART ROBOT KIT),支持Arduino.51.STM32.Raspberry Pi等4个版本.本套件采用的是树莓派 ...
- 树莓派(4B)新手入门教程
前期准备 必要物料 树莓派4B 主机 Type-C 电源 内存卡(8G+) 一般建议一步到位64G 系统镜像 镜像写入工具 下载地址 镜像下载 官方下载地址: https://www.raspberr ...
随机推荐
- ltp循环跑
e]# cat r3.sh#!/bin/bashi=1for ((; i<=1000; i++))do/opt/ltp/runltp -s fmtmsg01 -p -l -t -l /home/ ...
- 【分布式】-- 基于Nacos、OpenFeign搭建的微服务抽奖系统后台小案例
1.项目介绍 最近入项目之前要求熟悉一下SpringCloud Nacos微服务基于Feign接口调用并整合Swagger2进行接口文档展示给前端,所以自己按照要求来编写并整合了一套基于SpringC ...
- 1130-host ... is not allowed to connect to this MySql server
解决方法: 1. 改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 ...
- 使用 Flux+Flagger+Istio+Kubernetes 实战 GitOps 云原生渐进式(金丝雀)交付
在这篇指南中,你将获得使用 Kubernetes 和 Istio 使用 GitOps 进行渐进式交付(Progressive Delivery)的实际经验. 介绍 gitops-istio GitOp ...
- CPU/GPU/TPU/NPU...XPU都是什么意思?
CPU/GPU/TPU/NPU...XPU都是什么意思? 现在这年代,技术日新月异,物联网.人工智能.深度学习等概念遍地开花,各类芯片名词GPU, TPU, NPU,DPU层出不穷......都是什么 ...
- 华为MDC软件架构
华为MDC软件架构 平台软件零层逻辑架构如下图,由基础层.功能层.应用层和服务层组成. 零层逻辑架构 从平台软件一层逻辑架构可以看出,MDC用了华为自研的越影操作系统.兼容Autosar标准的软件中间 ...
- 高动态范围(High-Dynamic Range,简称HDR)
高动态范围(High-Dynamic Range,简称HDR) 一.HDR介绍 高动态范围(High-Dynamic Range,简称HDR),又称宽动态范围技术,是在非常强烈的对比下让摄像机看到影像 ...
- 基于SKLearn的SVM模型垃圾邮件分类——代码实现及优化
一. 前言 由于最近有一个邮件分类的工作需要完成,研究了一下基于SVM的垃圾邮件分类模型.参照这位作者的思路(https://blog.csdn.net/qq_40186809/article/det ...
- .NET平台系列26:在 Windows 上安装 .NET Core/.NET5/.NET6
系列目录 [已更新最新开发文章,点击查看详细] 本文介绍如何在 Windows 上安装 .NET. .NET 由运行时和 SDK 组成. 运行时用于运行 .NET 应用,应用可能包含也可能不包 ...
- SpringBoot_登录注册
学习SpringBoot需要的前期基础 Spring(Bean容器 IOC set 构造方法 AOP) SpringMVC(GET POST Restful) 对于SpringBoot,约定大于配置 ...