zoukankan      html  css  js  c++  java
  • SPI—读写串行 FLASH

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

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

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

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

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


     

     

     

    编程要点:

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

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

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

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

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

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

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

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

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

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

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



     

  • 相关阅读:
    二叉树专题
    强化学习的几个基本概念
    LeetCode #111 二叉树的最小深度
    NC127 最长公共子串
    快速排序
    NC78 反转链表
    《合作的进化》读后总结
    Optional和Stream的map与flatMap
    最爱的小工具,谁用谁知道!
    SpringBoot应用启动过程分析
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/7111181.html
Copyright © 2011-2022 走看看