SPI协议简介
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设
备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、 LCD 等设备与 MCU 间,
要求通讯速率较高的场合。

• 标号1处, NSS信号线由高变低,是SPI通讯的起始信号。 NSS是每个从机各
自独占的信号线,当从机检在自己的NSS线检测到起始信号后,就知道自己
被主机选中了,开始准备与主机通讯。
• 在图中的标号6处, NSS信号由低变高,是SPI通讯的停止信号,表示本次通
讯结束,从机的选中状态被取消。

为什么MOSI,MISO信号线是两根交叉呢?因为这样可以在采样时传递0或者1两种选择,而选择切换时就在触发情况下进行切换(交叉处),所以spi的通讯,到底属于4种模式中的哪种模式很重要。

• CS(NSS)信号线在空闲状态为低电平时, CPOL=0;空闲状态为高电平时, CPOL=1。
• CPHA=0, MOSI和MISO数据线的有效信号在SCK的奇数边沿保持不变,数据信号将在SCK奇数边沿时被采样,在非采样时刻, MOSI和MISO的有效信号才发生切换。

• CS(NSS)信号线在空闲状态为低电平时, CPOL=0;空闲状态为高电平时, CPOL=1。
• CPHA=1, MOSI和MISO数据线的有效信号在SCK的偶数边沿保持不变,数据信号将在SCK偶数边沿时被采样,在非采样时刻, MOSI和MISO的有效信号才发生切换。

编程要点:

上面的MISO,按照正常情况来说,这个引脚应该配置为输入模式,但是在SPI引脚复用的时候,配置成输出模式,也可以接收数据。

在复用模式的时候,配置成推挽或者开漏输出,也可以对输入数据寄存器访问,这样的复用情况下,可以输出也可以输入。但是要是你想配置成输入模式也具有输出功能,那就不切实际了,没有配置输出,肯定没有输出,没有配置输入,可我外部有输入时,在复用情况下,是可以接收输入的。

还要注意与MCU通信的SPI芯片手册对于SPI模式的描述,有的直接给出了模式,有的支持好几种,有的压根就不说,要你自己去看手册的时序图并自己判断。

比如:W25Q128 和ADS1256,都是SPI通信的,但是W25Q128的芯片手册比较人性化:

直接给出了支持模式0和模式3,而且我们知道,通信速率取决于速度更慢的一方,W25Q128也给出了:

但是,TI的ADS1256可没有那么人性化:

英文文档没有介绍关于4种模式的,只有通过时序,我们可以的知道是模式一。同样,速率也不是以时钟多少兆体现的,而是

SPS:每秒采样次数,sample per second。

经过这次项目对ADS1256的调试,对spi认识更加清楚了。

接收和发送函数在同一个函数中:

SPI是全双工的,所以可以在发送的时候接收,也可以在接收的时候发送。但是,我们的通信都是先写发送,再写接收,我在想可不可以先写接收,再写发送呢?这样去想为什么是很好的学习方式,但是经过思考之后,应该是不可行的,必须先写发送再写接收,因为你要通过SPI通信,作为SPI通信发起者,应该先发送,再接收。经测试,也确实如此。(这里是我的推论,如果没有更改,证明测试之后如我预期)。

SPI—读写串行 FLASH的更多相关文章

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

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

  2. 第24章 QSPI—读写串行FLASH

    本章参考资料:<STM32F76xxx参考手册>.<STM32F76xxx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>及<S ...

  3. JEDEC标准(JESD216)S FDP对串行Flash在系统中的应用

    摘要:JEDEC标准(JESD216)Serial Flash Discoverable Parameter (SFDP)[1]是在串行Flash中建立一个可供查询的描述串行Flash功能的参数表.文 ...

  4. 玩转X-CTR100 l STM32F4 l W25Q64 SPI串行FLASH存储

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 板载FLA ...

  5. 第25章 串行FLASH文件系统FatFs—零死角玩转STM32-F429系列

    第25章     串行FLASH文件系统FatFs 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.c ...

  6. 【转载】IIC SPI UART串行总线

    一.SPISPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用. 接口SPI接口经常被称为4线串行 ...

  7. 串行FLASH文件系统FatFs---转自野火论坛

    为了支持长文件名,需要用到FATFS源码中的cc936.c的两个函数ff_convert,ff_wtoupper:这里面直接用了两个大数组(127KB)来做unicode转gbk(OEM)的对照表,这 ...

  8. 第25章 串行FLASH文件系统FatFs

    25.1  文件系统 即使读者可能不了解文件系统,读者也一定对“文件”这个概念十分熟悉.数据在PC上是以文件的形式储存在磁盘中的,这些数据的形式一般为ASCII码或二进制形式.在上一章我们已经写好了Q ...

  9. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.2)- 在串行NOR Flash XIP调试原理

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK在串行NOR Flash调试的原理. 本文是i.MXRT硬件那些事系列第二篇的续集,在第二篇首集 ...

随机推荐

  1. C语言-对一个结构体中的字段进行排序

    这是帮别人做的一个题目,好久没有接触过C语言了.有点发怵,只是似乎找回点当时学C语言,做课程设计的感觉. 题目:定义一个数组(学生结构体数组),里面包括学号.姓名.身份证和三科学生成绩.要求写一个函数 ...

  2. java数据库编程——读写LOB、可滚动和可更新的结果集、元数据

    java 数据库编程 1. 读写LOB 除了数字.字符串和日期之外,许多数据库还可以存储大对象,例如图片或其它数据.在SQL中,二进制大对象称为BLOB,字符型大对象称为CLOB. 要读取LOB,需要 ...

  3. iOS:iOS开发系列–打造自己的“美图秀秀”(中)

    来源: KenshinCui 链接:http://www.cnblogs.com/kenshincui/p/3959951.html 其他状态设置 常用的图形上下文状态设置上面基本都用到了,我们不再一 ...

  4. centos7 keepalived以及防火墙配置

    安装和配置keepalived,网上有很多资料,但是都没有提到防火墙这块,而且很多都是互相抄袭的,就算配置对了也会遇到很多问题 在查阅资料的时候配置好了keepalived,但是出现了裂脑,即两台服务 ...

  5. ISP图像调试工程师——tone Mapping(ISP)

    http://www.cnblogs.com/bigbigtree/p/3458797.html

  6. Ajax的简单总结

    1. Ajax的优势和不足 1.1 Ajax的优势 1. 不需要插件支持 Ajax不需要任何浏览器插件,就可以被绝大多数主流浏览器所支持,用户只需要允许JavaScript在浏览器上执行即可. 2. ...

  7. RDD原理与详解

    RDD详解 原文连接 http://xiguada.org/spark_rdd/ RDD(Resilient Distributed Datasets弹性分布式数据集),是spark中最重要的概念,可 ...

  8. [转] copy_to_user和copy_from_user两个函数的分析

    在内核的学习中会遇到很多挺有意思的函数,而且能沿着一个函数扯出来很多个相关的函数.copy_to_user和copy_from_user就是在进行驱动相关程序设计的时候,要经常遇到的两个函数.由于内核 ...

  9. Junit核心——测试类(TestCase)、测试集(TestSuite)、测试运行器(TestRunner)

    首先,把这三个定义简单的说明一下: 1.测试类(TestCase):一个包含一个或是多个测试的类,在Junit中就是指的是包含那些带有@Test注解的方法的类,同一样也被称作“测试用例”; 2.测试集 ...

  10. (剑指Offer)面试题37:两个链表的第一个公共结点

    题目: 输入两个链表,找出它们的第一个公共结点. 链表结点的定义如下: struct ListNode{ int val; ListNode* next; ListNode(int x):val(x) ...