amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 23452|回复: 38

请教马老师:SPI接口的四种模式问题

[复制链接]
发表于 2011-9-1 17:01:36 | 显示全部楼层 |阅读模式
SPI的四种模式
比如说模式0,手册上说是上升沿采样,下降沿设置。
我的理解是这是SPI输出的情况,也就是其他的器件为上升沿采样,下降沿的时候AVR设置数据。
但是对于SPI输入的情况,我有点不能理解,不知道该是怎么样的。

(原文件名:25AA040.png)


(原文件名:1.png)


(原文件名:moshi.png)


(原文件名:QQ截图未命名.png)

第一张图是EEPROM,25AA040的情况,这种情况下应该用哪种模式呢?
25AA040是我为了学习SPI接口,找的一个EEPROM,因为可以学到读和写。
请马老师赐教。谢谢
发表于 2011-9-1 20:34:06 | 显示全部楼层
spi可以考虑模式0和3,具体再看25AA040的手册,看它的时序图,不工作的时候,规定CLK处在高电平还是底电平。

如果CLK为高,那么SPI的模式3
如果CLK为低,那么SPI的模式0

SPI模式0/3都是上升沿锁存数据(采样),下降沿移出数据(设置),区别在于是先移出还是先锁存,这个也要与器件匹配。

这种普通的SPI从机接口的器件通常使用模式0,不过也有例外的。
发表于 2011-9-1 21:37:08 | 显示全部楼层
前排留名。
发表于 2011-9-1 21:48:32 | 显示全部楼层
"但是对于SPI输入的情况,我有点不能理解,不知道该是怎么样的"

the typical mode 0 implementation is that you latch data onto the mosi line, then rise sck. most mode 0 chips will then output miso right after the rising edge of sck.

so here is a typical (mode 0) sequence:

  clear sck;
  latch data onto mosi;
  rise sck;
  read data from miso;
发表于 2011-9-1 22:50:04 | 显示全部楼层
回复【3楼】millwood0
"但是对于spi输入的情况,我有点不能理解,不知道该是怎么样的"
the typical mode 0 implementation is that you latch data onto the mosi line, then rise sck. most mode 0 chips will then output miso right after the rising edge of sck.
so here is a typical (mode 0) sequence:
  clear sck;
  latch data onto mosi;
  rise sck;
  read data from miso;

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

虽然一直是这样用模式0的,但是也没仔细研究过 --!
发表于 2011-9-2 05:35:05 | 显示全部楼层
mode3 sequence:
  clear sck;
  latch data onto mosi;
  rise sck;
  read data from miso;

=============================

mode0 sequence:
  rise sck;
  read data from miso;
  clear sck;
  latch data onto mosi;


注意SPI启动前SCK的电平!
模式0/1 为低,而模式2/3为高!看LZ位的图!
尽管模式0/3都是上升沿读数据,下降沿输出数据,但先读还是先写是不一样的!
 楼主| 发表于 2011-9-2 19:31:07 | 显示全部楼层
回复【1楼】machao
-----------------------------------------------------------------------

那就是说,使用SPI接口的时候,主要就是看从器件的情况,比如说25AA040这个器件,它是上升沿锁存数据,那就选择采样在上升沿采样的模式。而25AA040空闲的时候,SCK为低电平,那就是模式0了。不知道这么理解对不对?

(原文件名:25AA040时序图.png)



还有就是,如果从时序来看的话,模式0:avr发数据,avr在下降沿的时候(第一个圈),把数据送出去,然后25AA040在上升沿(第二个圈)采样?如果是这样的话,那么对于25AA040来说,avr发出的时钟信号不是有一个时钟周期没有使用?

(原文件名:时序图.png)
 楼主| 发表于 2011-9-2 19:32:33 | 显示全部楼层
不知道我的描述能不能让马老师看懂。
发表于 2011-9-3 04:03:36 | 显示全部楼层
1。看标准SPI图:

(原文件名:QQ截图20110903034456.jpg)
    在MODE0是,SCK起始是低电平,这个时候,PSI第一个要出的数据实际已经在MOSI线上,所以第1个上升沿就可以把数据打入对方。而同时要求(对方)第1个数据已经在MISO上,第1个上升沿同时把此数据打入自己内部。
    在MODE0模式情况下,当你把数据写入SPI数据缓冲器后,其第一个准备要移出的位(0位)已经在数据线上了,所以不需要SCK下降沿,SPI工作中,SCK前7个下降沿移出的是1-7位,第8个下降沿是恢复SCK常态底电平。
    也可以这样理解,MODE0时,SCK的低电平阶段,就表示移位寄存器的移出位与MOSI线连通。

注意,这个是MODE0与MODE3的重要区别,MODE3时SCK起始为高电平,MOSI线上的数据是无效的,所以这个模式的第一个SCK电平变化下降沿是输出数据(SCK的低电平阶段,就表示移位寄存器的移出位与MOSI线连通)!而MODE0第一个SCK电平变化是上升沿打入数据(当然此时数据线上的数据必须是有效数据)
===========================================================================================================================
2。大量的参考书和教材对于SPI的解释是模糊的,不清晰,甚至是错误的。原因就是这些编写人员很少真正设计产品(稳定工作,可靠的东西),最多在慢速情况下,能送数据,功能出来就行了。而问题通常出现在高速情况下,一旦SPI工作频率高了,模式不对就非常容易出错。
   很多器件手册的描述也会经常矛盾或不完善。我帮你分析,你再仔细看手册,看我分析是否正确

(原文件名:QQ截图20110903035225.jpg)
    首先我不了解的是图中标的“MODE 0.0”和“MODE 1.1”是什么意思。看实线为MODE0.0,应该和SPI的MODE0相同匹配。长的垂直箭头线为一个字节串出完成,此时SCK为低,CS可以拉高。(mode 1.1 应该对应SPI的MODE3模式,这个器件可以与采用MODE0和MODE3工作的SPI口工作,实际是一样,不过就是数据串出在先,还是已经串出,打入在先的问题,在前面已经解释了)
    圆圈内的东西应该是多余的,由于此时CS为高,它表示SCK的任何变化都不会使器件的接口工作,但如果SCK变化了,最后还是应该停在低电平(MODE0)。从这个角度讲,圆圈中的东西也不是多余的(好的设计者,此时可以让SCK做其它的事情,比如做另外一个SPI口的SCK)

    图1-4是输出数据,如果你把这个图中的长的垂直箭头线和图1-3中的长的垂直箭头线对齐,那么就完成一个字节的输入,接着串出一个字节数据的操作了过程了。这样就是在MODE0下,通过2次SPI的操作,可以下串一个字节,并回读一个字节。

模式选对了,只是完成了第一步,那么还有一个关键是什么?是如何控制CS,因为这个信号不是SPI口所负责的,需要你自己控制!

首先,作为SPI的从器件,通常是需要先串入一个命令,比如读/写,地址等,然后根据命令,再返回有效的数据。那么关键就是这些之间的衔接问题!
比如
A/一个命令要串入3个字节,那么这3个字节的衔接过程中CS是否要拉高?
B/输入的读命令,那么与输出数据字节之间CS是否要拉高?如果不拉高的话,之间需要等待多少时间(器件执行命令需要时间)?

按SPI的标准定义,SS信号在每个字节传送后要拉高的,但AVR与多数MCU的SPI硬件接口并不真正(或可以不)控制SS脚,而是由程序员控制的。所以你必须了解25AA040的CS应该如何变化,自己写代码控制。

另外,应该还有更具体的时序,表示一个命令多个字节的下发过程,以及数据串入和串出的过程之间,信号的衔接变化。这些通常是时序图配合文字描述的。你贴的图只是一个基本的时序,手册中还应该有连续的时序,它们是基本时序的组合,你需要应该仔细看。

   由于你的器件是EEPROM,所以通常下发的命令为多字节,在整个命令下发过程中CS一直保持低。要读一个字节,应该是先下发设置地址命令,而后抬高CS,再下发读命令,接着回送数据,这个期间CS一直保持低。
====================================================================================================
另外还可以看到,图中有许多标出的时间,这些在应用中也要注意。同样的代码在同样的硬件环境下工作,如果仅是MCU的工作频率不同,SPI也可能会出问题,因为如果MCU工作频率高了,SPI的频率也会提高,如果小于图中所规定的时间,数据就会不稳定了,从器件会跟不上节拍,此时就需要调整减低MCU的SPI接口的SCK时钟频率。

所以不要看到一段代码就拿过来用,要根据具体应用做适当调整。要知道如何调整,离开了基础是不行的。

====================================================================================
够全面了吧,从底到上都给你仔细分析了。

我曾经测试过ST公司提供STM32学习板上的点阵液晶代码(原板例程),什么都不动,只把STM32的工作频率降低,点阵液晶就不正常了。最后发现是硬件上设计错误,点阵液晶采用了错误的接口模式与STM32连接。(见:关于STM32 FSMC 是否支持6800时序的深入讨论----我被搞晕了! http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3610721&bbs_page_no=1&search_mode=3&search_text=machao&bbs_id=3020)
发表于 2011-9-3 06:15:56 | 显示全部楼层
主要就是看从器件的情况,


that's right. the slave determines the mode of operations and the master just need to speak the same language to communicate with the slave.

the best approach for spi (or other low level protocols like i2c or 1wire) is to write a set of spi routines that read from and write to a spi device. this can be either software or hardware driven.

then you write your device routines that utilize the spi routines.
发表于 2011-9-3 09:27:13 | 显示全部楼层
谢谢马老师
 楼主| 发表于 2011-9-3 16:16:55 | 显示全部楼层
回复【8楼】machao
-----------------------------------------------------------------------

马老师分析得很透彻!佩服马老师对学术的认真态度!!!
谢谢马老师!
发表于 2011-9-3 21:23:42 | 显示全部楼层
回复【11楼】RUANJI
回复【8楼】machao  
-----------------------------------------------------------------------
马老师分析得很透彻!佩服马老师对学术的认真态度!!!
谢谢马老师!
-----------------------------------------------------------------------

这个不是学术问题,是技术问题。现在“学术”通常不需要认真,但是技术需要认真对待,否则会出人命的。
发表于 2011-9-24 12:56:46 | 显示全部楼层
建议马老师将这个帖子置顶或者cool,我学SPI的时候也是糊里糊涂的,资料上讲的都不太清楚,猜得一塌糊涂。
马老师解释的太经典了。
发表于 2011-10-14 20:17:22 | 显示全部楼层
分析的太好了
发表于 2011-10-14 20:55:36 | 显示全部楼层
SPI接口的四种模式问题!!!
发表于 2011-10-15 16:36:20 | 显示全部楼层
mark
发表于 2011-10-21 16:29:15 | 显示全部楼层
学习了
头像被屏蔽
发表于 2011-12-20 14:10:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2012-5-14 22:35:55 | 显示全部楼层
还是马老师对spi的解释精细些
发表于 2012-6-20 16:30:10 | 显示全部楼层
mark,讲的很详细。
发表于 2012-7-1 18:21:06 | 显示全部楼层
不错,不错,解释的很给力~
发表于 2012-7-1 22:06:48 | 显示全部楼层
其实,这个不能算成单片机的基础。
SPI接口的四种工作模式实际上在各类手册中(指英文,中文翻译的省省吧)都描述的非常清楚。
如果你看不懂的的话,说明数字逻辑电路基础不扎实,尤其是时序逻辑电路。

归根结底,基础知识和理论的缺乏是造成学习单片机困难的重要原因之一。
发表于 2012-10-31 23:14:05 | 显示全部楼层
做下笔记
发表于 2012-11-28 23:02:55 | 显示全部楼层
留着
发表于 2012-12-10 21:20:02 | 显示全部楼层
佩服马老师讲的这么详细,其他资料上都含含糊糊的,正在做GPIO模拟SPI···················不懂还需要问马老师啊
发表于 2013-1-14 13:39:37 | 显示全部楼层
通俗易懂,详实明确!
发表于 2013-8-14 17:12:40 | 显示全部楼层
machao 发表于 2011-9-3 04:03
1。看标准SPI图:

(原文件名:QQ截图20110903034456.jpg)

太感谢马老师了,一直没搞明白如何配置SPI模式,今天终于懂了,泪流满面……
发表于 2014-4-17 08:50:50 | 显示全部楼层
machao 发表于 2011-9-1 20:34
spi可以考虑模式0和3,具体再看25AA040的手册,看它的时序图,不工作的时候,规定CLK处在高电平还是底电平 ...

说的非常好,一看就明白
发表于 2014-6-25 07:21:32 | 显示全部楼层
谢谢马老师,受益啊
发表于 2014-8-30 15:15:52 | 显示全部楼层
受益者   
发表于 2014-11-30 21:43:20 | 显示全部楼层
mark  one  more
发表于 2015-1-7 11:16:06 | 显示全部楼层
RUANJI 发表于 2011-9-2 19:31
回复【1楼】machao
-----------------------------------------------------------------------

初学SPI 问个弱智的问题啊 图1-3和图1-4是25AA040的时序图对吧,那么图1-3说的是MCU向25AA040发送数据呢还是25AA040向MCU发送数据呢?
 楼主| 发表于 2015-1-7 13:41:57 | 显示全部楼层
sbk100 发表于 2015-1-7 11:16
初学SPI 问个弱智的问题啊 图1-3和图1-4是25AA040的时序图对吧,那么图1-3说的是MCU向25AA040发送数据呢 ...

SPI是双向的,发送的时候也在接受数据。
发表于 2015-1-8 12:48:48 | 显示全部楼层
RUANJI 发表于 2015-1-7 13:41
SPI是双向的,发送的时候也在接受数据。

我知道是双向全双工的 我就问图1-3里的SI是MCU的MOSI引脚还是MISO引脚?
 楼主| 发表于 2015-1-8 13:30:49 | 显示全部楼层
sbk100 发表于 2015-1-8 12:48
我知道是双向全双工的 我就问图1-3里的SI是MCU的MOSI引脚还是MISO引脚?

MOSI.

slave in.
发表于 2015-1-8 15:34:21 | 显示全部楼层
很有用啊
发表于 2015-1-25 21:32:35 | 显示全部楼层
machao 发表于 2011-9-3 04:03
1。看标准SPI图:

(原文件名:QQ截图20110903034456.jpg)

讲的很详细,记号下
发表于 2017-12-14 09:43:02 | 显示全部楼层
讲的很详细
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-18 18:18

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表