一、SPI总线介绍

SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。

SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

上升沿发送、下降沿接收、高位先发送。

上升沿到来的时候,sdo上的电平将被发送到从设备的寄存器中。

下降沿到来的时候,sdi上的电平将被接收到主设备的寄存器中。

假设主机和从机初始化就绪:并且主机的sbuff=0xaa (10101010),从机的sbuff=0x55 (01010101),下面将分步对spi的8个时钟周期的数据情况演示一遍(假设上升沿发送数据)。

---------------------------------------------------

脉冲 主机sbuff 从机sbuff sdi sdo(到从设备)

---------------------------------------------------

0 00-0 10101010 01010101 0 0

---------------------------------------------------

1 0--1 0101010x 10101011 0 1

1 1--0 01010100 10101011 0 1

---------------------------------------------------

2 0--1 1010100x 01010110 1 0

2 1--0 10101001 01010110 1 0

---------------------------------------------------

3 0--1 0101001x 10101101 0 1

3 1--0 01010010 10101101 0 1

---------------------------------------------------

4 0--1 1010010x 01011010 1 0

4 1--0 10100101 01011010 1 0

---------------------------------------------------

5 0--1 0100101x 10110101 0 1

5 1--0 01001010 10110101 0 1

---------------------------------------------------

6 0--1 1001010x 01101010 1 0

6 1--0 10010101 01101010 1 0

---------------------------------------------------

7 0--1 0010101x 11010101 0 1

7 1--0 00101010 11010101 0 1

---------------------------------------------------

8 0--1 0101010x 10101010 1 0

8 1--0 01010101 10101010 1 0

全双工通讯,一次传2个字节

---------------------------------------------------

这样就完成了两个寄存器8位的交换,上面的0--1表示上升沿、1--0表示下降沿,sdi、 sdo相对于主机而言的。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在下一个8位时钟周期才把数据读回来。

SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO;用于 CPU与各种外围器件进行全双工、同步串行通讯。SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。可以同时发送和接受串行数据;可以当作主机或从及工作;提供频率可编程始终;发送结束终端标志;写冲突保护;总写竞争保护.

SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式。

SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果 CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。 SPI主模块和与之通信的外设音时钟相位和极性应该一致。

SPI时序图详解-SPI接口在模式0下输出第一位数据的时刻

SPI接口在模式0下输出第一位数据的时刻

SPI接口有四种不同的数据传输时序,取决于CPOL和CPHL这两位的组合。图1中表现了这四种时序,

时序与CPOL、CPHL的关系也可以从图中看出。

图1

CPOL是用来决定SCK时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1时,

空闲电平为高电平。CPHA是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟沿采样,CPHA=1,在每个周期的第二个时钟沿采样。

由于我使用的器件工作在模式0这种时序(CPOL=0,CPHA=0),所以将图1简化为图2,

只关注模式0的时序。

图2

我们来关注SCK的第一个时钟周期,在时钟的前沿采样数据(上升沿,第一个时钟沿),

在时钟的后沿输出数据(下降沿,第二个时钟沿)。首先来看主器件,主器件的输出口(MOSI)输出的数据bit1,在时钟的前沿被从器件采样,那主器件是在何时刻输出bit1的呢?bit1的输出时刻实际上在SCK信号有效以前,比 SCK的上升沿还要早半个时钟周期。bit1的输出时刻与SSEL信号没有关系。再来看从器件,主器件的输入口MISO同样是在时钟的前沿采样从器件输出的bit1的,那从器件又是在何时刻输出bit1的呢。从器件是在SSEL信号有效后,立即输出bit1,尽管此时SCK信号还没有起效。关于上面的主器件和从器件输出bit1位的时刻,可以从图3、4中得到验证。

图3

注意图3中,CS信号有效后(低电平有效,注意CS下降沿后发生的情况),故意用延时程序延时了一段时间,之后再向数据寄存器写入了要发送的数据,来观察主器件输出bit1情况(MOSI)可以看出,bit1(值为1)是在SCK信号有效之前的半个时钟周期的时刻开始输出的(与CS信号无关),到了SCK的第一个时钟周期的上升沿正好被从器件采样。

图4

图4中,注意看CS和MISO信号。我们可以看出,CS信号有效后,从器件立刻输出了bit1(值为1)。

通常我们进行的spi操作都是16位的。图5记录了第一个字节和第二个字节间的相互衔接的过程。第一个字节的最后一位在SCK的上升沿被采样,随后的SCK下降沿,从器件就输出了第二个字节的第一位。

二、SPI总线协议介绍(接口定义,传输时序)技术性能

SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。

时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。

2、接口定义

SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。

(1)MOSI:主器件数据输出,从器件数据输入

(2)MISO:主器件数据输入,从器件数据输出

(3)SCLK :时钟信号,由主器件产生

(4)/SS:从器件使能信号,由主器件控制

3、内部结构

4、传输时序

SPI接口在内部硬件实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。如下图所示,在SCLK的下降沿上数据改变,上升沿一位数据被存入移位寄存器。

SPI接口没有指定的流控制,没有应答机制确认是否接收到数据。

三、时序图浅析

接下来进入LCD1602使用的重点:操作时序。操作时序永远使用是任何一片IC芯片的最主要的内容。一个芯片的所有使用细节都会在它的官方器件手册上包含。所以使用一个器件事情,要充分做好的第一件事就是要把它的器件手册上有用的内容提取,掌握。介于中国目前的芯片设计能力有限,所以大部分的器件都是外国几个IC巨头比如TI、AT、MAXIM这些公司生产的,器件资料自然也是英文的多,所以,英文的基础要在阅读这些数据手册时得到提高哦。即便有中文翻译版本,还是建议看英文原版,看不懂时不妨再参考中文版,这样比较利于提高。

我们首先来看1602的引脚定义,1602的引脚是很整齐的SIP单列直插封装,所以器件手册只给出了引脚的功能数据表:

我们只需要关注以下几个管脚:

3脚:VL,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。

4脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而为电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示的字节。值得一提的是,LCD1602的数据是8位的。

5脚:R/W,读写选择端。当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。笔者认为,此脚其实用处不大,直接接地永久置为低电平也不会影响其正常工作。但是尚未经过复杂系统验证,保留此意见。

6脚:E,使能信号,其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。

7~14脚:8位并行数据口,使得对LCD1602的数据读写大为方便。

现在来看LCD1602的操作时序:

在此,我们可以先不读出它的数据的状态或者数据本身。所以只需要看两个写时序:

①当我们要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

②当我们要写入数据字,在1602上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。以下是LCD1602的时序图:

大家要慢慢学会看时序图,要知道操作一个器件的精华便蕴藏在其中,看懂看准了时序,你操控这个芯片就是非常容易的事了。1602的时序是我见过的一个最简单的时序:

1、注意时间轴,如果没有标明(其实大部分也都是不标明的),那么从左往右的方向为时间正向轴,即时间在增长。

2、上图框出并注明了看懂此图的一些常识:

(1).时序图最左边一般是某一根引脚的标识,表示此行图线体现该引脚的变化,上图分别标明了RS、R/W、E、DB0~DB7四类引脚的时序变化。

(2).有线交叉状的部分,表示电平在变化,如上所标注。

(3).应该比较容易理解,如上图右上角所示,两条平行线分别对应高低电平,也正好吻合(2)中电平变化的说法。

(4).上图下,密封的菱形部分,注意要密封,表示数据有效,Valid Data这个词也显示了这点。

3、需要十分严重注意的是,时序图里各个引脚的电平变化,基于的时间轴是一致的。一定要严格按照时间轴的增长方向来精确地观察时序图。要让器件严格的遵守时序图的变化。在类似于18B20这样的单总线器件对此要求尤为严格。

4、以上几点,并不是LCD1602的时序图所特有的,绝大部分的时序图都遵循着这样的一般规则,所以大家要慢慢的习惯于这样的规则。

也许你还注意到了上面有许多关于时间的标注,这也是个十分重要的信息,这些时间的标注表明了某些状态所要维持的最短或最长时间。因为器件的工作速度也是有限的,一般都跟不上主控芯片的速度,所以它们直接之间要有时序配合。话说现在各种处理器的主频也是疯狂增长,日后搞不好出现个双核单片机也不一定就是梦话。下面是时序参数表:

懂得估计主控芯片的指令时间,可以在官方数据手册上查到MCU的一些级别参数。比如我们现在用AVR M16做为主控芯片,外部12MHz晶振,指令周期就是一个时钟周期为(1/12MHz)us,所以至少确定了它执行一条指令的时间是us级别的。我们看到,以上给的时间参数全部是ns级别的,所以即便我们在程序里不加延时程序,也应该可以很好的配合LCD1602的时序要求了。怎么看这个表呢?很简单,我们在时序图里可以找到TR1,对应时序参数表,可以查到这个是E上升沿/下降沿时间,最大值为25ns,表示E引脚上的电平变化,必须在最大为25ns之内的时间完成。大家看是不是这个意思?

现在我来解读我对这个时序图的理解:

当要写命令字节的时候,时间由左往右,RS变为低电平,R/W变为低电平,注意看是RS的状态先变化完成。然后这时,DB0~DB7上数据进入有效阶段,接着E引脚有一个整脉冲的跳变,接着要维持时间最小值为tpw=400ns的E脉冲宽度。然后E引脚负跳变,RS电平变化,R/W电平变化。这样便是一个完整的LCD1602写命令的时序。

下面来看看CEPARK AVR开发板的1602显示部分原理图:

如你所见,KID画的这个也太能省了,就直接接1k电阻了事…….只有一点要说,就是这个解法,VL脚也就是偏压信号脚的电压就是不可调的了,即对比度固定。

作几点说明:

1、 LCD1602对写进去的数据字节呢是以ASCII码识别的,所以写进去用以显示的字符数据必须是某一个ADCII码,当然如果你不想查ASCII表的话,可以用字符来代替,即用单引号包含的字符常量。所以,也由此推出,’0’和30H(0的ASCII码)是等价的。

2、操作1602,要先对1602进行初始化,数据手册里写的比较清楚,并且对各个命令字的写入并没有先后要求。

3、 1602是有自定义字符的功能的,大家熟悉基本操作之后可以尝试自行拓展

4、在每次写完数据之后,应该要将E引脚置为低电平,为下一次E的高脉冲做准备。延伸来说,这叫释放时钟线,要养成释放时钟线的好习惯。对配合时序大有裨益。

5、可以将所要显示的字符一次定义在一个字符数组里,以调用字符数组的形式调用显示数据,这样程序会变得简洁而高效。

6、记住时序的要求,往往是对最小时间有要求,在你严格配合时序的情况下仍然的不到理想的结果时,可以尝试插入延时。这个并不违反时序的要求。况且相当多的器件手册并没有详细的讲述最小时间要求。

sip 时序图_SPI总线协议及SPI时序图详解相关推荐

  1. spi四种工作模式时序图_SPI总线协议及SPI时序图详解

    嵌入式linux QQ交流群:175159209,欢迎爱好者加入交流技术问题! SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种 ...

  2. SPI总线协议及SPI时序图详解

    转贴地址:https://www.cnblogs.com/adylee/p/5399742.html SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设 ...

  3. SPI总线协议、SPI时序图详解、GPIO模拟SPI

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

  4. UART, SPI, IIC的详解及三者的区别和联系

    1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmi ...

  5. USB CCID类协议中的APDU命令详解

    出处:http://blog.chinaunix.net/uid-29124653-id-4573075.html 原文地址:USB CCID类协议中的APDU命令详解 作者:jeffasdasd 最 ...

  6. HTTP协议之http状态码详解 300-305 重定向

    HTTP协议之http状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了.  如果 ...

  7. CAN总线显性电平和隐性电平详解

    相关文章 CAN总线简易入门教程 CAN总线显性电平和隐性电平详解 STM32的CAN总线调试经验分享 CAN 信号线 CAN 传输的两条信号线被称为 CAN_H 和CAN_L. 通电状态:CAN_H ...

  8. HTTP协议头部与Keep-Alive模式详解

    HTTP协议头部与Keep-Alive模式详解 HTTP协议头部与Keep-Alive模式详解 - 玩命写博客 - 博客频道 - CSDN.NET HTTP协议头部与Keep-Alive模式详解 20 ...

  9. SPI 读取不同长度 寄存器_SPI协议,MCP2515裸机驱动详解

    SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应用在 EEPROM,FLASH, ...

最新文章

  1. mysql 5.1 禁用innodb
  2. Accent-Insensitive, Accent Sensitive, a ã, e é 模糊查询
  3. 全球及中国医药销售外包(CSO)产业营销创新模式市场格局分析报告2022版
  4. commons-lang3:ArrayUtils
  5. 使用try_catch_finally处理流中的异常
  6. 运行快捷指令无法连接服务器失败,快捷指令打不开怎么回事?iPhone快捷指令无法载入的解决办法...
  7. 当60亿次攻击来袭,人机联合打了一场漂亮的防御战
  8. Java笔记-基于Spring Boot的SOAP双向SSL认证及WS-Security
  9. 人脸检测,微软提出用RNN代替CNN
  10. 禁止root,处理错误 sudo must be owned by uid 0
  11. OEA ORM 框架中的冗余属性设计
  12. 《STL源代码分析》---stl_stack.h读书笔记
  13. 高可用Redis(四):列表,集合与有序集合
  14. js取绝对值的两种方法
  15. 魔兽世界燃烧的远征最新服务器,进驻推荐服务器,享受《燃烧的远征》
  16. 程序员常用软件介绍--持续更新
  17. dat2img格式转换-ROM定制开发教程
  18. 计算机网络 自顶向下方法.原书第6版 - 网络层次、应用、发展
  19. 微信朋友圈附近推效果怎么样?
  20. 王牌战争文明重启服务器维修中,王牌战争:文明重启在哪下,为什么王牌战争:文明重启进不去...

热门文章

  1. WhatsApp受众画像概述
  2. excel 两组数据交点_适用于安卓,苹果手机的Excel程序
  3. 基于JavaWeb三层架构的OA管理系统
  4. 【SEO】从搜索引擎工作过程来分析如何进行搜索引擎优化
  5. 数据结构折半查找例题_数据结构查找习题及答案
  6. 最新最详细Android SDK下载安装与配置
  7. AFLNET源码分析
  8. 原生JavaScript小项目之贪吃蛇小游戏(附源代码)
  9. 【Exceptions】Flowchart is not a function / null is not an object
  10. 021-企业站:纽曼移动端微官网实战