SPI协议

SPI协议网上资料比较多,但是也比较乱,当初在网上搜集的错误资料导致现在比较混乱。

SPI协议资料比较正规的是:

1.SPI的规约协议英文文档,例如《摩托罗拉spi协议规范》

2.许多IC的datasheet中关于SPI协议的介绍

下图摘自《摩托罗拉spi协议规范》:

  1. CPOL和CPHA的描述和定义



    注意画线部分的描述:第一个边沿锁存(或者叫采样),第二个边沿发送,注意,发送的是之前锁存好的。
  2. 时序图

  3. 工作模式的定义



    上图《Application Note MLX90363 Getting Started Guide》中关于SPI协议的相关介绍,可以得出SPI 模式0-3的定义

总结

  • CPHA=0,第一个跳变沿采样,第二个跳变沿传送。CPHA=1,则反之。
  • CPOL=0,表示空闲为低电平,CPOL=1,则反之
  • 模式 CPOL CPHA
    0 0 0
    1 0 1
    2 1 0
    3 1 1

    IO口模拟

    模拟的关键点主要是对采样和发送的理解,例如以模式1为例,根据前面介绍可以得知上升沿发送,下降沿采样。

    关键点:

    • 上升沿发送。需理解电平从低到高也是时间的。上升沿发送标准的是,在低电平上升至1/2高电平时进行发送,所以如果是软件模拟,必须是SCL=1后,不要有任何时延,立即拉低或拉高Data口。例图:1/2处发送
    • 下降沿采样。同理也是高电平下降至1/2除,不要有任何时延,立即读取Data口
    • 开始和结束时的设置,以Mode1为例,应该在CS有效之前拉低SCLK半个时钟,结束之后在CS无效之前拉低SCLK半个时钟。CS有效之后应延时半个时钟,CS无效之后也应延时半个时钟

    代码如下

    //-最小为10-
    #define N_Delay 20
    unsigned char SPI_Send(unsigned char Data)
    {
    int i = 0;
    unsigned char RecvByte = 0; COMM_CLK_L();
    SPI_Delay(N_Delay);
    COMM_CS_L();
    SPI_Delay(N_Delay); for (i = 0; i < 8; i++)
    {
    //-发送-
    COMM_CLK_H();
    if ((Data & 0x80) != 0)
    {
    COMM_MOSI_H();
    }
    else
    {
    COMM_MOSI_L();
    }
    Data <<= 1;
    SPI_Delay(N_Delay); //-接收-
    COMM_CLK_L();
    if (COMM_MISO_Get() != 0)
    {
    RecvByte |= 0x01 << (7 - i);
    }
    SPI_Delay(N_Delay); }
    COMM_CLK_L();
    SPI_Delay(N_Delay);
    COMM_CS_H();
    SPI_Delay(N_Delay);
    return RecvByte;
    }

    产生的波形如图:

    SPI协议及IO模拟的更多相关文章

    1. 模拟SPI协议时序

      SPI是串行外设接口总线,摩托罗拉公司开发的一种全双工,同步通信总线,有四线制和三线制. 在单片机系统应用中,单片机常常是被用来当做主机(MASTER),外围器件被当做从机(SLAVE). 所以,在以 ...

    2. 关于IO模拟时序(SPI)的注意事项

      原则:有硬件I2C.SPI时尽量用硬件操作,省去IO模拟繁琐的时序调试.但在内部资源不够时就要用IO模拟总线了. 关于短延时:模拟时序时是否需要延时要看MCU与device的相对速度.比如I2C如果4 ...

    3. FPGA作为从机与STM32进行SPI协议通信---Verilog实现 [转]

      一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

    4. [SPI]SPI协议详解

      转自:https://my.oschina.net/freeblues/blog/67400 1.SPI协议简介 1.1.SPI协议概括 SPI,是英语Serial Peripheral interf ...

    5. [SPI&I2C]I2C和SPI协议介绍

      IIC vs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身 ...

    6. SPI协议及工作原理分析

      说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

    7. SPI协议及其工作原理详解

      一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控 ...

    8. SPI协议及其工作原理浅析

      转载自:http://bbs.chinaunix.net/thread-1916003-1-1.html一.概述. SPI, Serial Perripheral Interface, 串行外围设备接 ...

    9. I2C总线协议的软件模拟实现方法

      I2C总线协议的软件模拟实现方法 在上一篇博客中已经讲过I2C总线通信协议,本文讲述I2C总线协议的软件模拟实现方法. 1. 简述 所谓的I2C总线协议的软件模拟实现方法,就是用软件控制GPIO的输入 ...

    随机推荐

    1. 08. Web大前端时代之:HTML5+CSS3入门系列~H5 Web存储

      Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html  

    2. 【Win 10应用开发】在RichEditBox中使用自定义菜单

      前面给大伙儿简单介绍了RichEditBox控件的基本用法,以及解决其中的一些小问题. 本文咱们来看看如何自定义RichEditBox控件的上下文菜单. 原理比较简单,所以先说一说原理.当RichEd ...

    3. JavaScript权威设计--JavaScript类型,值,变量(简要学习笔记三)

      1.负号是一元求反运算 如果直接给数字直接量前面添加负号可以得到他们的负值     2.JavaScript中的运算超出了最大能表示的值不会报错,会显示Infinity. 超出最小也不报错,会显示-I ...

    4. linux poll函数

      poll函数与select函数差不多 函数原型: #include <poll.h> int poll(struct pollfd fd[], nfds_t nfds, int timeo ...

    5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析

      系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与,虽然有点没有目的的学习,但还是了解了Andro ...

    6. 聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer

      跨平台是ASP.NET Core一个显著的特性,而KestrelServer是目前微软推出了唯一一个能够真正跨平台的Server.KestrelServer利用一个名为KestrelEngine的网络 ...

    7. windows下mysql 主从同步

      半路出家到Java,刚开始听说到说程序支持读写分离感觉特别高大上,也一直没接触 偶然的机会接触到了,就一定得记下来. 今天先讲讲数据库的主从同步,两个好处: 一是读写分离可以用上.比如 写操作就写到主 ...

    8. ldap部署相关,ldap双机\LAM配置管理\ldap备份还原

      前言 接之前我的文章,django+ldap+memcache实现单点登录+统一认证 就单点登录实现过程进行详细记录,ldap是一切的基础,可以把它理解成一个读强写弱的文件类型数据库,统一认证我们通过 ...

    9. <Node入门经典>读书笔记

      最近在读<Node入门经典>, 之前没有做笔记, 今天开始把看过自己又写了的代码放这里以免忘记. express var express = require('express') var ...

    10. C# 高效编程笔记2

      C# 高效编程笔记2 1.理解GetHashCode()的陷阱 (1)作用:作为基于散列集合定义键的散列值,如:HashSet<T>,Dictionary<K,V>容器等 (2 ...