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)的更多相关文章

  1. Linux学习 - 树莓派4b的U-Boot的初识

    Linux学习 - 树莓派4b的U-Boot的初识 初识U-Boot 学习书籍:<[正点原子]I.MX6U嵌入式Linux驱动开发指南V1.5.1> 章节:第三十章 学习内容: 书中介绍u ...

  2. 第24章 SPI—读写串行FLASH—零死角玩转STM32-F429系列

    第24章     SPI—读写串行FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  3. STM32—SPI读写FLASH

    目录 FLASH简介 W25Q64 W25Q64简介 FLASH控制指令 FLASH内部存储结构 代码讲解 读取芯片ID 发送写使能信号 等待FLASH不忙 擦除扇区 写入数据 读取数据 注 FLAS ...

  4. SD卡spi读写流程

    SD卡spi读写流程 1.SD卡的命令格式: SD卡的指令由6字节(Byte)组成,如下: Byte1:0 1 x x x x x x(命令号,由指令标志定义,如CMD39为100111即16进制0x ...

  5. 树莓派4B 安装CentOS

    刚入手了一个树莓派4B替换掉旧的3B搭Nas.吐槽下3B的网卡和USB速度真的太慢. 虽然官方推荐的是Debina,由于习惯了CentOS不想增加学习成本,我还是决定用CentOS. 镜像下载地址:h ...

  6. 树莓派4B安装docker-compose(64位Linux)

    准备工作 树莓派4B已装好64位Linux,并且装好了19.03.1版本的Docker,具体的安装步骤请参考<树莓派4B安装64位Linux(不用显示器键盘鼠标)> 安装docker-co ...

  7. 树莓派4B踩坑指南 - (1)系统简介及特性

    系统简介及特性 19年双十一入坑树莓派4B,发现不是一般的坑,对于新出来的4B,从外包装壳,到接口,到内核,很多老的资料已经不再适用,又没有什么特别大的论坛可以讨论,只能自己一点点的摸索. 所以将遇到 ...

  8. 树莓派4B智能小车机器套件——入手组装实验记录

    树莓派4B智能小车机器套件--入手组装实验记录 4WD智能小车(4WD SMART ROBOT KIT),支持Arduino.51.STM32.Raspberry Pi等4个版本.本套件采用的是树莓派 ...

  9. 树莓派(4B)新手入门教程

    前期准备 必要物料 树莓派4B 主机 Type-C 电源 内存卡(8G+) 一般建议一步到位64G 系统镜像 镜像写入工具 下载地址 镜像下载 官方下载地址: https://www.raspberr ...

随机推荐

  1. 强哥PHP学习笔记

    1.php的代码,必须放在.php的文件中,php代码必须写在<?php ?>之间. 2.//单行注释 /* 多行注释 */ 3.默认首页index.php index.html inde ...

  2. LTP--linux稳定性测试 linux性能测试 ltp压力测试 ltp-pan

    LTP--linux稳定性测试 linux性能测试 ltp压力测试 zhangzj1030关注14人评论33710人阅读2011-12-09 12:07:45   说明:在写这篇文章之前,本人也不曾了 ...

  3. redis 处理缓存击穿以及缓存雪崩

    缓存击穿 1. 缓存击穿简述 某一个热点数据在缓存中失效,请求穿过redis到达DB,造成DB压力过大 2. 怎么解决缓存击穿 1. 使用redis 作为分布式互斥锁(mutex lock) 实现步骤 ...

  4. 【GIS风暴】30米分辨率地表覆盖数据GlobeLand30原始数据集简介及下载地址

    数据集预览: GlobeLand30是30米空间分辨率全球地表覆盖数据,目前可供下载使用的有3年的数据:2000-2010-2020,本文主要讲述GlobeLand30的官网下载地址和数据集简介. 数 ...

  5. 出现异常org.yaml.snakeyaml.parser.ParserException: while parsing a block mapping

    这是因为yaml的配置文件格式出错导致的异常 原代码,仔细看数据源的配置没有和type的路径一致,而是下一级的目录,所以导致出错 使用shift+tab快捷键向左移动改变下就好了 最后成功运行

  6. Python+Selenium学习笔记17 - HTML测试报告

    运行少量case时 1 # coding = utf-8 2 3 from selenium import webdriver 4 import unittest 5 import time 6 fr ...

  7. javascript数组排序算法之选择排序

    前言 作为一名程序员数组的排序算法是必须要掌握的,今天来图解----选择排序 选择排序原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大) ...

  8. 无监督域对抗算法:ICCV2019论文解析

    无监督域对抗算法:ICCV2019论文解析 Drop to Adapt: Learning Discriminative Features for Unsupervised Domain Adapta ...

  9. Auto ML自动调参

    Auto ML自动调参 本文介绍Auto ML自动调参的算法介绍及操作流程. 操作步骤 登录PAI控制台. 单击左侧导航栏的实验并选择某个实验. 本文以雾霾天气预测实验为例. 在实验画布区,单击左上角 ...

  10. 蓝牙mesh网络技术的亮点

    蓝牙mesh网络技术的亮点 The highlights of Bluetooth mesh networking technology 导言 蓝牙是当今最主要的低功耗无线技术之一,对无线设备用户和开 ...